select 列名1, ... ,列名n from 表名
where 条件 -- 1、条件
group by 列名 -- 2、分组
having 条件 -- 3、条件
order by 列名 -- 4、排序
limit 开始,条数 -- 5、分页
select * from 表名
#多列列名使用,隔开
select 列名 from 表名
select 列名 [as] 别名,列名n [as] 别名n
#列和固定数值
select 列名+\-\*\/\%数值 from 表名
#列和列
select 列名+\-\*\/\%列名 from 表名
select concat(列名1,列名2,...)合并后列名 from 表名
select * ,'常量' 列名 from 表名
(=
,>
,<
,>=
,<=
,!=
,<>
,如果是null
,需要写为is
,is not
)
select * from 表名 where 列名=值
select * from 表名 where 列名1=值 and 列名2=值
#不同列
select * from 表名 where 列名1=值 or 列名2=值
#同一列的不同值
select * from 表名 where 列名 in (值1,值2,...)
select * from 表名 where 列名 not in (值1,值2,...)
#查询l开头的名字,任意长度
select * from 表名 where 列名 like 'l%'
#查询l开头的名字,固定长度
select * from 表名 where 列名 like 'l__'
#查询包含o的名字
select * from 表名 where 列名 like '%o%'
select * from 表名 where 列名 between 下界值 and 上界值
select * from 表名 order by 列名
select * from 表名 order by 列名 asc
select * from 表名 order by 列名 desc
select * from 表名 order by 列名1 desc,列名2 desc
#起始位置默认为0,查询不包括起始位置
select * from 表名 limit 起始位置,每页条目数
#假如要显示的页数为page,每一页条目数为size
select 查询列表
from 表
limit (page-1)*size,size;
关于某一列进行操作,和行没有关系,查询结果为一行
count() | 返回结果集中行的数目 |
---|---|
max() | 返回结果集中所有值的最大值 |
min() | 返回结果集中所有值的最小值 |
sum() | 返回结果集中所有值的总和 |
avg() | 返回结果集中所有值的平均值 |
聚合函数null值不参与运算,如果希望null值也参与那么需要**ifnull()**函数处理
select 函数名(列名) from 表名
select 分组列名,聚合函数 from 表名 group by 分组列名
#一般和聚合函数一起使用
#如,查询student表中的男女两个分组中的最大年龄和最小年龄
select ssex,max(sage),min(sage) from student group by ssex
group by后不可以使用where进行筛选,需要使用having关键字
如果能用where筛选数据的话,绝不使用having
#如,查询年龄大于11的各个年龄段的人数
select sage,count(sage) from student group by sage having sage > 11
#可以使用where就不要用having
select sage,count(sage) from student where sage > 11 group by sage
1. 将2个表的数据进行拼接,针对拼接后的重复数据 去重显示
select 列名 from 表名1 where 条件
union
select 列名 from 表名2 where 条件
2. 将2个表的数据进行拼接,针对拼接后的重复数据 不去重显示
select 列名 from 表名1 where 条件
union all
select 列名 from 表名2 where 条件
#sql92
select * from 表1,表2;
#sql99
select * from 表1 cross join 表2;
笛卡尔积组合,形成数据没有价值
select 列名 from A表
inner join B表 on 关联条件;
select 列名 from A表
left join B表 on 关联条件;
select 列名 from A表
right join B表 on 关联条件;
#查询1号课程成大于2号课程的学生id
select * from sc s1
inner join sc s2
on s1.sno=s2.sno
where s1.cno=1 and s2.cno=2 and s1.score>s2.score
select distinct 列名 from 表名;
嵌套查询,就是指一个sql语句里面还有一条sql语句
将查询的结果(可以作为值,也可以作为表),再次被sql语句使用
#查询李华老师所带课程
select * from course where tno =
(
select tno from teacher where tname = '李华'
)
#查询李华老师所带学生的信息
-- 1 获取李华老师的编号
select tno from teacher where tname = '李华'
-- 2 根据老师的编号获取所带学科的编号
select cno from course where cno in
(
select tno from teacher where tname = '李华'
)
-- 3 根据学科编号获取学生的编号
select sno from sc where cno in
(
select cno from course where cno in
(
select tno from teacher where tname = '李华'
)
)
-- 4 根据学生编号,获取学生的信息
select * from student where sno in
(
select sno from sc where cno in
(
select cno from course where cno in
(
select tno from teacher where tname = '李华'
)
)
)
#查询学生表中,年龄大于张三或tony的学生信息
select * from student where sage > any(
select sage from student where sname = '张三' or sname = 'tony'
)
#查询学生表中,年龄大于张三并且大于tony的学生信息
select * from student where sage > all(
select sage from student where sname = '张三' or sname = 'tony'
)
#查询student表中,按照年龄显示是否成年
select *,
case
when sage >= 18 then '成年'
else '未成年'
end
from student
现有数据表如下,字段分别为:主键id、姓名、城市、年龄、工资
要查询每个城市中最高工资,我们可以使用group by
select fcity,max(fsalary) from t_person GROUP BY fcity
但是如果查询每个程序中工资最高的一个人,那么就不能使用group by
了,而是要使用开窗函数
开窗函数使用格式为:聚合函数 over()
,其中over()
可以写查询条件
理解:partition by
实际上是对fcity
进行分区,每一个分区相互独立,前面的聚合函数row_number()
是对每个分区结果进行聚合计算
SELECT * from (
select fname,
fcity,
fsalary,
ROW_NUMBER() over(PARTITION by fcity order by fsalary desc) fs
from t_person
) b where b.fs = 1