MySQL数据库DQL查询语言

1.基础查询命令
(1)select+查询列表(表中的字段,常量值,表达式,函数)+from+表名:查到的是虚拟的表格,也可以查询多个字段用逗号隔开就行,查询常量比如select 100就会显示100,同样可以查询字符串常量,在mysql中不区分字符串和字符,还可以查表达式并显示的是表达式的值,查询函数会得到函数的返回值
(2)select+*+from+表名:查看表里所有字段的全部信息
(3)select+字段+as+别名:为字段取别名,这里可以省略as如果别名中有特殊符号需要用单引号或者双引号引起来,起别名若含有多个字段那么每一个字段都要分别取别名或者部分取别名,如:select name,id as 号码,sex from student,这就是一个简单的部分取别名的操作。
(4)当查询部分员工涉及的部门编号(也就是说每个部门编号只显示一遍就行了)这时候就可以用去重:select+distinct+字段+from+表名
(5)+:mysql里边的加号只能代表运算符不能连接字符串,当两个常量相加,若是字符串常量就会试图转化成数值,如果不成功就会转换成0,如果有一个常量为null那么结果就为空
在这里插入图片描述
2.条件查询命令
(1)基本语法:
select+查询列表+from+表名+where+筛选条件
(2) mysql中的条件表达式:
条件运算符:> ,<,=(表判断),!=(等同于<>),>=,<=
按逻辑:&&,||,!(在mysql他们还等同于and,or,not)
(3)按模糊查询:like,between and,in,is null
like:
SELECT * FROM WHERE +字段+ LIKE “%1%”;
代表查询在sno这个字段里含有1这个字符的所有的数据%号为通配符代表任意多个字符(包含0个),_ 也代表通配符然而只代表任意单个字符
当一些特殊符号充当要查询的字符,比如要查询数据中含_的字符那么就可以用\进行转义或者用一些其他关键字进行转义
用\:SELECT * FROM WHERE +字段+ LIKE “%\ _%”
用escape关键字:SELECT * FROM WHERE +字段+ LIKE “%$_%” escape ’ $’
这里 $ 可以用任意字符替代但是必须在escape后边指明该字符为转义字符

between and:
如果我们要从表里边查年龄大于20小于25年龄的同学信息
可以用:select * from +表名+where+年龄字段+between 20 and 25;
这里的between and是包含临界值的即包含等于20和25的情况

in:
如果想在一个字段查找相关数值的数据
比如想在一个表中查询年龄字段中年龄为13,16,24的人可以
select+ *from +表名+where+in(13,16,24)
in列表的值的类型必须要统一或兼容
in括号里不能用通配符匹配

is null:
由于一个字段可以为null但是又不能用等于号来判断null
所以这个时候就用到了is null
比如:select +*+from+表名+where+字段+is null;
除了is null还有一种方式也可
安全等于:<=>

select+*+from+表名+where+字段+<=>+null
同样存在is not null作为筛选条件,安全等于也可以判断普通的值是否相等
在这里插入图片描述

3.排序查询:
基本语法:
select+查询列表
+from+表名+
(where筛选条件)+
order+by+要排序的字段+asc(升序)|desc降序)

