简单的SQL语句的快速复习

语法的执行顺序

select 4 字段列表

from 1 表名列表

where 2 条件列表

group by 3 分组前过滤

having 分组后过滤

order by 5 排序字段列表

limit 6 分页参数


聚合函数

count 统计数量

max 最大值

min 最小值

avg 平均

sum 总和


分组查询使用例子

1.性别分组,统计数量

select gender ,count(*)from emp group by gender

2.性别分组 统计平均年龄

select age ,avg(age) from emp group by gender

3.查询年龄小于45的员工,并且按照工作地址分组,获取员工数量>=3的工作地址

首先

按工作地址分组然后获取年龄小于45的员工的地址信息的总数

select workaddress,count(*)from emp where age<45 group by workaddress

再分组完后进行过滤

having count(*)>=3


排序查询使用例子

语法:

select 字段列表 from 表名 order by 字段1 排序方式1,字段2,排序方式2;

排序方式:

1.ASC:升序(默认)

2.DESC:降序

例子

1.根据年龄进行排序,2.年龄相同,再入职日期降序排序

select age from emp order by ageasc,entrydate desc

多字段排序:第一个字段相同时再进行第二个字段排序


分页查询

语法

select 字段列表 from 表名 limit 起始索引,查询记录数;

select * from emp limit 0 10


函数

字符串函数

concat(s1,s2,s3)字符串的拼接

lower(str) 小写

upper(str)大写

lpad(str,n,pad)

左填充,用字符串pad对左边进行填充,达到n个字符串长度

rpad(str,n,pad)

右填充

trim(str)

去掉字符串头部和尾部的空格

substring(str,start,len)

返回字符串str从str位置起的len个长度的字符串

int类型不能补0,因为是整形但可以补1


数值函数

ceil(x) 向上取整

floor(x) 向下取整

mod(X,Y) 返回x/y的模

rand()返回0-1内的随机数

round(X,Y)四舍五入,保留y位小数


日期函数

curdate() 日期

curtime() 时间

now() 现在

year(date) 获取指定date的年份

month(date) 获取指定date的月份

day(date) 日期

date-add(date,interval exprtype)

返回这个日期加上一个时间间隔后的时间值

datediff(date1,date2)

返回起始时间date1和结束时间date2之间的天数


流程函数

if(value,t,f)

true返回t

false返回f

ifnull(value1,value2)不空返回value1,空的话返回value2

case when then

case when valthen res1 else defaulse End

val为true则返回res1

否则返回default默认值

case expr when val then res1 else default End

end是结束

当expr的值等于val时返回res1否则返回default

使用例子

select name,(case workaddress when'北京' then'一线',when'上海',then'一线' end)as'工作地址'


增删改查

添加数据

1.给指定字段添加数据 insert values

insert into 表名(字段1 , 字段2) values(值1,值2)

2.给全部字段添加数据(不写出具体字段名)

insert into 表名 values(值1,值2)

3.批量添加数据

给特定字段

insert into 表名(字段1,字段2)values(值1,值2)(值1,值2);

给全部字段

insert into 表名 values (值1,值2), (值1,值2), (值1,值2);


更新与删除

修改数据:update set

update 表名 set 字段名1=值1,字段名2=值2......where 条件

不写条件where的话就是所有都执行

删除数据 delete

delete from 表名 where 条件


联合查询(union)

union查询,就是把多次的查询结果合并起来形成一个新的查询结果

select 字段列表 from 表a

unionall

select 字段列表 from 表b

分别查询薪资>5000,年龄>50的员工

select *from emp where salary>5000

union all

select *from emp where age>50

但是结果会有重复的,为了去重

可以把all去

报错情况

select *from emp where salary>5000

union all

select name from emp where age>50

这个会发现报错

因为对于联合查询来说。字段表的列数字段类型 必须保持一致


子查询

子查询

又称为 嵌套查询

标量子查询

查询销售部的所有员工信息

  1. select id from emp where name='销售部';

第一部查询出销售部id等于4

2.select *from emp where dept_id=4;

要两条指令,但我们想用一条搞定

select *from emp where dept_id=(select id from emp where name='销售部');


列子查询

常用操作符

in,not in,any,some,all

1

select id from dept where name='销售部'or name='市场部';

查出的id是1和2

然后

select* from emp where dept_id in (1,2)

或者

select* from emp where dept_id in (select id from dept where name='销售部'or name='市场部');

2

查询比财务部的所有人工资都高的员工的 信息

a 查询所有财务部人员的工资

select id from dept where name='财务部';

select salary from emp where dept_id=3

b查询比财务部所有人工资都高的员工信息

select *from emp where salary> all ( select salary from emp where dept_id=3)

3

查询比研发部其中任意一人工资都高的员工信息

因为是任意一人所以 没有all


行子查询

查询与'张无忌'薪资以及领导都相同的员工的信息

