SQL语句--查询

1.SQL的执行顺序

1.首先执行FROM 根据from找到要查询的表,通过where来指定查询的条件,然后通过group by和having来指定分组以及分组之后的条件,第四步通过select确定要返回的字段,然后执行order by和limit

例子:查询年龄大于15的员工的姓名,年龄,并根据年龄进行升序排序

selcet name,age from emp where age > 15 order by age asc;

2.常用内置函数

1.字符串函数

示例:

select concat('Hello',' Wangwei');

update emp set workno = lpad(workno,5,'0');

2.数值函数

案例:生成六位随机数验证码

select  lpad( round(rand() * 1000000 , 0) , 6 , 0);

3.日期函数

查询所有员工的入职天数,并根据入职天数倒序排序

select name , datediff( curdate() , entrydate ) as 'entrydays' from emp order bu entrydays desc;

4.流程控制函数

用于条件筛选,提高语句执行效率

select if (true,'OK','Error') as okma;

case when then else end

需求: 查询emp表的员工姓名和工作地址 (如果是上海/北京 --> 一线 其他城市展示-->二线) 

select
    name,
    (case address when '北京' then '一线城市'
                 when '上海' then '一线城市'
                 else '二线城市' end)
     as '工作地址'
from emp;

筛选成绩: 

SELECT
 id,
 name,
 case when math >= 85 then '优秀' when math >= 60 then '及格' else '不及格' end,
 case when english >= 85 then '优秀' when english >= 60 then '及格' else '不及格' end,
 case when chinese>= 85 then '优秀' when chinese>= 60 then '及格' else '不及格' end,
from score;

3.约束 

1.概念:约束是作用于字段上的规则,用于限制存储在表中的数据。

2.目的:保证数据库中数据的正确、有效性和完整性。

4.多表查询

1.多表关系

1:1  1:n  n:m

多对多关系需要建立中间表来维护两方的关系

多表查询是从多张表中查询数据

简单的多表查询:select * from emp, dept; --> 笛卡尔积结果

多表查询需要消除无效的笛卡尔积,如何消除:使用where限定条件

select * from emp, dept where emp.dep_id = dept.id;

2.连接查询

1.内连接

查询的是两张表之间交集部分的数据

select e.name d.name from emp e inner join dept d on e.dept_id = d.id; 

2.外连接

左外连接其实就是完全包含左表的数据 

3.自连接

查询员工及其所属领导的名字:

select a.name, b.name from emp a, emp b where a.manageid = b.id;

查询所有员工emp及其领导的名字emp,如果员工没有领导,也需要查询出来:

select a.name , b.name from emp a left join emp b on a.manageid = b.id;

联合查询:

 案例:查询薪资低于5000的员工和年龄大于50的员工全部查询出来

select * from emp where salary < 5000;

union all  -- 使用union自带去重效果

select * from emp where age > 50;

3.子查询

概念:SQL语句中嵌套SELECT语句,成为嵌套查询,又称子查询。

1.标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式

-- 查询销售部的所有员工信息
-- a. 查询销售部部门id
select id from dept where name = '销售部';
-- b. 根据销售部部门id查询员工信息
select * from emp where dept_id = 4;

-- 嵌套查询:
select * from emp where dept_id = 
(select id from dept where name = '销售部');

2.列子查询

子查询返回的结果是一列(可以是多行),这种子查询成为列子查询

常用操作符:IN, NOY IN, ANY, SOME, ALL

 -- 列子查询
 -- 1. 查询销售部和市场部的所有员工信息
 SELECT * from emp WHERE dept_id in 
 (
 SELECT id from dept WHERE name = '销售部' OR '市场部'
 );
 -- 2. 查询比财务部所有人工资工资都高的员工信息
 -- 先查财务部的人员工资 
where * FROM emp WHERE salary > 
all(
 select salary from emp where dept_id = (
	select id from dept where name = '财务部';
 );
)

3.行子查询

子查询返回的结果是一行,也可以是多列,这种子查询称为行子查询。

常用操作符:=, <>, IN, NOT, IN

-- 1.查询与张无忌的薪资及直属领导相同的员工信息;
 SELECT * from emp WHERE
 (salary, manageid) = 
 (SELECT salary, manageid
 FROM emp
 where name = '张无忌');

4.表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询;

常用的操作符:IN

-- 1.查询与鹿杖客 宋远桥的职位和薪资相同的员工信息
-- a.查询 鹿杖客 宋远桥 的职位和薪资
SELECT job, salary from emp WHERE name = '鹿杖客' or name = '宋远桥';
-- b.查询与鹿杖客 宋远桥的职位薪资相同的员工信息
SELECT * FROM emp WHERE (job,salary)
IN
SELECT job, salary from emp WHERE name = '鹿杖客' or name = '宋远桥';

-- 2.查询入职日期是“2022-01-01”之后的员工信息,及其部门的信息
select * from emp where entrydate > "2022-01-01";
SELECT e.*, dept.* from (select * from emp where entrydate > "2022-01-01") e
left JOIN dept on e.dept_id = dept.id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值