敕码 发表于 2025-6-1 20:48:46

DQL(查询语句)

简单查询

查询一个字段

select 字段名 from 表名;
查询多个字段

select 字段名1,字段名2,...,字段名  from 表名;
查询全部字段

①在查询多个字段中,将所有的字段名写入
②select * from 表名;————效率低,可读性差,因为将星号转化为所有字段名需要耗费一定时间,所以在实际开发中不建议使用
给查询的列起别名

select 字段名 as/空格 别名 from 表名;
对于别名中带有空格的,或者别名是中文的,要用单引号或者双引号将别名引起来
PS:只是将显示的查询结果列名显示为别名,不修改原表的列名(select永远只有查询的功能,没有修改的功能)
在所有的数据库中,字符串统一使用单一号括起来,双引号在oracle中用不了,但是在mysql中能用
字段进行数学运算

select 字段名  数学运算式
比如 select sal *12 as ‘年薪’ from 表名
条件查询

定义

不是将表中的所有数据都查出来,而是查询出来符合条件的
格式:select ... from 表名 where 条件;
条件符号

= 等于
或者!= 不等于
< 小于
大于
>= 大于等于

between ... and ... 两个值之间,等同于 >= and 10,且B>10或者B10 and B>10 or B10且B>10,或者B10 and (B>10 or B= 60 AND score < 80 THEN '及格'      WHEN score >= 80 THEN '优秀'      ELSE '异常' END) AS REMARKFROM    TABLE分组函数(多行处理函数)

定义

输入多行,输出一行
分组函数在使用的时候必须先进行分组,然后才能用
如果没分组,整张表默认为一组
分组函数不能够直接使用在where子句中
函数

其实都不会将NULL计入
count 计数    ————NULL不计入
sum 求和     ————NULL不计入
avg 平均值    ————NULL不计入分母
max 最大值
min 最小值
分组查询

定义

在实际应用中,可能有需求,需要先进行分组,再对每一组数据进行操作
格式:select from group by
执行顺序

select ... from ... group by ... order by ...  ————执行顺序为from,where,group by,select,order by
因为select在执行时候,group by,即分组函数已经分完组了,而select xx from xx where xx>xx(max)这种,不可用,因为在执行where时还没有分组,但是在where中用到了分组函数
在一条select语句当中,如果有group by语句的话,select 后面只能跟:参加分组的字段,以及分组函数,其它的一律不能跟。————在oracle中严格这个标准,其他报错
执行顺序2

from——where——group by——having——select——order by
PS 

比如,寻找每个部门,不同职位的最高薪资
select deptno,job,max(sal)from emp group by deptho,job
这样是先按部门分组,在同一个部门中,再按职位分组
having

having 对select,查询完之后的数据可以进一步过滤

 having 和 where优先选择where,除非where实在做不了的, 比如,大于小于平均薪资
distinct

去重作用
格式:select distanct 字段... from ... ;
只能放到select 后边,表名的前边
比如select distinct xx,xx,xx...
而select xx,distinct xx ...会报错
但是可以 select count(distinct xx,xx,xx...) from...
连接查询(多表查询)

定义

从一张表单独查询叫单表查询
从多个表中联合起来查询是连接查询,从一个表中取A属性,从另一个表取B属性
分类

根据语法的年代分类:SQL92,1992年时候出现的语法
          SQL99,1999年出现的语法
          下面是SQL99的学习
根据表连接的方式分类:内连接,又分为等值连接,非等值连接,自连接————完成能够匹配上条件的数据,多张表之间没有主次关系
           外连接,又分为左外连接,右外连接————将一张表看作主表,将此表的数据全部查询出来,捎带着关联查询另一个表,有主次关系
           全连接
笛卡尔积现象

定义

当两张表进行连接查询时,没有任何条件的限制会发生的现象
最终查询结果条数,是两张表条数的乘积,这种现象叫笛卡尔积现象
匹配模式

将A表的一条记录,遍历B表另一条记录,相当于for循环的两层遍历
加上筛选条件后,匹配次数不变,仍然是两层遍历
如何避免

连接时加条件,满足这个条件的记录会被筛选出来
select a,b from A,B where A.a = B.b ;
内连接

语法

SQL92语法:select A.a,B.b from A ,B where A.a = B.b and 其他条件
缺点:结构不清晰,表的连接条件和后期进一步筛选的条件,都放到了where后面
SQL99语法:select A.a,B.b from A  join B on A.a = B.b where 其他条件
优点:表连接的条件的独立的,放在on后边,如果需要进一步的筛选,再在后边加where
PS

在join的前边有个隐藏的inner,inner代表内连接
内连接之自连接

将某一个表,改两个别名,使其可以看成两个相同的表,然后再进行内连接
外连接

语法

right outer join 右外连接
left outer join 左外连接
select A.a,B.b from A   left/right  join B on A.a = B.b;
outer同样可以省略——right join,left join,区分内外连接看是否有l eft或right
PS

主表全部打印,次表按条件打印,没有则为NULL
两张以上的表怎么连接

select ...
from a
join b
on  a和b的连接条件
 
join c
on  a和c的连接条件
join d
on  a和d的连接条件
PS:一条sql语句中,内连接和外连接可以混合,都可以出现
子查询

定义

select 语句中嵌套select语句,被嵌套的select语句称为子查询
可以出现的位置

select ..(select) ..
from ..(select)..
where ..(select)..
where中的子查询

 比如查询某字段大于其最小值的,如果先查询最小值,再查询大于最小值的,就分成两句了 ,所以可以在where中写  where sal>(select min(sal) from xx);
from中的子查询

将子查询的查询结果当作一张临时表,再从表中查
select中的子查询

了解即可
一般可以替换为连接查询

union

定义

用来连接多个表,比如select ... union select ...,就将两次查询的结果连接成了一个表
优点

union的效率高,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,但是union可以减少匹配的次数,在匹配次数的情况下,还可以完成两个结果集的拼接。
PS

union在进行结果合并时,要求两个结果集的列数相同
在MySQL中,列和列的数据类型不要求相同,但是Oracle严格要求
limit

定义

将查询结果集的一部分取出来,通常使用在分页查询
顺序

写在order by(排序)的后边,在order by之后执行,也就是,先排序,再取出前k个
格式

limit k,取出结果中前k个数据
limit m,n,从第m条开始,取n条数据,长度为n—————下标从0开始
分页

举例:每页显示3条记录
第1页:limit 0,3
第2页:limit 3,3
第3页:limit 6,3
第4页:limit 9,3
那么,每页显示pageSiz e条记录
第pageNo页:limit (pageNo-1) × pageSize,pageSize

总结

select ...
from ...
where ...
group by ...
having ...
order by ...
limit ...
执行顺序为,from——where——group by——having——select——order by——limit

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: DQL(查询语句)