目录
一、SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- 若语句过长,可以使用空格或缩进来增强可读性,且空格和缩进的个数没有限制。
- SQL语句不区分大小写,关键字建议大写。
- 注释:
- -- 单行注释
- # 单行注释
- /* */ 多行注释
二、SQL语句的分类
- DDL(Data Definition Language):数据定义语言,用来定义数据库对象(数据库,表,字段)
- DML(Data Manipulation Language):数据操作语言,用来对数据库表中的数据进行增删改
- DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录
- DCL(Data Control Language):数据控制语言,用来创建数据库用户、控制数据库的访问权限、控制对数据的增删改查操作
三、DQL语句
1、基本查询
(1)查询多个字段:SELECT 字段1,字段2,字段3...... FROM 表名;
(2)查询所有字段:SELECT * FROM 表名;
(3)设置别名:SELECT 字段1 [AS 别名1],字段2 [AS 别名2]......FROM 表名;
(4)去除重复记录:SELECT DISTINCT 字段列表 FROM 表名;
示例:先创建一张员工表:
再插入数据:
查询一下这张表看看数据插入没有:
做好以上准备,接下来演示基本查询的语法,查询指定字段 name,workno,age:
查询所有字段数据:
有没有发现这样子写很繁琐,一点也不方便?其实我们可以用 SELECT * FROM 表名; 语句来查询全部字段,会发现效果一样
查询所有员工的工作地址,起别名
起别名为工作地址:(这条语句中as是可以省略的)
查询员工的上班地址(不要重复)
因为前面插入的数据全部是北京,所有这里只返回北京一个地点。
2、条件查询(WHERE)
(1)SELECT 字段列表 FROM 表名 WHERE 条件列表;
示例:查询年龄等于 18 的员工
查询年龄小于 20的员工信息
查询没有身份证号的员工信息:select * from emp where idcard is null;
查询有身份证号的员工信息:select * from emp where idcard is not null;
查询年龄在15岁(包含)到20岁(包含)之间的员工信息:(3种)
查询性别为女且年龄小于25岁的员工信息:
查询年龄等于18或20或40的员工信息:
查询姓名为两个字的员工信息:select * from emp where name like '__';
查询身份证号最后位为X的员工信息:select * from emp where idcard like '%X';
select * from emp where idcard like '_________________X'; (前面一共17个下划线)
3、聚合函数(count max min avg sum)
聚合函数:将一列数据作为整体,进行纵向计算。
语法:SELECT 聚合函数(字段列表) FROM 表名;
注意:null值不参与所有聚合函数运算
常见的聚合函数:
- count——统计数量
- max——最大值
- min——最小值
- avg——平均值
- sum——求和
示例:
统计该企业员工数量
select count(*) from emp; //统计表的总数量
select count(id) from emp; //统计id字段的总数量
统计该企业员工的平均年龄 select avg(age) from emp;
统计该企业员工的最大年龄 select max(age) from emp;
统计该企业员工的最小年龄 select min(age) from emp;
统计北京地区员工的年龄之和 select sum(age) from emp where wordaddress='北京';
4、分组查询(GROUP BY)
语法:SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后的过滤条件];
where 和 having 的区别:
- 执行时机不同:where是在分组前对数据进行筛选,不符合条件的数据不进行后续的分组,而having是对筛选过后,已经符合条件的数据进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
执行顺序:where > 聚合函数 > having
分组后查询的字段一般为聚合函数和分组字段,查询其他字段无意义。
示例:根据性别分组,统计男性和女性的数量
根据性别分组,统计男性和女性发平均年龄
查询年龄小于20的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
5、排序查询(ORDER BY)
语法:SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
- ASC 升序(默认值)
- DESC 降序
示例:根据年龄对公司的员工进行升序排序
根据id序号对员工进行降序排序
根据年龄对员工进行升序排序,年龄相同,再按照id序号进行降序排序
6、分页查询(LIMIT)
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
(limit n,m ——可以理解为从第n条数据后面开始算起,展示m条数据)
注意:
- 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
- 分页查询是数据库的方素,不同的数据库有不同的实现,MySQL中是UMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。
示例:查询第一页数据,每页展示5条记录:
查询第二页员工数据,每页展示3条记录
四、总结
1、编写顺序
2、执行顺序
五、案例演示
要求:
1.查询年龄为20,21,22,23岁的女性员工信息。
2.查询性别为 男 ,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工。
3.统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。
4.查询所有年龄小于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
5.查询性别为男,且年龄在20-40 岁(含)以内的前2个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
先查询一下表格信息
1.查询年龄为20,21,22,23岁的女性员工信息:select * from emp where gender='女' and age in(20,21,22,23);
2.查询性别为男 ,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工:
这里查询结构为空,因为员工名字都只占用俩个字,我们可以试试姓名为俩个字的员工:
3.统计员工表中,年龄小于60岁的,男性员工和女性员工的人数:
4.查询所有年龄小于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序:
5.查询性别为男,且年龄在20-40 岁(含)以内的前2个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序:
这里查询前2个员工的信息,其实可以看成分页查询,查询第一页信息,查询记录数为2。