SQL语句之查询(三)

时间:2024-04-02 19:26:35
  • 创建账务表
    CREATE TABLE zhangwu (
    id INT PRIMARY KEY AUTO_INCREMENT, – 账务ID
    name VARCHAR(200), – 账务名称
    money DOUBLE, – 金额
    );

  • 插入表记录
    INSERT INTO zhangwu(id,name,money) VALUES (1,‘吃饭支出’,247);
    INSERT INTO zhangwu(id,name,money) VALUES (2,‘工资收入’,12345);
    INSERT INTO zhangwu(id,name,money) VALUES (3,‘服装支出’,1000);
    INSERT INTO zhangwu(id,name,money) VALUES (4,‘吃饭支出’,325);
    INSERT INTO zhangwu(id,name,money) VALUES (5,‘股票收入’,8000);
    INSERT INTO zhangwu(id,name,money) VALUES (6,打麻将支出,8000);
    INSERT INTO zhangwu(id,name,money) VALUES (7,null,5000);

  • 语法
    1、查询指定字段信息
    select 字段1、字段2、…from 表名;
    例如:
    select id,name from zhangwu;
    2、查询表中所有字段
    select * from 表名;
    例如:
    select * from zhangwu;
    3、distinct 用于去除重复记录
    select distinct 字段 from 表名;
    例如:
    select distinct money from zhangwu;
    4、别名查询,使用as关键字,as可以忽略
    别名可以给表中的字段,表设置别名。当查询语句复杂时,使用别名可以极大的简便操作
    表的别名格式:
    select * from 表名 as 别名;
    或 select * from 表名 别名;
    例如:
    select * from zhangwu as zw
    或 select * from zhangwu zw;
    列的别名格式
    select 字段名 as 别名 from 表名;
    或 select 字段名 别名 from 表名;
    例如:
    select money as m from zhangwu ;

    select money m from zhangwu;

  • 我们在SQL语句中可以直接对列进行计算
    例如:将所有账务的金额+100元,并起名为later
    select name,money+100 later from zhangwu;

条件查询
where条件种类如下:
SQL语句之查询(三)
格式:
select 字段 from 表名 where 条件;
例如:
1、查询所有吃饭支出记录
select * from zhangwu where name=‘吃饭支出’;
2、查询金额大于1000的支出
select * from zhangwu where money>1000;
3、查询支出在500-5000之间的账务信息
select * from zhangwu where money >=500 and money <=5000;
或者
select * from zhangwu where money between 500 and 5000;
4、查询支出是1000或5000或3500的信息
select * from zhangwu where money=1000 or money=5000 or money= 3500;
或者
select * from zhangwu where money in(1000,3500,5000);
5、查询出账务名称包含支出的账务信息。
select * from zhangwu where name like “%支出%”;
6、查询账务名称中是五个字的账务信息
select * from zhangwu where name like"_____"
注:五个下划线_
7、查询出账务名称不为空的账务信息
select * from zhangwu where name is not null;
或者
select * from zhangwu where not(name is null);

排序查询
通过order by 语句,可以将查询出的结果进行排序,放置在select语句最后。

  • asc 升序(默认)
  • desc 降序
    格式:
    select * from 表名 order by 字段 asc;
    1、查询账务表,进行升序
    select * from zhangwu order by money asc
    2、查询账务表,进行降序
    select * from zhangwu order by money desc
    3、查询账务表,查询所有的支出,对金额降序排序,先过滤条件where查询的结果再排序
    select * from zhangwu where name like ‘%支出%’ order by name desc;

聚合函数
前面我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。

  • count:统计指定列不为NULL的记录行数;
  • sum:计算指定列的数值和,如果指定列;
  • max:计算指定列的最大值,如果指定列是字符串类型,那么sum:计算指定列的数值和,如果指定列;使用字符串类型不是数值类型,那么计算结果为0排0序运算;
  • min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  • avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
    例如:
    1、count 求和,对表中的数据的个数求和 count(列名)
    查询统计账务表中,一共有多少条数据
    select count(*)as ‘count’ from zhangwu;
    2、sum 求和,对一列中数据进行求和计算sum(列名)
    对账务表查询,对所有的金额求和计算
    select sum(money) from zhangwu;
    求和,统计所有支出的总金额
    select sum(name) from zhangwu where name like ‘%支出%’;
    3、max 函数,对某列数据,获取最大值
    select Max(money) from zhangwu;
    4、avg 函数,计算一个列所有数据的平均数
    select avg(money) from zhangwu;

分组查询

  • a: 使用格式
    * 分组查询是指使用group by字句对查询信息进行分组,
    * 例如:我们要统计出zhanguw表中所有分类账务的总数量,这时就需要使用group by 来对zhangwu表中的账务信息根据parent进行分组操作。
    * SELECT 字段1,字段2… FROM 表名 GROUP BY 字段 HAVING 条件;
    * 分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。

  • b: having与where的区别
    *having是在分组后对数据进行过滤.
    *where是在分组前对数据进行过滤
    *having后面可以使用分组函数(统计函数)
    where后面不可以使用分组函数。
    例如:
    1、/

    查询所有的数据
    吃饭支出 共计多少
    工资收入 共计多少
    服装支出 共计多少
    股票收入 共计多少
    打麻将支出 共计多少钱
    分组查询: group by 被分组的列名
    必须跟随聚合函数
    select 查询的时候,被分组的列,要出现在select 选择列的后面
    */
    SELECT SUM(zmoney),zname FROM zhangwu GROUP BY zname
    2、对zname内容进行分组查询求和,但是只要支出
    SELECT SUM(zmoney)AS ‘getsum’,zname FROM zhangwu WHERE zname LIKE’%支出%’
    GROUP BY zname
    ORDER BY getsum DESC
    3、对zname内容进行分组查询求和,但是只要支出, 显示金额大于5000
    结果集是分组查询后,再次进行筛选,不能使用where, 分组后再次过滤,关键字 having
    SELECT SUM(zmoney)AS ‘getsum’,zname FROM zhangwu WHERE zname LIKE’%支出%’
    GROUP BY zname HAVING getsum>5000