加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL教程mysql子查询的实例总结

发布时间:2020-12-12 02:25:24 所属栏目:MySql教程 来源:网络整理
导读:《MYSQL教程mysql子查询的实例总结》要点: 本文介绍了MYSQL教程mysql子查询的实例总结,希望对您有用。如果有疑问,可以联系我们。 导读:本节内容:mysql子查询一、有 = = = 的子查询格局:SELECT col1,col2,col3 FROM tbWHERE col = [ANY | SO... MYSQL数

《MYSQL教程mysql子查询的实例总结》要点:
本文介绍了MYSQL教程mysql子查询的实例总结,希望对您有用。如果有疑问,可以联系我们。

导读:本节内容:mysql子查询一、有 = <> > < >= <= 的子查询格局:SELECT col1,col2,col3 FROM tbWHERE col = [ANY | SO...

MYSQL数据库本节内容:
mysql子查询

MYSQL数据库一、有 = <> > < >= <= 的子查询
格局:
?

SELECT col1,col3
FROM tb
WHERE col = [ANY | SOME | ALL](
SELECT coln FROM tb WHERE ...
)?

MYSQL数据库例子:
?

SELECT `ID`,`classname`
FROM `ydfzx_software_class`
WHERE `fatherid` = ANY(
SELECT `id`
FROM `ydfzx_software_class`
WHERE `fatherid`=13
)

MYSQL数据库子查询返回一个离散值(一列一行),假如有ANY或ALL的修饰,可以返回一个离散值列表(一列多行),其实 col = ANY 就相当于col IN.

MYSQL数据库二、IN 子查询
格局:
?

SELECT col1,col3
FROM tb
WHERE col [NOT] IN(
SELECT coln FROM tb WHERE ...
)?

MYSQL数据库在有IN谓词的这个子查询中,返回一个离散值列表(一列多行).

MYSQL数据库三、SELECT ROW 字查询,注意返回值是0或1
格局:
?

SELECT ROW(value1,value2,value3 ...) = [ANY | SOME] SELECT col1,col3

MYSQL数据库如果第2条查询必需返回一组离散值(多列单行),如果有ANY和SOME谓词的修饰,返回一组离散值列表

MYSQL数据库例子:
?

SELECT ROW(1,'操作系统',1) = ANY (SELECT `ID`,`caption`,`status` FROM `ydfzx_software_class`)
?

MYSQL数据库在`ydfzx_software_class`里查找有没有`ID`=1,`caption`='操作系统',`status`=1的记载,有就返回1,没有就返回NULL 或 0.

MYSQL数据库四、EXISTS 子查询
格局:
?

SELECT col1,col2 FROM a WHERE EXISTS(SELECT ...)
?

MYSQL数据库解释:
主查询先查询出数据,再逐条通过EXISTS子查询验证,只有子查询返回的记录数不为0时,主查询中的记录有效.
这个查询开销比拟大.

MYSQL数据库例子:
?

users表
┏━━━┯━━━┯━━━━┓
┃ uid │ name?│address ┃
┃ 1?│张荣?│中光 ┃
┃ 2?│晨光?│fuyang ┃
┃ 3?│川湘?│中光 ┃
┃ 4?│张荣?│浙江 ┃
┗━━━┷━━━┷━━━━┛
xl表
┏━━━┯━━━┯━━━━┓
┃ uid │ xl?│year? ┃
┃ 1?│大专?│2007? ┃
┃ 1?│大本?│2008? ┃
┃ 1?│硕士?│2009? ┃
┃ 2?│小学?│2012? ┃
┃ 2?│初中?│2018? ┃
┃ 2?│高中?│2021? ┃
┃ 2?│大本?│2025? ┃
┃ 4?│大本?│2025? ┃
┃ 5?│大本?│2025? ┃
┃ 3?│大专?│1995? ┃
┃ 3?│大本?│2001? ┃
┗━━━┷━━━┷━━━━┛

MYSQL数据库例子:找出users表中那些在xl表中有xl=小学的记录,他们的共同键为id
?

SELECT *
FROM `users`
WHERE EXISTS (
SELECT *
FROM `xl`
WHERE `xl`.`uid` = `users`.`uid` AND xl = '小学'
)
?

MYSQL数据库等效于:
?

SELECT `users`. *
FROM `users`,`xl`
WHERE `xl`.`xl` = '小学' AND `users`.`uid` = `xl`.`uid`

MYSQL数据库结果为:
┏━━━┯━━━┯━━━━┓
┃ uid │name │address ┃
┃ 2 │晨光 │fuyang ┃
┗━━━┷━━━┷━━━━┛

MYSQL数据库五、衍生数据表子查询
格局: SELECT ... FROM (SELECT ...) AS name WHERE .
首先执行子查询生成临时表,外层查询再到此临时表中获取数据.
例子:
?

SELECT `users`.`uid`,`users`.`name`,count( `xl`.`uid` ) AS lcount
FROM `users`,`xl`
WHERE `users`.`uid` = `xl`.`uid`
GROUP BY `users`.`uid`
ORDER BY `lcount` DESC

MYSQL数据库等效于:
?

SELECT *
FROM(
SELECT `users`.`uid`,`xl`
WHERE `users`.`uid` = `xl`.`uid`
GROUP BY `users`.`uid`
) AS `temp`
ORDER BY `lcount` DESC

MYSQL数据库实用例子:
有一存储树形目录的表tb,共有3个字段,ID,classname,fatherid,每个节点一条记录.ID字段为非重复字段,classname为此节点的名称,每个子节点的fatherid等于其父节点的ID,如果fatherid为0,表现它为顶层节点,如何能一次就查询出各顶层节点有没有子节点呢,经过调试,以下语句执行成功.
?

MYSQL数据库SELECT `ID`,`classname`,`fatherid`,

MYSQL数据库IF(
(SELECT COUNT(`ID` )
FROM `tb`
WHERE `fatherid` = `main`.`ID`
) >0,1,0) AS `haveson`

MYSQL数据库FROM `tb` AS `main`
WHERE `fatherid` =0

二、一次性查询出某节点的兄弟节点
SELECT *
FROM `tb`
WHERE `fatherid`=(SELECT `fatherid` FROM `tb` WHERE `ID`=6)3、一次性查询出某节点的父辈节点
SELECT *
FROM `tb`
WHERE `fatherid`=(
SELECT `fatherid`
FROM `tb`
WHERE `ID`=(SELECT `fatherid` FROM `tb` WHERE `ID`=13)
)

编程之家PHP培训学院每天发布《MYSQL教程mysql子查询的实例总结》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读