比如:SELECT *,IFNULL(ssalary,0)*12 “年薪” FROM 表名+where ssex=“男”
ORDER BY sage
:意思是按照年龄的升序把男性的所有信息罗列出来并附加年薪字段
如果在要排序的字段后不加任何东西则默认是升序,而且order by后边可以跟的是别名。order by后边也可跟多个字段按照第一个排序字段,然后第一个字段一样的话再按照第二个排序以此类推,各个字段的排序方式可以自定义,只需要在字段后加排序方式
在这里插入图片描述
4.分组查询:
(1分组查询基本语法
注意关键字的顺序
select+分组函数+要按某一字段分组
from+要进行分组的表
where+筛选条件
group by+要分组的字段
having+筛选条件
order by+分组后的结果集进行对应的排序

where是在原始表数据基础上进行筛选,having是对分组后的结果集进行筛选
group by,having,order by都支持别名
(2)多字段分组
分组字段后边可以跟多个字段,最终的作为分组的字段可以多个,会根据作分组的字段所属特征都相同的数据归类,进而组成结果集如果多个字段并不全是需要分组的,那么不分组的字段将为结果集服务。
在这里插入图片描述
5.连接查询(sql92标准只支持内连接):
(1)连接查询的分类
内连接:等值连接,非等值连接,自连接
外连接:左外连接,右外连接,全外连接
交叉连接
(2)笛卡尔乘积现象:
在表与表之间没有有效的连接条件的时候进行连接查询时发生的一组信息多组匹配现象
(3)内连接之等值连接(sql92版本):
会将不同的表的字段按照要查询的条件连接成一个表
select+要连接成一个表的字段
from+要进行分组的表
where+多表连接避免发生笛卡尔乘积的条件加其他筛选条件
group by+要分组的字段
having+筛选条件
order by+分组后的结果集进行对应的排序

eg:
SELECT sname,salary
from 1915925426student,money
where
1915925426student.sno=money.id
这里sname是1915925426student表里的字段
salary是money表里的字段
为了让他们不发生笛卡尔乘积现象而对两个表进行有效的连接条件sno和id
这里的where就是连接两个不同表中两个字段的条件
多表查询的表的顺序没有要求,一般最好起上别名
(4)内连接之非等值连接(sql92版本):
适用例子:有一个学生数学成绩表和等级规划表(在多少分范围类是什么等级),想统计各学生的成绩等级
就有:
select 数学成绩,等级
from 两表
where 数学成绩大于等级左范围小于成绩右范围

成绩左右范围是字段代表的含义并不是确切的某一个范围,系统自动匹配满足条件的等级然后连接成表
(5)内连接之自连结(sql92版本):
例子:一张员工表里边有员工编号和领导所对应编号,那么如果要查找员工的名字和它领导的名字就会有
select a.name,b.name
from 员工表 a,员工表 b
where a.编号=b.领导编号

这里一张表看成了两张表,但是必须给这两张表起别名,不然就会产生歧义必须以这种格式来写
(6)内连接之等值连接(sql99版本)(非等值,类连接类似)
首先介绍sql99的基本语法
select+查询列表
from 表1 (别名)
(inner)join 表2 (别名)
on+连接条件
(where)
(group by)
(having)
(order by)

与sql2语法不同的是两个表之间用join隔开,而且和sql92不同的还有sql92语法是把连接条件和其他筛选条件都放在where中,而sql99这是把连接条件放在on后,其他筛选条件放在where后

多表等值连接
这里有
select+查询链表
from 表1 (别名)
(inner) join 表2 (别名)
on+连接条件
(inner) join 表3 (别名)
on+连接条件
(inner) join 表4 (别名)
on+连接条件
+

+
(where)
(group by)
(having)
(order by)

每加一个表有一个join on 语句,这里要保证前n个表和第n+1个有连接条件
(7)外连接(分左右外连接):
应用场景:外连接适用于一个表有另一个表没有的记录
特点:
外连接会查询结果为主表所有的记录(主表)
如果其他表(从表)没有和其匹配的那么会显示null
左外连接基本语法:
SELECT 查询链表
FROM 主表(所以的记录都会显示) (别名)
LEFT (OUTER) JOIN
+从表 (别名)
ON
连接条件

右外连接基本语法:
SELECT 查询列表
FROM 从表 (别名)
RIGHT (OUTER) JOIN
主表 (别名)
on
连接条件

也可以在后边再筛选分组等等操作
(8)全外连接
mysql不支持这种连接
就是两表互为主表显示所有内容,没有匹配的值就会显示null
(9)交叉连接:
就是笛卡尔乘积:
就是用sql99语法来写出一个笛卡尔乘积
在这里插入图片描述
6.子查询:
(1)子查询和主查询:
出现在其他语句中的语句称为子查询或者内查询
内部镶嵌其他select语句的查询称为外查询或主查询

(2)子查询分类:
按子查询出现的位置
select后边+(仅支持标量子查询)
from后面+(支持表子查询)
where或者having后边+(支持标量子查询列子查询行子查询)
exists后边+(表子查询)

按结果集的行列数不同:
标量子查询:(结果集只有一行一列)
列子查询:(结果集一列多行)
行子查询:(结果集一般一行多列)
表子查询:(结果集一般为多行多列)
(3)where和having后边的子查询:
标量子查询:一般搭配单行操作符使用大于小于等
应用场景:
在一个由成绩单构成的表中查询比张三总分高的人的名字:
select 姓名
from 成绩单
where 分数>(select 分数 from 成绩单 where 姓名=“张三”)

列子查询(多行子查询):一般搭配in,any(some),all
应用场景:
在一个由成绩单构成的表中查询数学为100,110,120分的人的名字
select+姓名
from+成绩单
where 数学 in(110,120,100);

in代表等于其中一个条件就成立,any代表只要符合其中一个参数就成立,all代表满足所有参数条件才成立

行子查询(一行多列,或者多行多列):
应用场景:
在一张职工信息表里查询职工编号最小工资最高的员工的所有信息:
select *
from 员工信息表
while(员工编号,工资)=(select min(员工编号),max(工资) from 员工工资表)

这种查询必须要=各字段有相同的判断符号,这里的员工编号和工资高都用的是等于,换做其他的就不行

(4)select后边的子查询:
后边只跟标量子查询
应用场景:
比如在一个成绩单所构成的表想要统计出每个学生的数学成绩在班里有多少人和他一样高
== select+姓名+(select count(*) from 成绩表 a where a.数学=b.数学)
from+成绩表 b==
在select的标量子查询中一般的内外两个表要有联系在例子中体现在a.数学=b.数学,要查找的东西其实在最开始就已经查询好了,即小括号里边先运行,再查询的时候直接用小括号查好的数据

(5)from后边的表子查询
即把得到的结果集充当数据源来使用
这里必须给表起别名
应用场景:
在一各由成绩单(含总分)组成的表中求一个学生的姓名和总分,再把总分所在等级表中的等级表示出来,也就是一个表三个字段一个姓名一个总分还有一个等级
select a.*,等级
from (
select 姓名,总分
from 成绩表
) a(别名)
join 等级表 b(别名)
where a.总分>b.左边界&&a<b.右边界

(6)exists后边的子查询
exists后边加表子查询就是判断真假,如果后边的表子查询结果不为空那么就返回1(真)
否则为0(假)所以一般用于判断条件中
应用场景:
在成绩表中查询总分为500分的学生的名字
select 姓名
from 成绩表 a(别名)
where exists(select * from 成绩表 where a.总分=500)

前面的都是小括号先运行,在这里小括号后运行即外查询先执行得到某一字段的值,根据这个值再用小括号匹配从而得到结果,小阔号里边查谁无所谓主要是exists判空
在这里插入图片描述

7.分页查询:
(1)
在查询最后加上limit语句
比如在一个学生成绩表里查询第十到第十九名的学生的全部信息
select *
from 学生成绩表表
limit 9,10;

索引:代表起始索引(由于是从0开始所以第10名学生应该对应索引为9)
size: 代表查询的学生个数(这里10就是查询的个数)
当然这里一般会知道size的大小,这样我们按页查询的时候size对应的索引大小为(页数-1)*size
在这里插入图片描述
8.联合查询:
关键字union
应用场景:当我们查询的信息来自多个表而且多个表之间没有直接连接关系,但查询的字段信息一致(比如两个表都查姓名性别,这样才能合成一张表,而且查询字段要对齐比如两表都查姓名性别,那么第一个select字段的顺序要和第二个select一致都是先姓名后性别或者先性别后姓名)
比如: 在员工信息表中查询年龄为20和25岁员工的所有信息
可以直接条件查询:
select *
from 员工信息表
where 年龄=20 OR 年龄=25
用联合查询等同于上边:
select +* +from 员工信息表 where 年龄=20
union
select +* +from 员工信息表 where 年龄=20

查询的字段的列数要一致,字段要对齐,在联合查询时会进行去重不想去重时在union前面加alll关键字

发布了37 篇原创文章 · 获赞 52 · 访问量 1817

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/104774852