java大数据学习---第二阶段---第四天---多表联查 SQL语句执行顺序 SQL索引

java大数据学习---第二阶段---第四天---多表联查 SQL语句执行顺序 SQL索引,第1张

java大数据学习---第二阶段---第四天---多表联查 SQL语句执行顺序 SQL索引 MySQL数据库中 单表查询上限1000w,超过会影响查询效率 多表联查
1.概念:表table代表了生活中一个主体,表关联则代表了表之间的关系

 表关联:association   
    
2.表关系   四种
  1>  一对一 one to one QQ和QQ邮箱,员工和员工编号
  2>  一对多 one to many 最常见,部门和员工,用户和订单
  3>  多对一 many to one 一对多反过来,员工和部门,订单和用户
  4>  多对多 many to many 老师和学生,老师和课程  比如:1师n生 1生n师   就是多对多
      
3.创建表
      //多条SQL语句一起执行时 每条SQL语句用  ;  表示结束
表设计特点:
表都以s结束,标识复数
字段多以表的首字母作为开头,在多表联查时,方便标识出是哪个表的字段
      
4.插入数据
      
5.多表联查的方式  三种
      
方式1:	笛卡尔积:Cartesian product
	  		 结构:
				select ? from 表1,表2....
      		产生的问题:
				产生了庞大的结果集,出现了大量重复的数据
	  		解决办法:
				select ? from 表1,表2...where 过滤条件#描述两个表的关系 比如1表部门名=2表部门名
      			比如:计算计算机导论课程所得的总分
					SELECt SUM(scores.degree) FROM courses,scores WHERe courses.cno=scores.cno AND courses.cname="计算机导论"
                    select	聚合函数(表名.字段名)/字段名   from    表1,表2	where	描述两个表的关系	and		真正的业务条件  
           
                    
方式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 查询学生曾华的总得分
#笛卡尔积
SELECt SUM(scores.degree) FROM scores ,students WHERe scores.sno=students.sno AND students.sname="曾华"
#链接查询
SELECt SUM(scores.degree) FROM scores JOIN students ON scores.sno=students.sno WHERe students.sname="曾华"
#子查询   在不同的表里查询
SELECt SUM(scores.degree) FROM scores WHERe sno=(SELECt sno FROM students WHERe sname="曾华")
    
#子查询  
#查询高于平均工资的员工信息   在一个表里查询
SELECt * FROM emp1 WHERe sal>(SELECt AVG(sal) FROM emp1 )
SQL语句执行顺序
(1) FROM [left_table] 选择表
 
(2) ON  链接条件
 
(3)  JOIN  链接
 
(4) WHERe  条件过滤
 
(5) GROUP BY  分组
 
(6) AGG_FUNC(column or expression),... 聚合
 
(7) HAVINg  分组过滤
 
(8) SELECt (9) DISTINCT column,... 选择字段、去重
 
(9) ORDER BY  排序
 
(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  ON students(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 ON students(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 ON emp1(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
        
2.视图
 
3.SQL优化 
					
										


					

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5693446.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存