Mysql教程(五):DQL学习

Mysql教程(五):DQL学习

DQL Data Query Language 数据查询语言,用来查询数据库中表的记录

1 基本语法

DQL查询语句,语法结构如下:

sql 复制代码
SELECT
	字段列表
FROM
	表名列表
WHERE
	条件列表
GROUP BY
	分组字段列表
HAVING
	分组后条件列表
ORDER BY
	排序字段列表
LIMIT
	分页参数

分为以下几个部分:

  • 基本查询(不带任何条件)
  • 条件查询(WHERE)
  • 聚合函数(count、max、min、avg、sum)
  • 分组查询(group by)
  • 排序查询(order by)
  • 分页查询(limit)

2 基本查询

查询多个字段

sql 复制代码
SELECT 字段1, 字段2, 字段3... FROM 表名;
SQL 复制代码
SELECT * FROM 表名;

注意:*代表查询所有字,在实际开发中尽量少用(不直观,影响效率)

字段设置别名

sql 复制代码
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;

AS也可以省略:

sql 复制代码
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;

去除重复记录

sql 复制代码
SELECT DISTINCT 字段列表 FROM 表名;

案例

A. 查询指定字段 name,workno,age并返回

sql 复制代码
select name, worknum, age from empolyee;

B. 查询员工的身份证号,起别名

sql 复制代码
SELECT name, idcard '身份证号' FROM empolyee;

C. 查询员工的年龄有哪些,不重复

sql 复制代码
SELECT DISTINCT age '年龄' FROM empolyee;

3 条件查询

语法

sql 复制代码
SELECT 字段列表 FROM 表名 WHERE 条件列表;

条件

常用比较运算法

比较运算法 功能
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<> 或 != 不等于
BETWEEN ... AND ... 在某个范围之内(含最小、最大值)
IN(...) 在in之后的列表中的值,多选
LIKE 占位符 模糊匹配(_匹配单个字符, %匹配任意个字符)
IS NULL 是NULL

常用的逻辑运算符

逻辑运算符 功能
AND 或 && 并且(多个条件同时成立)
OR 或 || 或者(多个条件任意一个成立)
NOT 或 ! 非, 不是

案例

查询年龄等于21的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age=21;

查询年龄大于21的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age>21;

查询身份证号为空的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE idcard IS NULL;

查询身份证号不为空的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE idcard IS NOT NULL;

查询年龄不等于21的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age != 21;

查询年龄大于等于22并且小于等于24的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age>=22 && age<=24;

SELECT * FROM empolyee WHERE age>=22 AND age<=24;

# BETWEEN后跟的是最小值,AND后跟的是最大值,切不可写反了
SELECT * FROM empolyee WHERE age BETWEEN 22 AND 24;

查询年龄为24并且性别为女的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age=24 AND gender='女';

查询年龄为24或者21员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age=24 OR age=21;

SELECT * FROM empolyee WHERE age IN (21, 24);

查询姓名为两个字员工信息

sql 复制代码
SELECT * FROM empolyee WHERE name like '__';

查询身份证号最后一位是X的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE idcard LIKE '%X';

SELECT * FROM empolyee WHERE idcard LIKE '_________________X';

4 聚合函数

什么是聚合函数?

将一列数据作为一个整体,进行纵向计算 。

常见的聚合函数

函数 功能
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和

语法

sql 复制代码
SELECT 聚合函数(字段列表) FROM 表名 ;

注意:NULL值是不参与所有聚合函数运算的。

案例

A.统计员工数量

sql 复制代码
SELECT COUNT(*) FROM empolyee;

SELECT COUNT(idcard) FROM empolyee;

B.统计员工的平均年龄

sql 复制代码
SELECT AVG(age) FROM empolyee;

C.统计员工最大年龄

sql 复制代码
SELECT MAX(age) FROM empolyee;

D.统计员工最小年龄

sql 复制代码
SELECT MIN(age) FROM empolyee;

E.统计男员工的年龄之和

sql 复制代码
SELECT SUM(age) FROM empolyee WHERE gender = '男';

5 分组查询

语法

sql 复制代码
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];

where和having区别

  • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;
  • 而having是分组 之后对结果进行过滤。 判断条件不同:where不能对聚合函数进行判断,而having可以。

