DQL(单表查询)
- 概述:DQL(数据查询语言),用来查询数据库中表格中的数据的
基础查询
-
语法
select 字段名1 , 字段名2 , ... , 字段名n from 表名;
如果要查询表中所有字段,则直接可以使用 * 来代替字段列表
-
示例代码
-- 查询 school 库中 student 表中所有数据 use school; select * from student; -- 查询表中所有学号 select sid from student; -- 查询表中所有姓名 select sname from student;
-
去除重复(distinct)
-- 查询表中姓名非重复的字段 select distinct sname from student;
-
计算列
- 一般可以使用四则运算计算一些列的值(注意:一般只会进行数值型的计算)
- IFNULL(表达式1 ,表达式2)
- 表达式1:意指选择的字段可能为 null
- 表达式2:意指将为 null 的字段替换成什么值
-- 数值型 + null 值 select 5 + null; -- 结果为null -- 数值型 + IFNULL(1,2) select 5 + IFNULL(NULL,0); -- 结果为5
-
起别名:给字段或者表起别名
- as:as也可以或略
-- 给字段起别名 select sid as "学号" from student; -- 给字段起别名,忽略 as select sname "姓名" from student; -- 给表格起别名 select s.`sid` from student s;
条件查询
-
where 子句后跟条件
-
运算符
运算符 作用 > 、< 、 <= 、 >= 、 = 、<>(不等号) 大小关系运算 BETWEEN…AND 处于某个范围之间 IN 集合 ISNULL NULL 值用其判断 AND 或 && 与 OR 或 || 或 NOT 或 ! 非 LIKE
_:单个任意字符 %:多个任意字符模糊查询 -
示例代码
-- 创建一个员工表 CREATE TABLE employ( id INT(11), -- 员工编号 NAME VARCHAR(40), -- 员工姓名 age INT, -- 年龄 address VARCHAR(100), -- 通讯地址 salary DOUBLE(10,2) -- 工资 ); -- 像员工表中插入数据 INSERT INTO employ VALUES(1001,"张三",15,"河南省洛阳市应天龙门",8900); INSERT INTO employ VALUES(1002,"李四",12,"北京市海淀区",8000); INSERT INTO employ VALUES(1003,"王五",19,"陕西省安康市",9000); INSERT INTO employ VALUES(1004,"马六",20,"四川省成都市",7200); INSERT INTO employ VALUES(1005,"黄七",25,"台湾省台北市",6800); INSERT INTO employ VALUES(1006,"康八",30,"河南省郑州市航空港区",10000); INSERT INTO employ VALUES(1007,"万九",20,"内蒙古自治区",NULL); -- 查询表 SELECT * FROM employ; -- 查询工资大于 8000 的员工信息 SELECT * FROM employ WHERE salary > 8000; -- 查询年龄不等于20的员工信息 SELECT * FROM employ WHERE age <> 20; -- 查询年龄在 18到30 之间的员工信息 SELECT * FROM employ WHERE age BETWEEN 18 AND 30; -- 查询年龄为 15 19 20 的员工信息 SELECT * FROM employ WHERE age IN(15,19,20); -- 查询工资为 null 的员工信息 SELECT * FROM employ WHERE ISNULL(salary); -- 查询年龄20岁,且工资是非空的员工信息 SELECT * FROM employ WHERE age = 20 AND NOT ISNULL(salary); -- 查询年龄15岁或者20岁员工信息 SELECT * FROM employ WHERE age = 15 OR age = 20; -- 查询员工地址中有省字的所有员工信息 SELECT * FROM employ WHERE address LIKE '%省%';
排序查询
-
语法
order by 排序字段1 排序方式1 , 排序字段2 排序方式2...
-
排序方式
命令 作用 ASC 升序(默认的) DESC 降序 注意:如果有多个排序条件时,当前边条件值相同时,才会判断第二条件,例如:年龄相同时,再按工资排序
-
示例代码
-- 按照工资进行升序排序 SELECT * FROM employ ORDER BY salary ASC; -- 按照年龄进行降序排序 SELECT * FROM employ ORDER BY age DESC; -- 按照年龄进行降序排序,当年龄相同时按照工资进行升序(注意:1004和1007俩个数据) SELECT * FROM employ ORDER BY age DESC , salary ASC;
聚合函数
-
概述:聚合函数将一列数据作为一个整体,进行纵向的计算
-
常见的几个聚合函数
函数名 作用 count 计算个数,一般选择非空的列 max 计算此列最大值 min 计算此列最小值 sum 计算此列和 avg 计算此列平均值 -
注意:聚合函数的计算,必须排除 NULL 值才行
- 解决方式:
- 选择不包含 NULL 值的列进行计算,一般都是主键列
- 使用 IFNULL 函数
- 解决方式:
-
示例代码
-- 查询员工的个数 SELECT COUNT(id) AS "员工个数" FROM employ; -- 查询最高工资的信息 SELECT MAX(salary) FROM employ; -- 查询最小年龄 SELECT MIN(age) FROM employ; -- 查询所有工资和 SELECT SUM(IFNULL(salary,0)) FROM employ; -- 计算员工的平均年龄 SELECT AVG(age) FROM employ;
分组查询
-
语法
group by 分组字段;
-
注意事项
- 分组之后查询的字段:分组字段、聚合函数
- where 和 having 的区别?
- where 在分组之前进行限定,如果不满足where后的条件,则不参与分组
- having 在分组之后进行限定,如果不满足having后的结果,则不会被查询出来
- where 后不可以跟聚合函数,having 后可以进行聚合函数的判断
-
示例代码
-- 根据年龄进行分组 SELECT age FROM employ GROUP BY age; -- 根据年龄进行分组,并查询相同年龄个数大于等于2的年龄 SELECT age FROM employ GROUP BY age HAVING COUNT(age) >= 2; -- 根据年龄进行分组,并查询对应年龄阶段员工的个数 SELECT age , COUNT(age) FROM employ GROUP BY age;
分页查询
-
语法
-- limit 是 MySQL 的方言 limit 开始的索引,每页查询的记录条数;
公式:开始的索引 = (当前页码 - 1) * 每页显示的条数
-
示例代码
-- 每页显示 3条数据记录 SELECT * FROM employ LIMIT 0,3; -- 第一页 SELECT * FROM employ LIMIT 3,3; -- 第二页 SELECT * FROM employ LIMIT 6,3; -- 第三页