共计 12375 个字符,预计需要花费 31 分钟才能阅读完成。
DQL(Data QueryLanguage)数据查询语言,基本结构是由 SELECT 子句,FROM 子句,WHERE 子句组成的查询块。
一、DQL 概述
1.1、什么是 DQL
DQL:数据查询语言,用于从数据库表中查询数据,并不会修改数据,只是一种显示数据的方式。由 select 语句构成。
1.2、记录查询格式
格式:select */ 字段列表 from 数据库表名 [where 条件表达式];
格式说明:
select */ 字段列表:查询完后需要展示的字段
from 数据库表名:指定要查询的数据库表
[where 条件表达式]:查询满足条件的记录
二、记录查询
2.1、简单查询
查询表中的记录和列
格式:select * from 数据库表名; | |
或 | |
select 字段名 1, 字段名 2,..., 字段名 n from 数据库表名; |
案例:
查询 student 表中的所有记录,显示所有列
# 显示所有记录 | |
mysql> select * from student; | |
+------+-----------+------------+------+ | |
| id | sname | birthday | sex | | |
+------+-----------+------------+------+ | |
| 1 | 郭德纲 | 1973-01-18 | 男 | | |
| 2 | 林志颖 | 1974-10-18 | 男 | | |
| 3 | 柳岩 | 1980-11-08 | 女 | | |
+------+-----------+------------+------+ | |
3 行于数据集 (0.01 秒) |
查询 student 表中的所有记录,显示所有姓名、性别列
# 显示所有记录, 显示列为姓名、性别 | |
mysql> select sname,sex from student; | |
+-----------+------+ | |
| sname | sex | | |
+-----------+------+ | |
| 郭德纲 | 男 | | |
| 林志颖 | 男 | | |
| 柳岩 | 女 | | |
+-----------+------+ | |
3 行于数据集 (0.01 秒) |
2.2、别名查询
别名有二种:字段别名、表别名
作用:
字段别名查询出记录显示新的名字,并不影响表的结构。
表别名取了一个新的名字,可以代替表名使用。
字段别名
格式:select 字段名 1 as 别名 1, 字段名 2 as 别名 2,..., 字段名 n as 别名 n from 数据库表名;
案例:
查询 student 表中的 sname 和 sex,以别名’姓名’和’性别’显示
mysql> select sname as 姓名,sex as 性别 from student; | |
+-----------+------+ | |
| 姓名 | 性别 | | |
+-----------+------+ | |
| 郭德纲 | 男 | | |
| 林志颖 | 男 | | |
| 柳岩 | 女 | | |
+-----------+------+ | |
3 行于数据集 (0.01 秒) |
表别名
格式:select 字段名 1 as 别名 1, 字段名 2 as 别名 2,..., 字段名 n as 别名 n from 数据库表名 as 别名;
案例:
查询 student 表中的 sname 和 sex,以别名’姓名’和’性别’显示,并为 student 表取了一个别名 s
mysql> select sname as 姓名,sex as 性别 from student as s; | |
+-----------+------+ | |
| 姓名 | 性别 | | |
+-----------+------+ | |
| 郭德纲 | 男 | | |
| 林志颖 | 男 | | |
| 柳岩 | 女 | | |
+-----------+------+ | |
3 行于数据集 (0.01 秒) |
注意:
表别名一般用于多表查询,单表查询中没有具体体现。
2.3、清除重复记录查询
格式:select distinct 字段名 from 数据库表名;
案例:
去掉性别重复的记录
去掉性别和姓名同时重复的记录
# 查看所有记录 | |
mysql> select * from student; | |
+------+-----------+------------+------+ | |
| id | sname | birthday | sex | | |
+------+-----------+------------+------+ | |
| 1 | 郭德纲 | 1973-01-18 | 男 | | |
| 2 | 林志颖 | 1974-10-18 | 男 | | |
| 3 | 柳岩 | 1980-11-08 | 女 | | |
+------+-----------+------------+------+ | |
3 行于数据集 (0.01 秒) | |
#查看 sex 不重复的记录 | |
mysql> select distinct sex from student; | |
+------+ | |
| sex | | |
+------+ | |
| 男 | | |
| 女 | | |
+------+ | |
2 行于数据集 (0.01 秒) | |
#查看 sex,sname 都不重复的记录 | |
mysql> select distinct sex,sname from student; | |
+------+-----------+ | |
| sex | sname | | |
+------+-----------+ | |
| 男 | 郭德纲 | | |
| 男 | 林志颖 | | |
| 女 | 柳岩 | | |
+------+-----------+ | |
3 行于数据集 (0.01 秒) |
2.4、运算查询
字段与固定值运算
格式:select 字段名 + 固定值 from 数据库表名;
注意:
运算的字段必须是数值型
案例:
查询 student 表中年龄减 10 岁,并显示 sname 和 age
mysql> select age-10 as age ,sname from student; | |
+-----+--------+ | |
| age | sname | | |
+-----+--------+ | |
| 37 | 郭德纲 | | |
| 36 | 林志颖 | | |
| 30 | 柳岩 | | |
+-----+--------+ | |
3 rows in set |
字段与字段运算
格式:select 字段名 + 字段名 from 数据库表名;
注意:
运算的字段必须是数值型
案例:
查询 student 表中 age 与 id 的和,并显示出来 age 和 id
mysql> select age+id,age,id | |
from student; | |
+--------+-----+----+ | |
| age+id | age | id | | |
+--------+-----+----+ | |
| 48 | 47 | 1 | | |
| 48 | 46 | 2 | | |
| 43 | 40 | 3 | | |
+--------+-----+----+ | |
3 rows in set |
三、条件查询
3.1、条件查询前准备
新建学生信息表(students)
** 字段:** 学生 ID(sid)、学生姓名 (sname)、学生性别 (sex)、学生年龄 (age)、英语成绩 (english)、数学成绩 (math)、入学时间 (entertime)、备注 (remark)
create table students( | |
sid int, | |
sname varchar(20), | |
sex varchar(2), | |
age int, | |
english double(4,1), | |
math double(4,1), | |
entertime date, | |
remark text | |
); |
记录:
insert into students values | |
(1,'张三','男',19,98.5,88,'2017-09-01','他来自四川'), | |
(2,'李四','男',20,80,88,'2017-09-01','他来自重庆'), | |
(3,'张红','女',19,86,80,'2017-09-01','他来自北京'), | |
(4,'张八','男',18,80,85,'2017-09-01','他来自天津'), | |
(5,'李三','男',19,60,88,'2017-09-01','他来自湖北'), | |
(6,'王六','女',20,50,70,'2017-09-01','他来自湖南'), | |
(7,'刘红','女',18,90,98,'2017-09-01','他来自甘肃'); |
3.2、基础比较运算符
格式:>、<、<=、>=、=、<>
注意:
在 SQL 中“<>”,表示不等于,mysql 中也可以用“!=”表示
在 SQL 中没有“==”
案例:
查询学生信息表中英语成绩大于 80 的学生信息
mysql> select * from students where english>80; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 | | |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 | | |
| 7 | 刘红 | 女 | 18 | 90.0 | 98.0 | 2017-09-01 | 他来自甘肃 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
3 行于数据集 (0.02 秒) |
查询学生信息表中英语成绩小于 80 的学生信息
mysql> select * from students where english<80; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 5 | 李三 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 | | |
| 6 | 王六 | 女 | 20 | 50.0 | 70.0 | 2017-09-01 | 他来自湖南 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
2 行于数据集 (0.01 秒) |
查询学生信息表中年龄大于等于 19 岁的学生信息
mysql> select * from students where age>=19; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 | | |
| 2 | 李四 | 男 | 20 | 80.0 | 88.0 | 2017-09-01 | 他来自重庆 | | |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 | | |
| 5 | 李三 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 | | |
| 6 | 王六 | 女 | 20 | 50.0 | 70.0 | 2017-09-01 | 他来自湖南 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
5 行于数据集 (0.01 秒) |
查询学生信息表中年龄小于等于 19 岁的学生信息
mysql> select * from students where age<=19; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 | | |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 | | |
| 4 | 张八 | 男 | 18 | 80.0 | 85.0 | 2017-09-01 | 他来自天津 | | |
| 5 | 李三 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 | | |
| 7 | 刘红 | 女 | 18 | 90.0 | 98.0 | 2017-09-01 | 他来自甘肃 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
5 行于数据集 (0.01 秒) |
查询学生信息表中数学成绩等于 88 的学生信息
mysql> select * from students where math=88; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 | | |
| 2 | 李四 | 男 | 20 | 80.0 | 88.0 | 2017-09-01 | 他来自重庆 | | |
| 5 | 李三 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
3 行于数据集 (0.02 秒) |
查询学生信息表中年龄不等于 18 岁的学生信息
mysql> select * from students where age<>18; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 | | |
| 2 | 李四 | 男 | 20 | 80.0 | 88.0 | 2017-09-01 | 他来自重庆 | | |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 | | |
| 5 | 李三 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 | | |
| 6 | 王六 | 女 | 20 | 50.0 | 70.0 | 2017-09-01 | 他来自湖南 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
5 行于数据集 (0.02 秒) |
查询学生信息表中年龄大于等于 20 岁的学生的姓名和性别
mysql> select sname,sex from students where age>=20; | |
+--------+------+ | |
| sname | sex | | |
+--------+------+ | |
| 李四 | 男 | | |
| 王六 | 女 | | |
+--------+------+ | |
2 行于数据集 (0.01 秒) |
3.3、提高比较运算符
格式:between...and... #在一定的范围内
注意:
包含头尾
案例:
查询学生信息表中英语成绩 80 到 90 岁之间的学生信息
mysql> select * from students where english between 80 and 90; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 2 | 李四 | 男 | 20 | 80.0 | 88.0 | 2017-09-01 | 他来自重庆 | | |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 | | |
| 4 | 张八 | 男 | 18 | 80.0 | 85.0 | 2017-09-01 | 他来自天津 | | |
| 7 | 刘红 | 女 | 18 | 90.0 | 98.0 | 2017-09-01 | 他来自甘肃 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
4 行于数据集 (0.01 秒) |
格式:in(值 1, 值 2..., 值 n) #表示用 n 个值相等 | |
not in(值 1, 值 2..., 值 n) #表示用 n 个值不相等 |
案例:
查询学生信息表中 sid 为 1,3,5 的信息
mysql> select * from students where sid in(1,3,5); | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 | | |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 | | |
| 5 | 李三 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
3 行于数据集 (0.01 秒) |
查询学生信息表中 sid 除了 1,3,5 的信息
mysql> select * from students where sid not in(1,3,5); | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 2 | 李四 | 男 | 20 | 80.0 | 88.0 | 2017-09-01 | 他来自重庆 | | |
| 4 | 张八 | 男 | 18 | 80.0 | 85.0 | 2017-09-01 | 他来自天津 | | |
| 6 | 王六 | 女 | 20 | 50.0 | 70.0 | 2017-09-01 | 他来自湖南 | | |
| 7 | 刘红 | 女 | 18 | 90.0 | 98.0 | 2017-09-01 | 他来自甘肃 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
4 行于数据集 (0.01 秒) |
格式:like '% 值 %' #模糊查询
注意:
mysql 通配符 | |
% : 匹配任意多个字符 | |
_:匹配一个字符 |
案例:
查询学生信息表中姓’张’的学生信息
mysql> select * from students where sname like '张 %'; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 | | |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 | | |
| 4 | 张八 | 男 | 18 | 80.0 | 85.0 | 2017-09-01 | 他来自天津 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
3 行于数据集 (0.01 秒) | |
mysql> select * from students where sname like '张'; | |
空的数据集 (0.01 秒) |
查询学生信息表中包含’红’字的学生信息
mysql> select * from students where sname like '% 红 %'; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 | | |
| 7 | 刘红 | 女 | 18 | 90.0 | 98.0 | 2017-09-01 | 他来自甘肃 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
2 行于数据集 (0.01 秒) |
查询学生信息表中姓’王’的二个字的学生信息
mysql> select * from students where sname like '王_'; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 6 | 王六 | 女 | 20 | 50.0 | 70.0 | 2017-09-01 | 他来自湖南 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
1 行于数据集 (0.01 秒) |
格式:is null | |
is not null |
注意:
不能写成:字段名 =null
案例:
查询学生信息表中 age 为 null 学生信息
查询学生信息表中 english 为 null 学生信息
mysql> select * from students where age is null; | |
+------+--------+------+------+---------+------+-----------+--------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+-----------+--------+ | |
| 8 | 王五 | 男 | NULL | NULL | NULL | NULL | NULL | | |
+------+--------+------+------+---------+------+-----------+--------+ | |
1 行于数据集 (0.01 秒) | |
mysql> select * from students where english is null; | |
+------+-----------+------+------+---------+------+-----------+--------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+-----------+------+------+---------+------+-----------+--------+ | |
| 8 | 王五 | 男 | NULL | NULL | NULL | NULL | NULL | | |
| 9 | 李老六 | 男 | 19 | NULL | NULL | NULL | NULL | | |
+------+-----------+------+------+---------+------+-----------+--------+ | |
2 行于数据集 (0.01 秒) |
查询学生信息表中 english 不为 null 学生信息
mysql> select * from students where english is not null; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 | | |
| 2 | 李四 | 男 | 20 | 80.0 | 88.0 | 2017-09-01 | 他来自重庆 | | |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 | | |
| 4 | 张八 | 男 | 18 | 80.0 | 85.0 | 2017-09-01 | 他来自天津 | | |
| 5 | 李三 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 | | |
| 6 | 王六 | 女 | 20 | 50.0 | 70.0 | 2017-09-01 | 他来自湖南 | | |
| 7 | 刘红 | 女 | 18 | 90.0 | 98.0 | 2017-09-01 | 他来自甘肃 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
7 行于数据集 (0.02 秒) |
3.4、逻辑运算符
格式:and #与,二边条件同时成立,成立 && | |
or #或,二边条件有一边成立,成立 || | |
not #非,一边条件成立,取反;一边条件不成立,取反! |
案例:
查询学生信息表中 english 大于 85 的男生的学生信息
mysql> select * from students where english>85 and sex='男'; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
1 行于数据集 (0.01 秒) |
查询学生信息表中年龄大于等于 20 岁或数学成绩大于 85 的学生信息
mysql> select * from students where age>=20 or math>85; | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 | | |
| 2 | 李四 | 男 | 20 | 80.0 | 88.0 | 2017-09-01 | 他来自重庆 | | |
| 5 | 李三 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 | | |
| 6 | 王六 | 女 | 20 | 50.0 | 70.0 | 2017-09-01 | 他来自湖南 | | |
| 7 | 刘红 | 女 | 18 | 90.0 | 98.0 | 2017-09-01 | 他来自甘肃 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
5 行于数据集 (0.01 秒) |
查询学生信息表中除了年龄大于等于 20 岁或数学成绩大于 85 的学生信息
mysql> select * from students where not (age>=20 or math>85); | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| sid | sname | sex | age | english | math | entertime | remark | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 | | |
| 4 | 张八 | 男 | 18 | 80.0 | 85.0 | 2017-09-01 | 他来自天津 | | |
+------+--------+------+------+---------+------+------------+-----------------+ | |
2 行于数据集 (0.01 秒) |