注意:

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
  • 执行顺序: where > 聚合函数 > having
  • 支持多字段分组, 具体语法为 : group by columnA,columnB

A.根据性别分组 , 统计男性员工 和 女性员工的数量

sql 复制代码
SELECT gender, COUNT(*) FROM empolyee GROUP BY gender;

B.根据性别分组 , 统计男性员工 和 女性员工的平均年龄

sql 复制代码
SELECT gender, AVG(age) FROM empolyee GROUP BY gender;

C.查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于2的工作地址

sql 复制代码
SELECT workaddress, count(*) address_count
FROM empolyee
WHERE age < 45
GROUP BY workaddress
HAVING address_count >= 2;

D.统计各个工作地址上班的男性及女性员工的数量

sql 复制代码
SELECT workaddress, gender, count(*) '数量'
FROM empolyee
GROUP BY gender , workaddress;

6 排序查询

语法

sql 复制代码
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;

排序方式

  • ASC:升序(默认值)
  • DESC:降序

注意:

如果是升序,可以不指定排序方式ASC

如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
案例:

A.根据年龄对员工进行升序排序

sql 复制代码
SELECT * FROM empolyee ORDER BY age ASC;

SELECT * FROM empolyee ORDER BY age;

B. 根据入职时间对员工进行降序排序

sql 复制代码
SELECT * FROM empolyee ORDER BY entrydate DESC;

C. 根据年龄对员工进行升序排序,如果年龄相同,按照入职时间进行降序排序

sql 复制代码
SELECT * FROM empolyee ORDER BY age ASC , entrydate DESC;

7 分页查询

语法

sql 复制代码
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;

注意事项:

  • 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
  • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
  • 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
    案例

A. 查询第1页员工数据,每页展示10条记录

sql 复制代码
SELECT * FROM empolyee LIMIT 0, 5;

SELECT * FROM empolyee LIMIT 5;

B. 查询第2页员工数据,每页展示10条记录 ------> (页码-1)*页 展示记录数

sql 复制代码
SELECT * FROM empolyee LIMIT 5, 5;

8 案例

查询年龄为20, 21, 22,23的女员工

sql 复制代码
SELECT * FROM empolyee 
WHERE gender='女' 
AND age in (20,21,22,23);

查询性别为 男,并且年龄在22-23之间的姓名为2个字的员工

sql 复制代码
SELECT * FROM empolyee 
		WHERE gender='男' 
		AND age 
		BETWEEN 22 AND 23 
		AND name LIKE '__';

查询员工年龄小于60的,男性员工和女性员工的人数

sql 复制代码
SELECT gender, COUNT(*) FROM empolyee 
						WHERE age < 60 
						GROUP BY gender;

查询年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按照入职时间降序排序

sql 复制代码
SELECT name, age FROM empolyee 
                 WHERE age <= 35 
                 ORDER BY age ASC, entrydate DESC;

查询性别为男,年龄在20-40之间以内的5个员工信息,对结果按照年龄升序排序,年龄相同按照入职时间升序排序

sql 复制代码
SELECT * FROM empolyee 
         WHERE gender='男' AND 
               age BETWEEN 20 AND 40 
         ORDER BY age ASC, entrydate DESC LIMIT 5;

9 执行顺序

相关推荐
锐策4 小时前
〔 MySQL 〕数据库基础
数据库·mysql
日月星宿~5 小时前
【MySQL】summary
数据库·mysql
希忘auto6 小时前
详解MySQL安装
java·mysql
运维佬6 小时前
在 MySQL 8.0 中,SSL 解密失败,在使用 SSL 加密连接时出现了问题
mysql·adb·ssl
Runing_WoNiu7 小时前
MySQL与Oracle对比及区别
数据库·mysql·oracle
天道有情战天下7 小时前
mysql锁机制详解
数据库·mysql
CodingBrother7 小时前
MySQL 中单列索引与联合索引分析
数据库·mysql
布川ku子8 小时前
[2024最新] java八股文实用版(附带原理)---Mysql篇
java·mysql·面试
晴天飛 雪9 小时前
Spring Boot MySQL 分库分表
spring boot·后端·mysql
yc_xym9 小时前
【MySQL】MySQL基础知识复习(上)
数据库·mysql