5000年来最易看懂的MYSQL DQL语言

MYSQL 的查询语言——————DQL
一、DQL语言基本规则

①DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
②数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。查询返回的结果集是一张虚拟表。
③查询语句书写和执行顺序
书写:select -from- where- group by- having- order by-limit
执行:from - where -group by -having - select - order by-limit

二、建立数据库表格
student表


13553937-c280444f357f9707.png
student.png

score表


13553937-bb24c678d25577e2.png
score.png

三、DQL基本语法
查询关键字:SELECT
1、基本查询:
SELECT  *  FROM  student //查询student表的全部列
SELECT sno , sname FROM student //查询表格的某些列的全部信息

2、条件查询:

①select  *  from  student  where  class = 95033;
13553937-d53d29c07ed51a3f.png
1.png

其中“=”可换成 =、!=、<>(不等于)、<、<=、>、>=;等符号
“*”可换成我们想要显示的某些列

②select * from student where sno in ( 107,109);//sno等于107,109的信息
13553937-f00e8f6a2bf55f61.png
2.png

其他条件查询

select * from student where sno  BETWEEN 107 AND 109;
select * from student where sno  IS NULL;
select * from student where sno  IS  NULL  and  sno=107;
select * from student where sno  IS  NULL  or  sno=107;
select * from student where sno  IS  not  NULL;

3、模糊查询

select * from student where sname like "王%";//以王开头的姓名
13553937-eb7e4a83d303243b.png
3.png
select * from student where sname like "%王%";//sanme中含有“王”字的信息
select * from student where sname like "_";//”_”表示单个字母

4、字段控制查询

(1) 去除重复记录
SELECT DISTINCT class FROM student;
(2) 相同类型字段可做运算,列名起别名,把NULL值换为0
SELECT class+IFNULL(sno,0) AS 小名 FROM student;//别名的AS可省略


13553937-3034f431bcbf28e3.png
4.png

(3)排序查询

SELECT * FROM student ORDER BY sno asc;//升序
SELECT * FROM student ORDER BY sno desc;//降序
SELECT * FROM student ORDER BY sno  desc , class  asc;//先sno降序,sno相同再按class升序

5、聚合函数(纵向运算)
COUNT():统计指定列不为NULL的记录行数;

SELECT count(1) FROM student ;
SELECT count(1) FROM student where sno=107;

MAX():计算指定列的最大值,如果指定列是字符串类型,使用字符串排序运算;

SELECT MAX(sno) FROM student ;

MIN():计算指定列的最小值,如果指定列是字符串类型,使用字符串排序运算;

SELECT MIN(sno) FROM student ;

SUM():计算指定列的数值和,如果指定列类型不是数值类型,计算结果为0;

SLECT SUM(sno) FROM student ;

AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

SELECT AVG(sno) FROM student ;

6、分组查询
1、凡和聚合函数同时出现的列名,则一定要写在group by 之后

SELECT class, count(1) FROM student group by class ;

2、对分组后限定的HAVING 子句

SELECT class, count(1) FROM student group by class HAVING count(1) >=2;

注:having与where的区别:
1.having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
2.having后面可以使用分组函数(统计函数) where后面不可以使用分组函数。
3.WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而 HAVING是对分组后数据的约束。

7、控制行数实现分页查询
若一页行数为10;

SELECT * FROM student LIMIT 0, 9;//从0行开始到第九行结束,为第一页数据。

四、多表查询
1、合并结果集(union , union all)

SELECT* FROM student UNION SELECT * FROM student;//去除重复数据
SELECT* FROM student UNION ALL SELECT * FROM student;//不去除重复数据
注:要合并的两表的列数、列类型必须相同。

2、连接查询
2.1内连接
特点:查询结果必须满足条件

SELECT * FROM student,score WHERE student.sno=score.sno ;(方言形式,可将*换成指定列)
SELECT * FROM student INNER JOIN score ON student.sno=score.sno ;(标准形式内连接)

2.2 外连接
特点:查询结果必须满足条件
①左连接是先查询出左表(以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示 NULL。

 SELECT * FROM student LEFT OUTER JOIN score ON student.sno=score.sno ;

②右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL;

SELECT * FROM student RIGHT OUTER JOIN score ON student.sno=score.sno 

3、子查询
定义及形式:一个select语句中包含另一个完整的select语句。 子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
子查询出现的位置:
a. where后,作为条为被查询的一条件的一部分;

SELECT * FROM score WHERE degree > (SELECT degree FROM score WHERE cno='3-245' and sno=103);

b. from后,作表;

SELECT count(1)  FROM  (SELECT sno FROM score WHERE cno='3-245')  test;

test为子查询表的别名。派生表必须有自己的别名;
c. 当子查询出现在where后作为条件且子查询形式为多行单列时,还可以使用如下关键字:

1.any
SELECT * FROM score WHERE sno = any(SELECT sno FROM score WHERE cno=’3-245’);
2.all
SELECT * FROM score WHERE degree< all(SELECT degree FROM score WHERE sno=103);

DQL语言到此告一段落,欲知其他内容,请听下回分解。

猜你喜欢

转载自blog.csdn.net/weixin_34174322/article/details/87430596