| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 学习MySQL-第五章 -> 正文阅读 |
|
[大数据]学习MySQL-第五章 |
目录 22.3当两张表进行连接查询时,没有任何条件的限制会发生什么现象? 23.5select后面出现的子查询(这个内容不需要掌握,了解即可!) 21,去除重复记录注意:原表数据不会被修改,只是查询结果去重 去重需要使用一个关键字:distinct
这样写是错误的,语法错误 distinct只能出现在所有字段的最前方 //distinct出现在job,deptno两个字段之前,表示两个字段联合起来去重
例:统计一下工作岗位的数量
distinct只能出现在所有字段的前方,但是可以用分组函数 22,连接查询22.1什么是连接查询从一张表中单独查询,称为单表查询 emp表和dept表联合起来查询数据,从emp表中取员工名字,从detp表中取部 门名字 这种跨表查询,多张表联合起来查询数据,被称为连接查询 22.2连接查询的分类根据语法的年代分类 SQL92:1992年的时候出现的语法 SQL99:1999年的时候出现的语法 这里重点学习SQL99,这个过程简单演示一下SQL92的例子 根据表连接的方式分类
22.3当两张表进行连接查询时,没有任何条件的限制会发生什么现象?例:查询每个员工所在部门名称?
?
这样会有14*4=56条记录 注意: 当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔现象。(笛卡尔发现的,这是一个数学现象。) 22.4怎么避免笛卡尔积现象?连接时加条件,满足这个条件的记录被筛选出来!
? 上面的查询还是比较费时的,还有更简洁的做法,就是在select的字段前面加上表明限定,另外结合起别名就可以提高效率 //表起别名,很重要
? ?思考:最终查询的结果条数是14条,但是匹配的过程中,匹配的次数减少了吗? 没有,还是56次,只不过进行了四选一,次数没有减少 注意:通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表连接的次数 22.5内连接之等值连接例:查询每个员工所在的部门名称,显示员工名和部门名? emp e和dept d表进行连接。条件是:e.deptno=d.deptno SQL92语法:
SQL92的缺点: 结构不清晰,表的连接条件和后期进一步筛选的条件,都放到了where 后面 SQL99语法:
注:inner可以省略,带着inner可读性更好,一眼就能看出是内连接 SQL99的优点: 表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续 添加where SQL99语法:
22.6内连接之非等值连接例:找出每个员工的薪资等级,要求显示员工名,薪资,薪资等级?
22.7内连接之自连接例:查询员工的上级领导,要求显示员工名和对应的领导名
技巧:一张表看成两张表
?以上就是内连接中的自连接,技巧:一张表看成两张表 22.8外连接例:查询员工的名称与对应的岗位 内连接(A和B连接,AB两张表没有主次关系,平等的):
?内连接的特点:完成能够匹配上这个条件的数据查询出来 内连接是通过deptno把emp表和dept表连接起来,查询dept表和emp表deptno 相同的记录,但是如果要把dept表和emp表中的deptno不匹配的也找出来就要 用到外连接了 外连接(右外连接):
外连接(左外连接)
带有right的是右外连接,又叫右连接 带有left的是左外连接,又叫左连接 任何一个右连接都有左连接的写法 任何一个左连接都有右连接的写法 right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表 的数据全部查询出来,捎带着关联查询左边的表 left代表什么:和right一样,表示将join左边的表看成主表 在外连接中,两张表连接产生了主次关系 join前面也可以加上outer,outer是可以省略的,上面就省略了,带着可读性强, 表示是外连接 注意:外连接的查询结果条数一定是>=内连接的查询结果条数 例:查询每个员工的上级领导,要求显示所有员工的名字和领导名
22.9三张表,四张表怎么连接?语法:
一条SQL中内连接和外连接可以混合,都可以出现! 例:找出每个员工的部门名称以及工资等级,要求显示员工名,部门名,薪资,薪资等级
?例:找出每个员工的部门名称以及工资等级,还有上级领导,要求显示员工名,领 导名,部门名,薪资,薪资等级
?23,子查询23.1什么是子查询select语句中嵌套select语句,被嵌套的select语句被称为子查询 23.2子查询都可以出现在哪里
23.3where子句中的子查询例:找出比最低工资高的员工姓名和工资?
这样写不行,因为where子句中不能直接使用分组函数 实现思路: 第一步:查询最低工资是多少
第二步:找出>800的
第三步:合并
23.4from子句中的子查询注意:from后面的子查询,可以将子查询的查询结果当做一张临时表(技巧) 例:找出每个岗位的平均工资的薪资等级 第一步:找出每个岗位的平均工资(按照岗位分组求平均值)
第二步:把以上的查询结果就当做一张真实存在的表t
t表和s表进行表连接,条件:t表avg(sal) between s.losal and s.hisal;
23.5select后面出现的子查询(这个内容不需要掌握,了解即可!)例:找出每个员工的部门名称,要求显示员工名,部门名?
//报错:ERROR 1242 (21000): Subquery returns more than 1 row
注意:对于select后面的子查询来说,这个子查询只能一次返回1条结果,多于1 条,就报错了! 24,union合并查询结果集例:查询工作岗位是MANAGER和SALESMAN的员工
下面用union实现 mysql> select ename,job from emp where job='MANAGER' union select ename,job from emp where job='SALESMAN'; ? ?union的效率要高一些。对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔 积,成倍的翻。。。 但是union可以减少匹配的次数,在减少匹配次数的情况下,还可以完成两个结果集的拼接 a连接b连接c a 10条记录 b 10记录 c 10条记录 匹配次数:1000 a连接b一个结果:10*10 -->100次 a连接c一个结果:10*10 -->100次 使用union的话是:100次+100次=200次(union把乘法变成了加法运算) union在使用的时候有注意事项吗? //错误的:union在进行结果集合并的时候,要求两个结果集的列数相同
//mysql可以,oracle语法严格,不可以,报错。 //要求:结果集合并时列和列的数据类型也要一致
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:41:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |