- 数据准备
number | name | age | class | grade |
---|---|---|---|---|
201804001 | 刘一 | 16 | 19 | 二年级 |
201804002 | 陈二 | 19 | 18 | 一年级 |
201804003 | 张三 | 20 | 19 | 二年级 |
201804004 | 李四 | 17 | 19 | 一年级 |
201804005 | 王五 | 18 | 19 | 三年级 |
201804006 | 赵六 | 24 | 18 | 二年级 |
201804007 | 孙七 | 22 | 19 | 三年级 |
201804008 | 周八 | 21 | 19 | 二年级 |
201804009 | 吴九 | 25 | 18 | 一年级 |
201804010 | 郑十 | 23 | 19 | 一年级 |
201804011 | 小周周 | 20 | 18 | 二年级 |
201804012 | 周周周 | 21 | 19 | 三年级 |
筛选条件
- 比较运算符
等于:=
大于等于:>=
小鱼等于:<=
大于:>
小于:<
不等于:!=或<>
IS NULL
IS NOT NULL - 逻辑运算符
与:and
或:or
非:not
查找16到20岁的学生select columns from table_name where age>=16 and age<=20;
- 其他操作
排序(order by)SELECT columns FROM tb_name ORDER BY columns desc;
正序:asc(默认)倒序:desc
限制个数(limit)SELECT columns FROM tb_name LIMIT start, count ;
或LIMIT count;
去重(distinct)SELECT DISTINCT columns FROM tb_name;
模糊查询(like'%')select columns from table_name where name like '%周_';
注:%
表示任意多个字符;_
表示任意一个字符 - 范围查询
连续范围: BETWEEN a AND b
select columns from table_name where age BETWEEN 16 and 20;
间隔返回: IN
select columns from table_name where column in(X,X,X);
聚合与分组
- 常用聚合函数
统计个数:COUNT(column)select count(name) from student;
求和:SUM(column)
最大值:MAX(column)
平均值:AVG(column)
最小值:MIN(column)
列出字段全部值:GROUP_CONCAT(column)select group_concat(age) from student;
- 分组查询(group by)
Select 字段 from 表 group by 字段;select class from student group by class;
Select 字段,count(*) from 表 group by 字段;select class,count(*) from student group by class;
在分组的情况下,只能够出现分组字段和聚合字段,其他的字段没有意义,会报错! - 聚合筛选(having)
select class from student group by class,age having age>=18;
加having条件表达式,可以对输出的结果做出限制,having有分组的作用
假如说一个查询语句中同时包含了别名(as),聚合函数, where, having
select * from (select class,count(*) from student where age >=20 group by class,age having age>=21) as b;
统计年龄大于等于20岁的不同班级的学生的数量,对于统计的结果再统计年龄大于等于21的学生,把年龄相同的学生归类到一起,最后把结果命名为表b展示出来
那么他们的执行顺序是
先是执行:where
然后执行:聚合函数和别名
最后执行:having
子查询(了解)
将一个查询的结果留下来用于下一次查询 ( select 中嵌套 select )
链接查询(了解)
- 内连接(inner join)
- 无条件内连接:
无条件内连接,又名交叉连接/笛卡尔连接
第一张表种的每一项会和另一张表的每一项依次组合
Mysql> select * from student [inner] join scoren - 有条件内连接:
在无条件内链接的基础上,加上一个on子句
当连接的时候,筛选出那些有实际意义的记录来进行组合
Mysql> select * from student inner join scoren
-> on dept_id = id;
- 无条件内连接:
- 外连接({left | right} join)
- 左外连接: (以左表为基准)
两张表做连接的时候,在连接条件不匹配的时候
留下左表中的数据,而右表中的数据以NULL填充
mysql> select * from student left join department
-> on dept_id= d_id; - 右外连接: (以右表为基准)
对两张表做连接的时候,在连接条件不匹配的时候
留下右表中的数据,而左表中的数据以NULL填充
mysql> select * from student right join department
-> on dept_id= d_id;
- 左外连接: (以左表为基准)
作业
从课堂上演示的students表里面
统计出所有人数
统计出age大于18的人数
统计出学python的人数
统计出学java的age大于18的人数