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语句的执行顺序:

  1. from
  2. on
  3. join
  4. where
  5. group by
  6. having
  7. select
  8. distinct
  9. order by
  10. 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),他们是逐步为严格的,满足第二范式,就必须要满足第一范式。满足第三范式时就必须首先满足第二范式。

第一范式

第一范式要求单个表中每个列必须是原子列(即每一个列都是不可再分的最小数据单元),列不存在重复属性,每个实体的属性页不存在多个数据项。

  1. 原子列
  2. 不出现重复属性
  3. 不允许出现多个数据项
第二范式

第二范式是在满足第一范式的基础之上,要求数据表里的所有数据都要和该数据表的主键有完全依赖关系。

第三范式

第三范式是在满足第二范式的基础之上,每一个非主键列都直接以来主键列,不依赖其他非主键列,即数据库中不能存在传递函数关系的依赖关系。

标签

评论

this is is footer