sql的查询
DQL 查询
分类
单表查询
a.基础查询
1.查询特定列
2.查询所有列
b.字段控制查询
1.列起别名
2.列拼接
3.列计算
4.去除重复列
5.查询常量列
c.条件查询
d.模糊查询
e.排序
f.聚合函数
e.分组
多表查询
a.合并结果集
b.连接查询
c.子查询
sql基础查询
a.基础查询
1.查询t_student表中所有的学生的学号和姓名
/*
列 : 学号和姓名 1
表 : t_student
条件 : 无
*/
select s.sid, s.sname from t_student s;
2.查询所有列
select s.*,s.sid,s.sname from t_student s;
b.字段控制查询
1.列起别名
查询出学生表中 sid 学生编号 sname 学生姓名 sid[学生编号] sname[姓名]
select s.sid 学生编号, s.sname 学生姓名, sid "[学生编号]" from t_student s;
注意:
1.这里的as是可以省略的
2.当别名中出现特殊符号的时候,不能省略
3.列拼接查询出 学生表中 sid,sname,[sid]sname
select sid, sname, '[' || sid || ']'|| sname 信息 from t_student
3.列计算
oracle也是提供了运算符的, 算数运算符 有 + - * / 没有 % ,oracle针对求余提供了函数 mod(x,y)
select sname, sage, sage + 100, mod(sage,5) from t_student;
alter table t_student add salary number(7,2);
select sname, sage, salary*12 + 3000 全年工资 from t_student;
注意: null和任何数据进行运算结果还是为null
4.去除重复列distinct关键字
select distinct sage from t_student;
5.常量列查询
select sname, '合格' 合格率 from t_student;
注意: 常量列不存在 null 值的情况
where子句(条件查询)
where子句是按照“条件表达式”指定的条件进行查询。
条件查询相关关键字
= 、!=、<> <= < >= >
between ... and not between ... and
in 、 not in
is null 、 is not null
and
or
not
1.查询学生表中 id 为 1的学生信息
select * from t_student where sid = 1
2.查询出学生表 班级编号为 null的学生信息
select * from t_student where classid is not null;
3.查询出学生表中年龄 不等于 20的学生的信息
select * from t_student -- where sage != 20; -- where sage <> 20; -- where sage not in (20); where not sage = 20;
4.查询出年龄在20到25之间的学生 同时 学生编号 小于6的学生信息
select * from t_student where sage between 20 and 25 and sid < 6;
5.查询年龄小于 22,或者学生编号大于 4的学生信息
select * from t_student where sage < 22 or sid > 4;
模糊查询
1.查询出学生表中 所有 姓张的学生的信息
select * from t_student where sname like '%张%';
-- %张 以张结尾 包含张的 %张%
like模糊查询模式匹配
其中关于条件,SQL提供了四种匹配模式:
- % :表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
- _ : 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:
- [ ] :表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
- [^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
- 查询内容包含通配符时 由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。
group by子句(分组查询)
group by子句是按照“属性名”指定的字段进行分组。group by子句通常和count()、sum()等聚合函数一起使用。
聚合函数
mysql中五种常用的聚合函数:
- max(列名):求最大值。
- min(列名):求最小值。
- sum(列名):求和。
- avg(列名):求平均值。
- count(列名):统计记录的条数。
select count(*) from t_student; select count(sage) from t_student; select count(classid) from t_student; select count(sid) from t_student; select count(1) from t_student;
count()函数的使用:
count(*): 统计的是各个字段的数量,然后计算统计结果的最大值,效率低
count(字段): 统计的是输入字段不为null的数量
count(sid): 统计主键的字段,肯定是记录的总字段,因为主键不能为null,这种方式不灵活,如果是另外一张表,那么主键名称不一样
count(1): 给出一个常量列,然后统计常量列的记录条数,常量列不可能为null,而且这种方法灵活,不会和主键关联,开发中使用
select sum(sage) 总和 from t_student; select avg(sage) 平均值 from t_student; select max(sage) 最大值 from t_student; select min(sage) 最小值 from t_student;
聚合函数一般用于分组使用,但是也可以在聚合函数之间使用
select sum(sage),avg(sage),max(sage),min(sage) from t_student;
关于group by子句和聚合函数联合使用的三条规则:
- 如果select 子句中使用了统计函数同时没有group by 子句,那么select子句中只能出现统计函数,不能出现其他任何字段。
- 如果在select子句中使用统计函数同时有group by子句,则在select子句中只能出现统计函数和分组的字段。
- 如果select子句中使用了嵌套的统计函数,则不管是否group by子句那么select子句不能出现统计函数之外任何字段。
having子句(筛选查询)
有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出。having子句可以让我们筛选成组后的各种数据,where子句在聚合前先筛选记录,也就是说作用在group by和having子句前。而 having子句在聚合后对组记录进行筛选。
where 和 having 的区别?
where 只能够 放在 from 的后面,表示对查询的数据源进行过滤,这里的数据源可以是 一张表或者是一个结果集(子查询的结果集)
having 只能够 放在 group by 的后面, 对分组后的 数据 进行过滤
order by子句(排序查询)
按照“属性名”指定的字段进行排序。排序方式由“asc”和“desc”两个参数指出,默认是按照“asc”来排序,即升序。