20201015+袁鑫
学习日志
知识总结:
高级查询
多表查询
笛卡尔乘积现象
表查询中的笛卡尔乘积现象:多行表在查询时,如果定义了无效连接或者漏写了连接条件,就会产生笛 卡尔乘积现象,所谓的笛卡尔乘积及时每个表的每一行都和其他表的每一行组合。
等值连接查询
通常是在存在主键外键关联关系的表之间的连接进行,使用"="连接相关的表
n个表进行等值连接查询,最少需要n-1个等值条件来约束
--查询每个部门的所有员工
select dept.dname,emp.ename from emp,dept where dept.deptno = emp.deptno;
子链接查询
表表查询不仅可以在多个表之间进行查询,也可以在一个表之中进行多表查询
-- 查询当前公司员工和所属上级员工的信息
select e1.empno as 员工编号,e1.ename as 员工姓名,e2.empno as 领导编号,e2.ename as 领导姓名 from emp as e1,emp as e2 where e1.mgr = e2.empno;
内连接查询
内连接查询使用inner join 关键字实现,inner可以省略。内连接查询时,条件用on链接,多个条件使用()将其括起来。
-- 查询每个部门的所有员工
select dept.name,emp.name from emp inner join dept on emp.deptno = dept.deptno;
和等值查询差不多
外连接
外连接分为左外连接(left outer join ) 和 右外连接(right outer join)其值outer 可以省略。外连接查询时,条件用on链接,多个条件使用()将其括起来。
左边链接表示以左表为主表,右外连接表示以右表为主表。查询时将主表信息在从表中进行匹配
-- 查询每个部门的所有员工
select dept.name,emp.name from emp right join dept on emp.deptno = dept.deptno;
select dept.name ,emp.name from emp left join dept on emp.deptno = dept.deptno;
子查询
单行子查询
单行单列
-- 查询软件部门下的所有员工
select * from emp e where e.deptno = (select d.deptno from dept d where d.dname = '软件部');
多行子查询
如果子查询返回了多行记录,则称这样的嵌套查询为多行子查询,多行子查询就需要用到多行记录的操作符
如:in, all,any
-- 统计所有的员工分布在哪些部门的信息
select * from dept d where d.deptno in (select e.deptno from emp e);
-- 查询公司中比任意一个员工的工资高的所有员工
select * from emp e1 where e1.sal >any(select e1.sal from emp e2 );
-- 查询公司中比所有的助理工资高但是不是助理的员工
select * from emp e1 where e1.sal > all (select e2.sal from e2.emp where w2.hoblike '%助理' );
>any
表示大于子查询钟的任意一个值。
>all
表示大于子查询中的所有值。
多列子查询
select * from emp limit 0,2;
第一个参数0表示从第几条开始查询 这里的0可以省略不写的;
第二个参数表示查询出几条数据
后面不够的,有多少写多少;
select * from emp order by empno limit 5; --
select * from emp limit 5.5;
综合查询
select * from emp where hridate >= '2020-01-01' group by deptno having count(*) >= order by count(*) desc limit 0.5;
SQL语句的执行顺序:
- from
- on
- join
- where
- group by
- having
- select
- distinct
- order by
- limit
单行函数
字符串函数
upper :将字母转换为大写;
lower : 将字母转换为小写;
concat : 字符串链接;
substr/substring : 截取字符串;
length: 获取字符串长度;
instr : 获取字符串在夫字符串中的索引;
trim : 去掉两端的空格;
ltrim : 去掉左端的空格;
rtrim : 去掉右端的空格;
replace : 替换文本;
注:这里的字符串是从1开始的(不是0)
数学函数:
round (x, [y] )对指定的值进行四舍五入,可以指定数值的位数y;
truncate :对指定的数及进行截取操作,指定保留位y;
ceil(x): 向上取整;
floor(x) : 向下取整;
abs (x) : 取绝对值;
日期函数
current_timestamp ( ) :获取当前是时间截( 年月日 时分秒)
current_date() :获取当前日期 (年-月-日)
current_time : 获取当前时间(时分秒)
now : 获取当前时间+日期;
数据库的设计范式
数据库的设计有五大范式,常用的有三大范式,称之为第一范式(1NF),第二范式(2NF),第三范式(3NF),他们是逐步为严格的,满足第二范式,就必须要满足第一范式。满足第三范式时就必须首先满足第二范式。
第一范式
第一范式要求单个表中每个列必须是原子列(即每一个列都是不可再分的最小数据单元),列不存在重复属性,每个实体的属性页不存在多个数据项。
- 原子列
- 不出现重复属性
- 不允许出现多个数据项
第二范式
第二范式是在满足第一范式的基础之上,要求数据表里的所有数据都要和该数据表的主键有完全依赖关系。
第三范式
第三范式是在满足第二范式的基础之上,每一个非主键列都直接以来主键列,不依赖其他非主键列,即数据库中不能存在传递函数关系的依赖关系。
近期评论