简单的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 [val]then [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

union[all]

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

相关推荐
苹果酱056723 分钟前
【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
java·vue.js·spring boot·mysql·课程设计
枫叶200039 分钟前
OceanBase数据库-学习笔记1-概论
数据库·笔记·学习·oceanbase
Java致死1 小时前
单例设计模式
java·单例模式·设计模式
仲夏plus1 小时前
MySQL:慢SQL索引优化-使用explain/analyze进行耗时分析的方法
数据库
胡子发芽1 小时前
请详细解释Java中的线程池(ThreadPoolExecutor)的工作原理,并说明如何自定义线程池的拒绝策略
java
沫夕残雪1 小时前
Tomcat的安装与配置
java·tomcat
tcoding1 小时前
《MySQL 技术内幕-innoDB 存储引擎》笔记
数据库·笔记·mysql
胡子发芽1 小时前
请解释Java中的NIO(New I/O)与传统I/O的区别,并说明NIO中的关键组件及其作用
java
Edward.W1 小时前
如何有效防止 SQL 注入攻击?
数据库·sql
柚个朵朵1 小时前
IDEA中使用Git
java·git·spring