a.查询张无忌的工资及其领导

select salary,managerid from emp where name='张无忌'

b. 查询员工

select *from emp where salary=12500 and mangerid =1;

或者

select *from emp where (salary,managerid)=(12500,1);

再或者

select *from emp where(salary,mangerid)=(select salary,managerid from emp where name='张无忌')


表子查询

常用操作符 in

1.查询与'路'和'白'薪资以及职位相同的员工

select job,salary from emp where name='路'or name='白'

select * from emp where (job,salary) in (select job,salary from emp where name='路'or name='白')

2.查询入职日期是"2006-01-01"之后的员工信息,及其部门信息

select * from emp where entrydate>"2006-01-01"

把上面那个作为临时表

select e.* ,d.* from(select * from emp where entrydate>"2006-01-01") e left join dept d on e.dept_id=d.id


多表联查

1.查询员工的姓名,年龄,职位,部门信息(隐式内连接)

表:emp dept

连接条件:emp.dept_id=dept.id

记得消除笛卡尔积

select e.name,e.age,e.job,d.name from emp e, dept d where e.dept_id=d.id;

2.查询年龄小于30岁的员工的姓名,年龄,职位,部门信息(显示内连接)

select e.name,e.age,e.job,d.name from emp e inner join dept d on e.dept_id=d.id where e.age<30

3.查询拥有员工的部门id和部门名称

求取员工表和部门表之间的交集用内连接

select d.id,d.name from emp e,dept d where e.dept_id=d.id

此时会有多个重复的部门,因为他是按照员工数量来的

去重复用 distinct

select distinct d.id,d.name from emp e,dept d where e.dept_id=d.id

4.查询所有年龄大于40的员工,及其归属部门的名称;如果员工没有分配部门也要显示出来

要用外连接

select e.*,d.name from emp e left join dept d on e.dept_id=d.id where e.age>40

5.查询所有员工的工资等级

表:emp salarygrade

连接条件:emp.salary >=salagrade.losal and emp.salary<=salagrade.hisal

select e.*,s.grade emp e,salagrade s where e.salary>=s.losal and e.salary <=s.hisal

第二种写法:

select e.*,s.grade emp e,salagrade s where e.salary between s.losal and s.hisal

6.查询 研发部 所有员工的信息以及工资等级

涉及到的表:emp dept salgrade

连接条件:

emp.salary between s.losal and s.hisal

emp.dept_id=dept.id

查询条件 dept.name='研发部'

select e.*,s.grade from emp e ,dept d,salgrade s where e.dept_id=d.id and ( emp.salary between s.losal and s.hisal)and d.name='研发部'

7.查询研发部员工的平均工资

表 emp dept

select avg(e.salary) from emp e, dept d where e.dept_id=d.id and e.name='研发部'

8.查询工资比'灭绝'高的员工信息

select * from emp where salary>(select salary from emp where name='灭绝')

查询灭绝的薪资

select salary from emp where e.name='灭绝'

9.查询比平均薪资高的员工信息

select avg(salary) from emp

select * from emp where salary>(select avg(salary) from emp)

10.查询低于 本部门 平均薪资的员工

a.查询指定部门的平均薪资

select avg(e.salary) from emp e where e.dept_id=1

select avg(e.salary) from emp e where e.dept_id=2

b.

select *from emp e2 where salary<(select avg(e.salary) from emp e where e.dept_id=e2.dept_id)

保证平均下来的薪资是同一个部门的

11.查询所有的部门信息,并统计部门的员工人数

a.查询信息

select id,name from dept

b.查询指定部门的人数

select count(*) from emp where dept_id=1

最终

select d.id ,d.name (select count(*) from emp e where e.dept_id=id)'人数' from dept d;

12.查询所有学生的选课情况,展示出学生的名称,学号,课程名称

表:student ,course,student_course

连接条件:student.id=student_course.studentid,course.id=student_course.courseid

select s.name ,s.no,c.name from student s,student_course sc,course c where s.id=sc.studentid and sc.courseid=c.id

相关推荐
睡不醒男孩03082321 小时前
第七篇:揭秘 PostgreSQL 数据库内核级管控:CLup 深度架构设计与高可用底座技术白皮书
数据库·postgresql·clup
cmes_love21 小时前
Level 2逐笔成交历史数据下载方法笔记
数据库·笔记·oracle
马士兵教育21 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
swordbob1 天前
MySQL字符集陷阱:从Oracle迁移踩坑到utf8mb4强制规范
数据库·sql
snow@li1 天前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
牛油果子哥q1 天前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
十五年专注C++开发1 天前
MySql中各种功能用sql语句实现总结
数据库·sql·mysql
云烟成雨TD1 天前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
数据库小学妹1 天前
AI时代数据库怎么选?多模融合、数据统一存储与选型实战指南
数据库·人工智能·经验分享·ai
zfoo-framework1 天前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java