简单查询
查询一个字段
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[/code]分组函数(多行处理函数)
定义
输入多行,输出一行
分组函数在使用的时候必须先进行分组,然后才能用
如果没分组,整张表默认为一组
分组函数不能够直接使用在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
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |