数据库版本:MySQL8
一、DQL语句简介
DQL,Data Query Language,数据查询语言,用来查询数据记录。DQL语句并不会改变数据库,而是让数据库将查询结果发送结果集给客户端,返回的结果是一张虚拟表。
DQL语句完整语法格式
SELECT 要查询的列名
FROM 基本表名 # 要查询的基本表名字
WHERE 限定条件 # 条件限定语句,用来筛选符合条件的记录
GROUP BY 分组列 # 按照分组列分组,比如说按照部门列分组,分组之后一个部门是一条记录
HAVING 限定条件 # 分组之后的条件,可以按照这个条件筛选分组之后的结果
ORDER BY 排序规则 # 按照排序规则对结果集进行排序
LIMIT 开始下标,结果数量; # 显示指定条数的结果记录
二、DQL语句
1.简单查询
1.查询指定列
SELECT 列名1,列名2,...,列名n FROM 基本表名 [WHERE条件语句];
2.查询所有列
SELECT * FROM 基本表名;
2.条件查询
所谓条件查询就是按照给出的条件查询,比如说查询姓名为李小明的记录。需要用到WHERE条件语句,常用到的运算符有:=、!=、<>、<、<=、>、>= 、BETWEEN…AND 、 IN(set)、 IS NULL、AND、OR、 NOT等等。
1.AND
# 在hero表中查询occ='刺客'并且sex='男'的英雄信息;
SELECT * FROM hero WHERE occ='刺客' AND sex = '男';
2.OR
# 在hero表中查询occ='刺客'或sex='男'的英雄信息;
SELECT * FROM WHERE occ='刺客' OR sex = '男';
3.IN
# 查询ID是15,28,36的英雄信息
SELECT * FROM hero WHERE ID IN (15,28,36);
NOT IN作用与IN相反,用法相同
4.IS NULL
IS NULL用于查询数据为NULL的记录,NOT IS NULL用法与其相同
# 查询姓名为null的记录
SELECT * FROM hero WHERE name IS NULL;
5.BETWEEN…AND
BETWEEN…AND用于查询在某个连续范围内的记录,包含开始值和结束值
# 查询ID在50-80的英雄信息
SELECT * FROM hero WHERE ID BETWEEN 50 AND 80;
6.NOT
# 查询职业为刺客但不为男性的角色;
1. SELECT * FROM hero WHERE occ='刺客' AND sex NOT '男';
2. SELECT * FROM hero WHERE occ='刺客' AND sex!='男';
3. SELECT * FROM hero WHERE occ='刺客' AND sex <>'男';
3.模糊查询
模糊查询,就是通过模糊的条件查询数据,比如说查询name以'A'开头的记录。
SELECT * FROM 基本表名 WHERE 列名 LIKE '表达式' # 表达式必须是字符串形式
格式中的表达式中包含两个符号:
通配符 ’ _ ’ :代表任意一个字符
通配符 ’ % ’ :代表0-n个字符
举个例子来说,假如我们需要查询查找姓李的同学信息,那么查询条件可以设置为 “name like ‘李%’”,“李”是姓氏,放在第一位,’%'代表名字。
# 1.在hero表中查询姓李的角色信息
SELECT * FROM hero WHERE name LIKE '李%';
# 2.在hero表中name包含"天"的角色信息
SELECT * FROM hero WHERE name LIKE '%天%';
4.字段控制查询
1.去除结果集中的重复记录
有的时候我们可能会查找到重复的记录,这时候我们需要使用 DISTINCT 关键字来删除结果集中的重复记录。
SELECT DISTINCT 列名 FROM 基本表名 ;
# 查询emp表中sal所有不重复的记录
SELECT DISTINCT sal FROM emp;
2.查看两列数据之和
如果两列数据均为数值类型,那么可以查看二者的数值之和。
# 查询emp表中的sal1与sal2之和
SELECT sal1+sal2 FROM emp;
还有可能会遇到相加的两个数据中有一个null的情况,如果不进行相应处理的话结果也会变为null值,我们需要使用IFNULL()函数对null值处理。
格式:IFNULL(参数1,参数2)
作用:将出现的Null值转换为指定数值。
参数1:可能会出现Null值的列名。
参数2:Null转换的目标值。
SELECT sal+IFNULL(comm,0) FROM emp;
3.给列名添加别名
有时候查询结果中的列名会显的很不美观,我们可以给其添加别名。
SELECT 列名 [AS] 新列名 FROM 基本表名;
# AS 可以省略
SELECT sal salary FROM emp;
5.结果集排序
排序指的是针对结果集的排序,可以按照一个列的值排序,也可以按照多个列的值排序,使用的关键字均为 ORDER。
1.单列排序
SELECT * FROM 基本表名 ORDER BY 排序参照列 ASC/DESC;
示例
SELECT * FROM hero ORDER BY id DESC;
ASC :升序
DESC:降序
如果没有指定排序规则,默认为ASC。
2.多列排序
SELECT * FROM 基本表名 ORDER BY 参照列1 ASC/DESC ,参照列2 ASC,DESC,...,参照列n ASC/DESC;
示例:
SELECT * FROM hero ORDER BY id DESC,name ASC;
多列排序时,首先按照参照列1的排序规则排序,如果参照列数值相同,按照参照列2的排序规则排序,以此类推。
7.聚合函数
聚合函数用来对列数据进行运算,一共有五种。
1. COUNT(列名):统计指定列不为NULL的记录行数;
2. MAX(列名):计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
3. MIN(列名):计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
4. SUM(列名):计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
5. AVG(列名):计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
1.COUNT
1. 查询emp表中的记录数
SELECT COUNT(*) FROM emp;
2. 查询emp表中有comm值的记录数
SELECT COUNT(comm) FROM emp;
2.MAX与MIN
查询emp表中sal列的最大值与最小值
1. SELECT MAX(sal),MIN(sal) FROM emp;
3.SUM
1. 查询emp表中depno=1002的所有人的sal之和;
SELECT SUM(sal) Total FROM emp WHERE depno=1002;
4.AVG
1. 查询emp表中的sal平均值
SELECT AVG(emp) Average FROM emp ;
7.分组查询
所谓分组查询,就是将查询结果按照某个字段的值进行分类,比如说,查询每一个部门的工资总和,其中就是按照“部门”这一字段进行分组的。
1. 单列分组
SELECT 列名 FROM 基本表名 GROUP BY 分组参照列;
2. 多列分组
SELECT 列名 FROM 基本表名 GROUP BY 分组参照列1,分组参照列2,...,分组参照列n;
示例
1. 查询emp表中deptno与按照deptno分组的的sal之和的记录。
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno;
2. 统计stu表中每个班级(gradename)中男女(gender)人数。
SELECT grandname,gender,COUNT(*) FROM stu;
注意,如果DQL语句中有分组操作,那SELECT后面只能跟分组参照列以及聚合函数。
HAING关键字:用于筛选分组后的数据记录,与WHERE条件子句作用一样,但HAVING子句可以使用聚合函数,WHERE子句不能。
1. 查询emp表中的部门工资总和大于50000的部门编号以及工资总和
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal)>50000;
8.LIMIT结果显示
LIMIT作用为限制查询结果显示条数
语法格式
LIMIT 起始行数,显示条数;
示例
查询emp表中sal>2000的记录,结果从第1条开始,一共显示3条;
SELECT * FROM emp WHERE sal>2000 LIMIT 0,3;