1.概念:表table代表了生活中一个主体,表关联则代表了表之间的关系
表关联:association
2.表关系 四种
1> 一对一 one toone QQ和QQ邮箱,员工和员工编号
2> 一对多 one tomany 最常见,部门和员工,用户和订单
3> 多对一 many toone 一对多反过来,员工和部门,订单和用户
4> 多对多 many tomany 老师和学生,老师和课程 比如:1师n生 1生n师 就是多对多
3.创建表
//多条SQL语句一起执行时 每条SQL语句用 ; 表示结束
表设计特点:
表都以s结束,标识复数
字段多以表的首字母作为开头,在多表联查时,方便标识出是哪个表的字段
4.插入数据
5.多表联查的方式 三种
方式1: 笛卡尔积:Cartesian product
结构:
select ? from 表1,表2....
产生的问题:
产生了庞大的结果集,出现了大量重复的数据
解决办法:
select ? from 表1,表2...where 过滤条件#描述两个表的关系 比如1表部门名=2表部门名
比如:计算计算机导论课程所得的总分
SELECTSUM(scores.degree)FROM courses,scores WHERE courses.cno=scores.cno AND courses.cname="计算机导论"
select 聚合函数(表名.字段名)/字段名 from 表1,表2 where 描述两个表的关系 and 真正的业务条件
/*笛卡尔积(Cartesian product),又称直积。一般笛卡尔积没有实际的业务意义,但多表查询都是先生成笛卡尔积,再进行数据的筛选过滤。这点很值得注意,实
际开发中尽量少用多表联查,其根本原因就在这里,查询过程中,现在内存中构建一个大大的结果集,然后再进行数据的过滤。那这个构建过程,和所使用的内存资源, 包括过滤时的判断,都是既耗费资源,又浪费时间。*/
方式2: 连接查询 join
//使用链接查询 尽量 join左边的表越简单越好 左边的比右边的表要简单 小表驱动大表
练习5 统计陈冰老师能将的课程名称
SELECT courses.cname FROM teachers JOIN courses ON teachers.tno=courses.tno WHERE teachers.tname="陈冰"
select 聚合函数(表名.字段名)/字段名 from 表1 join 表2 on 描述两个表的关系 where 真正的业务需求
三种连接 :----最高效的是内连接
内连接 : inner join 取两表的交集部分-----简写成 join
左(外)连接 : left join 取左表的所有数据和右表符合条件的数据,然后右表不满足条件的数据填充null
右(外)连接 : right join 取右表的所有数据和左表符合条件的数据,然后左表不满足条件的数据填充null
方式3:子查询 也叫 嵌套查询 subquery
1.概念:子查询是指把第一次的查询结果 作为第二次查询的条件 继续发起查询语句
子查询执行效率低慎用。
2.//1.单行查询 用 =
#练习1 查询reserch部门的员工信息
#第一次 查部门表 根据部门名称查部门编号
SELECT deptno FROM dept1 WHERE dname='reserch'
#第二次查 差员工表 根据部门编号查询员工信息
SELECT * FROM emp1 WHERE deptno=2
#子查询
SELECT * FROM emp1 WHERE deptno=(SELECT deptno FROM dept1 WHERE dname='reserch')//2 多行查询 用 in
#练习3 查询Java开发部和reserch部门的员工姓名
SELECT ename FROM emp1 WHERE deptno IN (SELECT deptno FROM dept1 WHERE dname="java开发部"OR dname="reserch")
或者
SELECT ename FROM emp1 WHERE deptno IN (SELECT deptno FROM dept1 WHERE dname IN ("java开发部","reserch"))//备注: 笛卡尔积和连接查询如果不指定所查内容是哪个表 就会查出来两个表所有的信息 所以有时候需要指定查那个表的内容
多表联查 综合案例
#练习1 查询可以讲高等数学的老师的名字
#笛卡尔积
SELECT tname FROM teachers,courses WHERE teachers.tno=courses.tno AND courses.cname="高等数学"
#连接查询
SELECT tname FROM teachers JOIN courses ON teachers.tno=courses.tno WHERE courses.cname="高等数学"
#子查询 在不同的表里查询
SELECT tname FROM teachers WHERE tno=(SELECT tno FROM courses WHERE cname="高等数学")
#综合练习2
#练习2 查询学生曾华的总得分
#笛卡尔积
SELECTSUM(scores.degree)FROM scores ,students WHERE scores.sno=students.sno AND students.sname="曾华"
#链接查询
SELECTSUM(scores.degree) FROM scores JOIN students ON scores.sno=students.sno WHERE students.sname="曾华"
#子查询 在不同的表里查询
SELECTSUM(scores.degree) FROM scores WHERE sno=(SELECT sno FROM students WHERE sname="曾华")
#子查询
#查询高于平均工资的员工信息 在一个表里查询
SELECT * FROM emp1 WHERE sal>(SELECTAVG(sal)FROM emp1 )
SQL语句执行顺序
(1) FROM [left_table] 选择表
(2) ON <join_condition> 链接条件
(3)<join_type> JOIN <right_table> 链接
(4) WHERE <where_condition> 条件过滤
(5) GROUP BY <group_by_list> 分组
(6)AGG_FUNC(column or expression),... 聚合
(7) HAVING <having_condition> 分组过滤
(8) SELECT (9)DISTINCT column,... 选择字段、去重
(9) ORDER BY <order_by_list> 排序
(10) LIMIT count OFFSET count; 分页
SQL面试题 拓展
1.索引
1.概念:索引是一种排好序的快速查找的数据结构
2.作用: 提高数据库的查询效率
3.分类:1> 单值索引:一个索引只包括一个列/字段,一个表可以有多个列
2> 复合索引:一个索引同时包括多列/字段
3> 唯一索引:特殊的单值索引,4.创建单值索引
# 提高查询效率 建议给 经常用来查询的字段加索引
#1.查看索引 主键自带索引,不需要再添加索引
# 固定结构 show index from 表名
SHOW INDEX FROM students
#2. 创建索引
//# 固定结构 create index 索引名 on 表名(字段名)
CREATE INDEX index1 ONstudents(sname)
SHOW INDEX FROM students
#3.使用索引 按照索引列去查(看不到索引的操作)
#查看学生信息
SELECT * FROM students WHERE sname="陆君"
#4.查询SQL的执行计划/性能(只想关注你的SQL是否用到了索引 使用explain + SQL语句 查看执行结果里的key) 其实就是查看是否使用了索引
EXPLAIN SELECT * FROM students WHERE sname="陆君"5.创建唯一索引 找到合适的列,字段的值都要唯一
//#语法结构 create unique index 索引名 on 表名(字段名)
#create unique index index2 on students(ssex)#不能加唯一索引 值大量重复
CREATE UNIQUE INDEX index2 ONstudents(sno)
SHOW INDEX FROM students
#使用索引
SELECT * FROM students WHERE sno=101
EXPLAIN SELECT * FROM students WHERE sno=101 #不要给主键索引添加唯一索引 会让主键索引失效 单值索引可以加但是使用的时候还是主键索引,所以还是不要加
6.创建复合索引
# 创建复合索引 一个索引包含着多个列
# 固定结构 CREATE INDEX 索引名 ON 表名(字段名1,字段名2....)
CREATE INDEX index3 ONemp1(ename,job,deptno)
SHOW INDEX FROM emp1
#使用索引 最左特性 使用索引 必须包含复合最左边的元素
EXPLAIN SELECT * FROM emp1 WHERE ename="jack" #复合索引生效
EXPLAIN SELECT * FROM emp1 WHERE job="总监" #复合索引失效 没有用到复合索引
EXPLAIN SELECT * FROM emp1 WHERE ename="jack"AND job="总监" #生效 且 两个条件可以互换位置 不影响 只要包含最左元素就好
EXPLAIN SELECT * FROM emp1 WHERE ename="jack"OR job="总监" #失效 多个条件用and连接才会生效
7.删除索引
语法结构: alter table 表名 drop index 索引名
8.优缺点
优点:-大大提高了查询效率
-本质上数据库会为索引列的数据进行排序,快速查询
2缺点:-本身索引是一个单独的表,也需要占空间的
-索引适合查询的业务,但是,也需要同步更新修改一些新的数据,需要一定的时间
9.原则:1> 什么时候添加索引?
频繁的按照一个规则去查询的数据,就应该考虑添加索引
2> 给谁添加索引?
给那些经常作为查询条件的字段添加索引
3> 加啥索引?
索引是有分类的,单值索引/唯一索引/复合索引 看情况选择不同的索引类型
4> 如何查看SQL的执行计划/性能 或者说 怎么查看使用什么索引?
使用 Explain