数据库学习之MySQL (十九)—— 子查询(二)WHERE 行子查询

MySQL学习专栏 正在持续更新中:)

文章目录

行子查询

前面的列子查询 就是一个属性值 和 一堆同样属性,但是不同值得列表进行比较操作的查询(不同的值 就是 不同的对象实例的属性值)
行查询呢?不需要比较不同实例 但是需要比较多个属性

当然 这个完全可以被列查询替代 只需要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` = '阮'
);

我就可以随便更改 每个属性的比较规则了
比如 我这里吧奖金率比较改成大于号了

这样 就知道列查询更加灵活

扫描二维码关注公众号,回复: 9010984 查看本文章

当然你可以加一些判断语句来改造 不过我觉得属性少的情况下 列查询优势明显
有种可能,比如100个属性是等于比较的,1个属性是大于比较的,这样宁可添加一些IF来简洁代码。

预告

这里 我们子查询的重点就讲完了
接下来是SELECT EXIST FROM语句后面的子查询 算是轻松一下
前两个 也算是有点应用场景 不过用处不大 可以学一波(看别人代码 分析的时候用得到)
FROM倒是有用武之地的

下一站:数据库学习之MySQL (二十)—— 子查询 (三)SELECT EXIST FROM

发布了28 篇原创文章 · 获赞 24 · 访问量 8923

猜你喜欢

转载自blog.csdn.net/weixin_43178828/article/details/104182709