如果您对mysql子查询EXISTS感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于mysql子查询EXISTS的详细内容,我们还将为您解答mysql子查询优化的相关问题,并
如果您对mysql 子查询 EXISTS感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于mysql 子查询 EXISTS的详细内容,我们还将为您解答mysql 子查询优化的相关问题,并且为您提供关于C# 中当程序的访问权限不足时,Directory.Exists 和 File.Exists 方法不会抛出异常报错、EXISTS (SELECT 1 ...) vs EXISTS (SELECT * ...) 一个还是另一个?、EXISTS和 NOT EXISTS 子查询 (高级查询 二)、Hive_LEFT SEMI JOIN / LEFT OUTER JOIN 与 (IN / NOT IN), (EXISTS / NOT EXISTS ) 分析的有价值信息。
本文目录一览:- mysql 子查询 EXISTS(mysql 子查询优化)
- C# 中当程序的访问权限不足时,Directory.Exists 和 File.Exists 方法不会抛出异常报错
- EXISTS (SELECT 1 ...) vs EXISTS (SELECT * ...) 一个还是另一个?
- EXISTS和 NOT EXISTS 子查询 (高级查询 二)
- Hive_LEFT SEMI JOIN / LEFT OUTER JOIN 与 (IN / NOT IN), (EXISTS / NOT EXISTS ) 分析
mysql 子查询 EXISTS(mysql 子查询优化)
子查询又叫嵌套查询
子查询的select 语句不能使用order by子句,order by不要只能对最终查询结果排序。
1.带IN的子查询
select * from emp where dep_id in (select id from dept id); 在子查询中的order by id排序 对最后结果无影响。
2.带ANY或ALL的子查询2
select salary from emp where id in(2,5);
select * from emp where salary <ANY (select salary from emp where id in(2,5));
<ANY 子查询(匹配任一返回真) :表示条件满足 小于 子查询中任何一个值 就会返回emp的一条记录,相当于筛选出小于子查询最大值的记录。
select * from emp where salary <ALL (select salary from emp where id in(2,5));
<ALL 子查询(匹配所有返回真) :表示条件满足 小于 子查询中所有的值 才会返回emp的一条记录,相当于筛选出子查询最小值的记录。
其他操作符功能类似(=,<>,<,>,<=,>=)。
以上用于对子查询出的集合值不明确,且子查询的值不多的情况下,不用直接获取最值而交给数据库匹配的方法。
3.EXISTS
select * from emp where EXISTS (select id from dept where dept.id=emp.dep_id);
用法: exists后面一定是子查询语句,不能用(值1,值2)代替;where exists (查询),结构中没有列;exists后面的子查询不返回任何实际数据,只返回真或假,当返回真时 where条件成立,该条记录保留。
exists (查询),只要子查询不会空 则where条件就返回真。
C# 中当程序的访问权限不足时,Directory.Exists 和 File.Exists 方法不会抛出异常报错
有些时候,我们开发的 C# 应用程序的执行账号,可能没有对一些文件夹和文件的访问权限,当我们使用 Directory.Exists 和 File.Exists 方法去判断这些文件夹和文件是否存在的时候,Directory.Exists 和 File.Exists 方法并不会抛出异常报错,这两个方法会返回 false,表示查找的文件夹和文件不存在。尽管文件夹和文件实际上是存在的,只是 C# 程序的执行账号没有权限访问而已,但是 Directory.Exists 和 File.Exists 方法还是会返回 false,并不会抛出异常报错。
以下是 MSDN 对 Directory.Exists 和 File.Exists 方法的解释,其中也提到了权限不足的问题:
Directory.Exists
Returns
true if path refers to an existing directory; false if the directory does not exist or an error occurs when trying to determine if the specified directory exists.
File.Exists
Returns
true if the caller has the required permissions and path contains the name of an existing file; otherwise, false. This method also returns false if path is null, an invalid path, or a zero-length string. If the caller does not have sufficient permissions to read the specified file, no exception is thrown and the method returns false regardless of the existence of path.
参考链接
Directory.Exists
File.Exists
EXISTS (SELECT 1 ...) vs EXISTS (SELECT * ...) 一个还是另一个?
每当我需要检查表中是否存在某行时,我倾向于始终编写如下条件:
SELECT a,b,c
FROM a_table
WHERE EXISTS
(SELECT * -- This is what I normally write
FROM another_table
WHERE another_table.b = a_table.b
)
其他一些人这样写:
SELECT a,c
FROM a_table
WHERE EXISTS
(SELECT 1 --- This nice '1' is what I have seen other people use
FROM another_table
WHERE another_table.b = a_table.b
)
当条件NOT EXISTS
不是EXISTS
: 在某些情况下,我可能会用 aLEFT JOIN
和一个额外的条件(有时称为antijoin)来编写它:
SELECT a,c
FROM a_table
LEFT JOIN another_table ON another_table.b = a_table.b
WHERE another_table.primary_key IS NULL
我尽量避免使用它,因为我认为含义不太清楚,特别是当您primary_key
的内容不那么明显时,或者当您的主键或连接条件是多列时(您很容易忘记其中一列)。但是,有时您维护由其他人编写的代码......它就在那里。
- 有什么区别(除了风格)来
SELECT 1
代替SELECT *
吗?
有没有表现不同的极端情况? - 虽然我写的是(AFAIK)标准SQL:不同的数据库/旧版本有这样的区别吗?
- 明确写反加入有什么好处吗?
当代计划者/优化者是否将其与NOT EXISTS
条款区别对待?
EXISTS和 NOT EXISTS 子查询 (高级查询 二)
子查询:嵌入到另一个查询语句之中的查询语句
子查询注意事项:
1.子查询可以嵌套在sql语句中任何表达式出现的位置
2.只出现在子查询中没有出现在父查询中的表不能包含在输出列中
-----学生表
DROP TABLE IF EXISTS student;
CREATE TABLE `student`(
`studentNo` INT(4) NOT NULL COMMENT ''学号'',
`loginPwd` VARCHAR(20) NOT NULL COMMENT ''密码'',
`studentName` VARCHAR(50) NOT NULL COMMENT ''学生姓名'',
`sex` CHAR(2) DEFAULT ''男'' NOT NULL COMMENT ''性别'',
`gradeId` INT(4) UNSIGNED COMMENT ''年级编号'',
`phone` VARCHAR(50) COMMENT ''联系电话'',
`address` VARCHAR(255) COMMENT ''地址'',
`bornDate` DATETIME COMMENT ''出生时间'',
`email` VARCHAR(50) COMMENT''邮件账号'',
identityCard VARCHAR(18) COMMENT''身份证号码'',
PRIMARY KEY(`studentNo`)
);
-----年级表
DROP TABLE IF EXISTS grade;
CREATE TABLE `grade`(
gradeID INT(4) NOT NULL COMMENT ''年级编号'',
gradeName VARCHAR(50) NOT NULL COMMENT''年级名称''
);
-----科目表
DROP TABLE IF EXISTS subject;
CREATE TABLE `subject`(
subjectNo INT(4) NOT NULL COMMENT ''课程编号'' PRIMARY KEY, #主键标识列 自增1
subjectName VARCHAR(50) COMMENT ''课程名称'',
classHour INT(4) COMMENT ''学时'',
gradeID INT(4) COMMENT ''年级编号''
);
-----成绩表
DROP TABLE IF EXISTS result;
CREATE TABLE `result`(
`studentNo` INT(4) NOT NULL COMMENT ''学号'',
`subjectNo` INT(4) NOT NULL COMMENT ''课程编号'',
`examDate` DATETIME NOT NULL COMMENT ''考试日期'',
`studentResult` INT(4) NOT NULL COMMENT ''考试成绩''
);
-----插入年级表
INSERT INTO `grade` VALUES (''1'', ''S1'');
INSERT INTO `grade` VALUES (''2'', ''S2'');
INSERT INTO `grade` VALUES (''3'', ''Y2'');
-----插入成绩表
INSERT INTO `result` VALUES (''10000'', ''1'', ''2016-02-15 00:00:00'', ''71'');
INSERT INTO `result` VALUES (''10000'', ''1'', ''2016-02-17 00:00:00'', ''60'');
INSERT INTO `result` VALUES (''10001'', ''1'', ''2016-02-17 00:00:00'', ''46'');
INSERT INTO `result` VALUES (''10002'', ''1'', ''2016-02-17 00:00:00'', ''83'');
INSERT INTO `result` VALUES (''10003'', ''1'', ''2016-02-17 00:00:00'', ''60'');
INSERT INTO `result` VALUES (''10004'', ''1'', ''2016-02-17 00:00:00'', ''60'');
INSERT INTO `result` VALUES (''10005'', ''1'', ''2016-02-17 00:00:00'', ''95'');
INSERT INTO `result` VALUES (''10006'', ''1'', ''2016-02-17 00:00:00'', ''93'');
INSERT INTO `result` VALUES (''10007'', ''1'', ''2016-02-17 00:00:00'', ''23'');
----插入学生表
INSERT INTO `student` VALUES (''10000'', ''123'', ''郭靖'', ''男'', ''1'', ''13645667783'', ''天津市河西区'', ''1990-09-08 00:00:00'', null, null);
INSERT INTO `student` VALUES (''10001'', ''123'', ''李文才'', ''男'', ''1'', ''13645667890'', ''地址不详'', ''1994-04-12 00:00:00'', null, null);
INSERT INTO `student` VALUES (''10002'', ''123'', ''李斯文'', ''男'', ''1'', ''13645556793'', ''河南洛阳'', ''1993-07-23 00:00:00'', null, null);
INSERT INTO `student` VALUES (''10003'', ''123'', ''张萍'', ''女'', ''1'', ''13642345112'', ''地址不详'', ''1995-06-10 00:00:00'', null, null);
INSERT INTO `student` VALUES (''10004'', ''123'', ''韩秋洁'', ''女'', ''1'', ''13812344566'', ''北京市海淀区'', ''1995-07-15 00:00:00'', null, null);
INSERT INTO `student` VALUES (''10005'', ''123'', ''张秋丽'', ''女'', ''1'', ''13567893246'', ''北京市东城区'', ''1994-01-17 00:00:00'', null, null);
INSERT INTO `student` VALUES (''10006'', ''123'', ''肖梅'', ''女'', ''1'', ''13563456721'', ''河北省石家庄市'', ''1991-02-17 00:00:00'', null, null);
INSERT INTO `student` VALUES (''10007'', ''123'', ''秦洋'', ''男'', ''1'', ''13056434411'', ''上海市卢湾区'', ''1992-04-18 00:00:00'', null, null);
INSERT INTO `student` VALUES (''10008'', ''123'', ''何晴晴'', ''女'', ''1'', ''13053445221'', ''广州市天河区'', ''1997-07-23 00:00:00'', null, null);
INSERT INTO `student` VALUES (''20000'', ''123'', ''王宝宝'', ''女'', ''2'', ''13318877954'', ''地址不详'', ''1995-09-10 00:00:00'', null, null);
INSERT INTO `student` VALUES (''20010'', ''123'', ''何小华'', ''女'', ''2'', ''13318877954'', ''地址不详'', ''1995-09-10 00:00:00'', null, null);
INSERT INTO `student` VALUES (''30011'', ''123'', ''陈志强'', ''女'', ''3'', ''13689965430'', ''地址不详'', ''1994-09-27 00:00:00'', null, null);
INSERT INTO `student` VALUES (''30012'', ''123'', ''李露露'', ''女'', ''3'', ''13685678854'', ''地址不详'', ''1992-09-27 00:00:00'', null, null);
-----插入科目表
INSERT INTO `subject` VALUES (''1'', ''Logic Java'', ''220'', ''1'');
INSERT INTO `subject` VALUES (''2'', ''HTML'', ''160'', ''1'');
INSERT INTO `subject` VALUES (''3'', ''Java OOP'', ''230'', ''2'');
-------------------------------检查Logic Java 课程最近一次考试 。如果成绩达到80分
--------------------------------以上者,则显示分数排在前5,名学员和分数
#1.获取Logic java 课程编号
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java";
#2.获取ogic Java最近一次考试日期
SELECT MAX(examDate) FROM result WHERE subjectNo=(
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java");
#3.找到考试达到80分的记录
SELECT subjectNo,studentResult
FROM result
WHERE subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName =''Logic Java'')
AND examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java"))
AND studentResult >80
#4.显示Logic Java最近一次考试前5名的学生信息
SELECT subjectNo,studentResult
FROM result
WHERE EXISTS(
SELECT subjectNo,studentResult
FROM result
WHERE subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName =''Logic Java'')
AND examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java"))
AND studentResult >80
)
AND subjectNo =(SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java")
AND examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java"))
ORDER BY studentResult DESC
LIMIT 5;
-------------------------------检查Logic Java 课程最近一次考试 。如果全部成绩未通过考试
--------------------------------(60分及格),认为本次考试偏难,计算的该次考试平均分加5分
#1.找到考试达到60分的记录
SELECT subjectNo,studentResult
FROM result
WHERE subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName =''Logic Java'')
AND examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java"))
AND studentResult >=60
#2.计算平均分加5分
SELECT AVG(studentResult)+5 AS 平均分
FROM result
WHERE NOT EXISTS(
SELECT subjectNo,studentResult
FROM result
WHERE subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName =''Logic Java'')
AND examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java"))
AND studentResult >=60
)
AND subjectNo =(SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java")
AND examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java"));
-----。。。。。。
UPDATE result SET studentResult=50 WHERE subjectNo=1 AND examDate=''2016-02-17''
Hive_LEFT SEMI JOIN / LEFT OUTER JOIN 与 (IN / NOT IN), (EXISTS / NOT EXISTS ) 分析
参考文章 : https://blog.csdn.net/happyrocking/article/details/79885071
本篇文章,我们主要就 Hive 中的 LEFT SEMI JOIN 和 (IN / NOT IN), (EXISTS / NOT EXISTS ) 子句查询做一个了解。
LEFT SEMI JOIN 基本认识
首先,我们先要了解下什么是 LEFT SEMI JOIN.
特点
1、left semi join 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。
2、left semi join 是只传递表的 join key 给 map 阶段,因此left semi join 中最后 select 的结果只许出现左表。
3、因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,而 join 则会一直遍历。这就导致右表有重复值得情况下 left semi join 只产生一条,join 会产生多条,也会导致 left semi join 的性能更高。
比如以下A表和B表进行 join 或 left semi join,然后 select 出所有字段,结果区别如下:
注意:蓝色叉的那一列实际是不存在left semi join中的,因为最后 select 的结果只许出现左表。
其实可以这么认为 LEFT SEMI JOIN 就是 子查询形式的 (IN / NOT IN), (EXISTS / NOT EXISTS ) 的替代方案。
因为 HIVE 0.13 版本之前,是不支持 (IN / NOT IN), (EXISTS / NOT EXISTS ) 中存在子查询语句的,此时我们需要使用 LEFT SEMI JOIN
文档如下:
构建基础的测试数据