个人总结的常用SQL语句大全(清晰整洁高效)

文档教程链接: https://www.w3school.com.cn/sql/sql_func_count_ast.asp

表的基操

1. 查询操作

 select * from 表名  //所有列
 select id,name from 表名  //指定列

2.插入操作

insert into 表名 values (...) //全列插入

insert into 表名 (1,...) values(1,...) //部分列插入
demo:insert into students(name,hometown,birthday) values('黄蓉','桃花岛','2016-3-2');

insert into 表名 values(...),(...)...; //全列多行插入

insert into 表名(1,...) values(1,...),(1,...)...;//部分列多行插入

3.修改操作

update 表名 set1=1,2=2... where 条件范围
demo:update students set gender=0,hometown='北京' where id=5;

4.删除操作

delete from 表名 where 条件

5.as关键字
1.使用 as 给字段起别名/也可以通过 as 给表起别名

select id as 序号, name as 名字, gender as 性别 from students;

select s.id,s.name,s.gender from students as stu;

条件语句查询操作

where后面支持多种运算符,进行条件的处理
比较运算符 > = < 之类
逻辑运算符 and or not
模糊查询 like

`select * from students where name like '黄%' or name like '%靖'`;

范围查询 in()或者between and

select * from students where id in(1,3,8);
select * from students where (id between 3 and 8) and gender=1;

空判断 is null

select * from students where height is null;
select * from students where height is not null and gender=1;

优先级
优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符
and比or先运算,如果同时出现并希望先算or,需要结合()使用

排序操作

select * from 表名 order by1 asc|desc [,2 asc|desc,...]

Explain:
将行数据按照列1进行排序,如果某些行列1 的值相同时,则按照列2排序,以此类推
asc从小到大排列,即升序
desc从大到小排序,即降序
默认按照列值从小到大排列(即asc关键字)

Demo:
select * from students where gender=1 and is_delete=0 order by id desc
//order by是分组

面试题之查询每组第n条记录和每组前n条记录

  1. 查询每个班级成绩最高的学生及其成绩
  2. 查询每个班级成绩第二的学生及其成绩
  3. 查询每个班级总分前三的学生*
  • 查询每个班级数学成绩最高的学生及其成绩
select class_name, max(score), user_name
from t_user_score
where course_name = '数学'
group by class_name
  • 查询每个班级成绩第二的学生及其成绩
select A.id, A.user_name, A.class_name,A.score
from t_user_score as A
inner join t_user_score as B 
on A.class_name = B.class_name
and A.course_name = B.course_name 
and A.score < B.score
where A.course_name = '数学'
group by  A.class_name, A.user_name
having count(*) = 1
;
  • 查询每个班级总分前三的学生 / 类似每个部门里工资前三高的员工
SELECT t.user_name,t.class_name,t.score 
FROM t_user_score as t
where 3 >
        (SELECT COUNT(DISTINCT tt.score)
         FROM t_user_score as tt
         WHERE t.score<tt.score  and t.class_name=tt.class_name)
         ORDER BY class_name,score DESC;

分页

select * from 表名 limit start=0,count

Explain:
从start开始,获取count条数据
start默认值为0
也就是当用户需要获取数据的前n条的时候可以直接写上 xxx limit n;

Demo:
select * from students where gender=1 limit 0,3; //3行数据

聚合函数

总数
count(*) 表示计算总行数,括号中写星与列名,结果是相同的

1:查询学生总数
select count(*) from students;

最大值
max(列) 表示求此列的最大值

2:查询女生的编号最大值
select max(id) from students where gender=2;

最小值
min(列) 表示求此列的最小值

3:查询未删除的学生最小编号
select min(id) from students where is_delete=0;

求和
sum(列) 表示求此列的和

4:查询男生的总年龄
select sum(age) from students where gender=1;

平均值
avg(列) 表示求此列的平均值

5:查询未删除女生的编号平均值
select avg(id) from students where is_delete=0 and gender=2;

分组

group by
group by + group_concat()
group_concat(字段名)根据分组结果,使用group_concat()来放置每一个分组中某字段的集合
在这里插入图片描述
group by + 聚合函数

通过group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个值的集合做一些操作

group by + having

having 条件表达式:用来过滤分组结果
having作用和where类似,但having只能用于group bywhere是用来过滤表数据

在这里插入图片描述
group by + with rollup

with rollup的作用是:在最后新增一行,来记录当前表中该字段对应的操作结果,一般是汇总结果。
在这里插入图片描述
在这里插入图片描述

连接查询语法

  • 对于外连接 outer关键字可以省略
select * from1 innerleftright join2 on1.列 运算符 表2.
1:使用内连接查询班级表与学生表
select * from students inner join classes on students.cls_id = classes.id;
2:使用左连接查询班级表与学生表
此处使用了as为表起别名,目的是编写简单
select * from students as s left join classes as c on s.cls_id = c.id;
3:使用右连接查询班级表与学生表

select * from students as s right join classes as c on s.cls_id = c.id;
4:查询学生姓名及班级名称
select s.name,c.name from students as s inner join classes as c on s.cls_id = c.id;

子查询

在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select
语句称之为子查询语句,外部那个select语句则称为主查询.

主查询和子查询的关系
子查询是嵌入到主查询中
子查询是辅助主查询的,要么充当条件,要么充当数据源
子查询是可以独立存在的语句,是一条完整的 select 语句

标量子查询
查询班级学生平均年龄
查询大于平均年龄的学生
查询班级学生的平均身高

select * from students where age > (select avg(age) from students);

列级子查询
查询还有学生在班的所有班级名字
找出学生表中所有的班级 id
找出班级表中对应的名字

select name from classes where id in (select cls_id from students);

行级子查询
需求: 查找班级年龄最大,身高最高的学生
行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素

select * from students where (height,age) = (select max(height),max(age) from students);

猜你喜欢

转载自blog.csdn.net/weixin_42754971/article/details/113470406