简单查询
查询一个字段
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 <=
is null 用来查询值为空,写 = null 查不出来
is not null 查询不为空的
and 并且
or 或者
in 包含,相当于多个or(not in 不在这个范围 内)———— select device_id,gender,age,university,gpa from user_profile where university in ("复旦大学","山东大学","北京大学");
not not可以取非,主要用在is 或者in 中
and和or的优先级问题
and的优先级大于or的
如果想写 A>10,且B>10或者B<5
select 字段名 from 表名 where A>10 and B>10 or B<5 意思为,A>10且B>10,或者B<5的,将前边两个条件结合在了一起
正确写法为:select 字段名 from 表名 where A>10 and (B>10 or B<5)
将or的条件用括号括起来
如果在开发中不确定优先级,加小括号就行了
in的用法
in不是一个区间,in相当于多个or
select 字段名 from 表名 where A in(4,6,9)
表示表中A=4或者A=6或者A=9的个例
not in即,不是这几个值的,相当于 != or != or !=
模糊查询
模糊符号
like like称为模糊查询,支持%或下划线匹配
% 匹配任意个字符
下划线 一个下划线只匹配一个字符
例子
找出名字中含有o的 select name from 表名 where name like ‘%o%’
找出名字中以k结尾的 select name from 表名 where name like ‘%k’
找出名字中以z开头的 select name from 表名 where name like ‘z%’
找出名字中第二个字母是A的 select name from 表名 where name like ‘_A%’
找出名字中第三个字母是R的 select name from 表名 where name like ‘__R%’
找出名字中有下划线的 select name from 表名 where name like ‘%\_%’ 用转义字符即可,将mysql符号下划线变为字符下划线
排序
order by 关键字
单条件排序
比如 select name,id from 表名 order by id 默认是升序,例子中是将id升序查询出
降序要在by 表头后加desc,比如 select name,id from 表名 order by id desc,即可将id降序排列查出
除了默认的升序,也可以在by 表头后加上asc,即升序排列,比如select name,id from 表名 order by id asc
多条件排序
比如,按照A升序排序,如果A相同,则按照B的升序排序
select 字段名 from 表名 order by A asc,B asc;
A在前,起主导作用,如果A相同,才会启用B升序排序
根据字段的位置进行排序
select 字段名 from 表名 order by 2;
即按照表的第二列进行升序(默认是升序)排序
因为列的顺序可能会变化,所以不建议在开发中不建议这么写,只是有这个写法了解即可
条件和排序综合
select ... from ... where ... order by ...;
顺序不能变
排序总是在最后
数据处理函数
定义
数据处理函数又被称为单行处理函数
一个输入对应一个输出
与其相对的是多行处理函数(多个输入对应一个输出)
函数
lower 转换小写
upper 转换大写
substr 取子串(substr(被截取的字符串,起始下标,截取的长度)) ————比如select substr(zhaopian,5,3) as daxie from weixiugong; 是从第5个字符开始,往后取三个字符
查询首字母为A的姓名 select name from 表名 where substr(name,1,1) = 'A' ,等同于 select name from 表名 where name like ‘A%’
length 取长度——————length(字段名)
concat 字符串拼接——————concat(‘a’,‘b’),返回ab
trim 去空格
str_to_date 将字符串转换成日期
date_format 格式化日期
format 设置千分位
round 四舍五入——————round(字段名,四舍五入保留几位小数) 负数就往前继续数位数然后四舍五入
rand() 生成随机数
ifnull 可以将null转换成一个具体值——————ifnull(字段名,将null转换为几进行处理)
case..when..then..else..end 类似于if——else
SELECTSTUDENT_NAME,(CASE WHEN score < 60 THEN '不及格'WHEN score >= 60 AND score < 80 THEN '及格'WHEN score >= 80 THEN '优秀'ELSE '异常' END) AS REMARK FROMTABLE
分组函数(多行处理函数)
定义
输入多行,输出一行
分组函数在使用的时候必须先进行分组,然后才能用
如果没分组,整张表默认为一组
分组函数不能够直接使用在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