cgb2109-day05
Posted cgblpx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cgb2109-day05相关的知识,希望对你有一定的参考价值。
文章目录
一,多表联查
–1,方式3:子查询
也叫嵌套查询,把上次的查询结果,当这次查询的条件来用
#方式3:子查询:要分析第一次查啥,第二次查啥
#练习1:查询计算机导论课程的总分
#第一次查:根据cname查cno- 3-105
SELECT cno FROM courses WHERE cname='计算机导论'
#第二次查:根据cno查degree
SELECT SUM(degree) FROM scores WHERE cno='3-105'
#改成子查询:嵌套查询
SELECT SUM(degree) FROM scores WHERE cno=(
SELECT cno FROM courses WHERE cname='计算机导论'
)
#练习2:查询易天老师能讲的课程名称
#第一次查:根据tname查tno 804
SELECT tno FROM teachers WHERE tname='易天'
#第二次查:根据tno查cname
SELECT cname FROM courses WHERE tno=804
#改造 (子查询)
SELECT cname FROM courses WHERE tno=(
SELECT tno FROM teachers WHERE tname='易天'
)
#练习3:查询accounting部门的员工的名字
SELECT ename FROM emp WHERE deptno IN(
SELECT deptno FROM dept WHERE loc='二区'
)
#练习4:查询高于平均工资的员工信息
SELECT * FROM emp WHERE sal>(
SELECT AVG(sal) FROM emp #平均工资
)
–练习1:查询research部门的所有员工姓名和工资
#练习1:查询research部门的所有员工姓名和工资
#方式3:子查询
SELECT emp.ename,emp.sal FROM emp WHERE deptno=(
SELECT deptno FROM dept WHERE dname='research'
)
#方式1:笛卡尔积
SELECT emp.ename,emp.sal FROM emp,dept
WHERE emp.deptno=dept.deptno#表关系
AND dept.dname='research'#业务条件
#方式2:连接查询
SELECT emp.ename,emp.sal FROM dept INNER JOIN emp
ON emp.deptno=dept.deptno#表关系
WHERE dept.dname='research'#业务条件
–练习2:查询research部门的所有员工姓名和工资
#练习2:查询jack所在的部门信息
#方式3:子查询
SELECT * FROM dept WHERE deptno=(
SELECT deptno FROM emp WHERE ename='jack'
)
#方式1:笛卡尔积
SELECT dept.* FROM dept,emp
WHERE emp.deptno=dept.deptno#表关系
AND emp.ename='jack'#业务条件
#方式2:连接查询
SELECT dept.* FROM dept JOIN emp
ON emp.deptno=dept.deptno#表关系
WHERE emp.ename='jack'#业务条件
–练习3:查询总监的部门信息
#练习3:查询总监的部门信息
#方式1:笛卡尔积
SELECT dept.* FROM dept,emp
WHERE emp.deptno=dept.deptno#表关系
AND emp.job='总监'#业务条件
#方式2:连接查询
SELECT dept.* FROM dept JOIN emp
ON emp.deptno=dept.deptno#表关系
WHERE emp.job='总监'#业务条件
#方式3:子查询
SELECT dept.* FROM dept WHERE deptno=(
SELECT deptno FROM emp WHERE job='总监'
)
–练习4:查询李军的平均分
#练习4:查询李军的平均分
#方式3:子查询
SELECT AVG(degree) FROM scores WHERE sno=(
SELECT sno FROM students WHERE sname='李军'
)
#方式1:笛卡尔积
SELECT AVG(scores.degree) FROM students,scores
WHERE students.sno=scores.sno#表关系
AND students.sname='李军'#业务条件
#方式2:连接查询
SELECT AVG(scores.degree) FROM students JOIN scores
ON students.sno=scores.sno#表关系
WHERE students.sname='李军'#业务条件
–练习5:查询陈冰能讲的课程名
#练习5:查询陈冰能讲的课程名
#方式3:子查询
SELECT courses.cname FROM courses WHERE tno=(
SELECT tno FROM teachers WHERE tname='陈冰'
)
#方式1:笛卡尔积
SELECT courses.cname FROM teachers,courses
WHERE teachers.tno=courses.tno #表关系
AND teachers.tname='陈冰'#业务条件
#方式2:连接查询
SELECT courses.cname FROM teachers JOIN courses
ON teachers.tno=courses.tno #表关系
WHERE teachers.tname='陈冰'#业务条件
二,数据库的扩展
–1,索引
概述
好处是: 提高查询效率 坏处是: 本身是单独的空间来存储
分类:
1,单值索引:一个索引只包含一列
2,唯一索引:一个索引只包含一列,值不能重复
3,复合索引:一个索引包含多个列
单值索引
create index 索引名 on 表名(字段名)–一个索引只包含一个列
#索引:创建索引+使用索引
#1.查看索引
SHOW INDEX FROM emp
#2.创建 单值索引:一个索引包含一列
CREATE INDEX nameindex ON emp(ename)
#3.使用索引,发起select语句
SELECT * FROM emp WHERE ename='jack'
#4.检查SQL的执行效率(观察用没用索引)
EXPLAIN#解释说明SQL的执行计划/性能(观察possible keys的值)
SELECT * FROM emp WHERE ename='jack'
#练习:
CREATE INDEX jobindex ON emp(job)#单值索引
SHOW INDEX FROM emp#查看索引
EXPLAIN SELECT * FROM emp WHERE job='员工'#检查是否使用了索引
唯一索引
create unique index 索引名 on 表名(字段名)
一个索引只包含一个列,列的值不能重复
#5.创建 唯一索引:一个索引包含一列,值要唯一
CREATE UNIQUE INDEX locindex ON dept(loc)
#添加失败,因为loc的值有重复的
CREATE UNIQUE INDEX dnameindex ON dept(dname)
SHOW INDEX FROM dept#查看索引
#使用索引
EXPLAIN SELECT * FROM dept WHERE dname='research'
复合索引
create index 索引名 on 表名(字段名1,字段名2,字段名3…)
一个索引包含多个字段,用时要遵循最左原则,否则复合索引失效
失效的情况:按照 2 3 23 ,没有包含最左边的
#6.创建 复合索引:
CREATE INDEX fuheindex ON emp(ename,job,deptno)
SHOW INDEX FROM emp
#用时可能会让复合索引失效--必须遵循最左原则(必须包含着最左边的)
EXPLAIN SELECT * FROM emp WHERE ename='jack' #生效
EXPLAIN SELECT * FROM emp WHERE job='总监' #失效
EXPLAIN SELECT * FROM emp WHERE ename='jack' AND job='副总' #生效
EXPLAIN SELECT * FROM emp WHERE job='副总'AND ename='jack'#生效
删除索引
alter table 表名 drop index 索引名
show index from 表名
使用explain关键字检查,SQL中是否使用了索引(检查SQL的执行性能)
#7.删除索引
SHOW INDEX FROM emp
ALTER TABLE emp DROP INDEX jobindex
总结
缺点:
索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间
索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的”
虽然索引大大提高了查询的速度,但对数据的增、删、改的操作需要更新索引表信息,如果数据量非常巨大,更新效率就很慢,因为更新表时,mysql不仅要保存数据,也要保存一下索引文件
随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引
–2,视图
概念
是一个特殊的表,存了上次查询的结果.
测试
#视图:创建视图+使用视图
#练习:查询名字里有a的员工信息
SELECT * FROM emp WHERE ename LIKE '%a%'
#1.创建视图:create view 视图名 as select语句
CREATE VIEW empview AS
SELECT * FROM emp WHERE ename LIKE '%a%'
#2.使用视图
SELECT * FROM empview
#好处:提高了SQL的复用性+屏蔽了业务表的复杂性+数据共享
#坏处:是一张单独的表存了业务表的数据造成了数据重复+无法优化
–3,SQL优化
1, 用字段名称代替*
2, where里: 尽量用and不用or , 尽量用=不用!= <> , 条件越精确越好 ,
3, 表设计:
表里的索引不要超过5个 , 给where后或者order by经常用的字段加索引 ,复合索引要遵循最左特性不然就失效了 , 索引表及时删掉多余的索引
用varchar代替char , 用数字代替字符串 , 用默认值代替null
4, 批量处理:
批量查,批量的删,最好使用分页
详情见课件:https://blog.csdn.net/u012932876/article/details/117359992
–4,三范式
数据库的专业术语,用来设计表要遵循的原则,范式NF
分为六大范式,通常只要遵循前三大范式就可以了
第一范式1NF: 表里的字段 不可分割,是指字段的值就是最小单位
简而言之,第一范式就是无重复的列
第二范式2NF: 基于第一范式的基础上产生的,
指表里都应该设计主键/主关键字/主属性
每行都应该围绕着主键来 描述数据
总之,第二范式就是非主属性完全依赖于主关键字
第三范式3NF: 基于第二范式的基础上产生的,
是指表里的字段之间尽量不要产生依赖,
总之,第三范式就是属性不依赖于其它非主属性
以上是关于cgb2109-day05的主要内容,如果未能解决你的问题,请参考以下文章