文章目录
- 行子查询
- 预告
行子查询
前面的列子查询 就是一个属性值 和 一堆同样属性,但是不同值得列表进行比较操作的查询(不同的值 就是 不同的对象实例的属性值)
行查询呢?不需要比较不同实例 但是需要比较多个属性
当然 这个完全可以被列查询替代 只需要WHERE后面多几个AND 筛选就行了
当然 属性需要比较很多的时候 行子查询还是能排上用场(问题是用的不多)
案例 我们想找到员工中 入职年份与阮菜鸡相同 而且 奖金率相同的(NULL转换为0)
那么可以这么写:
SELECT
CONCAT_WS('-', `last_name`, `first_name`) AS 名字 ,
`hiredate` 入职时间,
IFNULL(`commission_pct`, 0) 奖金率
FROM
employees
WHERE (
`hiredate`,
IFNULL(`commission_pct`, 0)
) =
(SELECT
`hiredate`,
IFNULL(`commission_pct`, 0)
FROM
employees
WHERE `last_name` = '阮') ;
或者这么写更清楚:
WHERE (`hiredate`,IFNULL(`commission_pct`, 0) ) = ( SELECT `hiredate`, IFNULL(`commission_pct`, 0)
FROM
employees
WHERE `last_name` = '阮') ;
如果我想查 入职年份和我相同 但是奖金率比我高的呢?
一般是实现不了的
因为行子查询仅仅适用于 多个属性值 在同一个规则下的比较
如果相等 那就是都相等才行
因此 我用列查询 这么写:
SELECT
CONCAT_WS('-', `last_name`, `first_name`) AS 名字 ,
`hiredate` 入职时间,
IFNULL(`commission_pct`, 0) 奖金率
FROM
employees
WHERE `hiredate` = (
SELECT
`hiredate`
FROM
employees
WHERE `last_name` = '阮'
)
AND IFNULL(`commission_pct`, 0) > (
SELECT
IFNULL(`commission_pct`, 0)
FROM
employees
WHERE `last_name` = '阮'
);
我就可以随便更改 每个属性的比较规则了
比如 我这里吧奖金率比较改成大于号了
这样 就知道列查询更加灵活
当然你可以加一些判断语句来改造 不过我觉得属性少的情况下 列查询优势明显
有种可能,比如100个属性是等于比较的,1个属性是大于比较的,这样宁可添加一些IF来简洁代码。
预告
这里 我们子查询的重点就讲完了
接下来是SELECT EXIST FROM语句后面的子查询 算是轻松一下
前两个 也算是有点应用场景 不过用处不大 可以学一波(看别人代码 分析的时候用得到)
FROM倒是有用武之地的