mysql子查询字符串位置_MySql基础-子查询
一、子查詢定義
定義:
子查詢允許把一個查詢嵌套在另一個查詢當中。
子查詢用()括起來
子查詢,又叫內部查詢,相對于內部查詢,包含內部查詢的就稱為外部查詢。
子查詢可以包含普通select可以包括的任何子句,比如:distinct、 group by、order by、limit、join和union等;但是對應的外部查詢必須是以下語句之一:select、insert、update、delete、set或 者do。
子查詢的位置:
select后(標量子查詢)、from 后(表子查詢)、where或having條件中(標量,行,列子查詢) 、exists后面(相關子查詢,表子查詢)
group by 和order by 中無實用意義。
二、子查詢分類:
按結果集的行列數分類:
標量子查詢:返回單一值的標量,最簡單的形式。
列子查詢:返回的結果集是 N 行一列。
行子查詢:返回的結果集是一行 N 列。
表子查詢:返回的結果集是 N 行 N 列。
可以使用的操作符:= > < >= <= <> ANY IN SOME ALL EXISTS
按子查詢返回值的數量分類:
標量子查詢 :會返回一個值,一般搭配著< >= <= = <>使用
多值子查詢:會返回一列、一行或者一個表,它們組成一個集合。
我們一般使用的any、in、all、some等詞,將外部查詢與子查詢的結果進行判斷、不排除特殊情況比如()=()。
如果將any、in、all、some等詞與標量子查詢,就會得到空的結果。
按子查詢位置分類:
where型子查詢:把內層查詢結果當作外層查詢的比較條件)
from型子查詢:把內層的查詢結果供外層再次查詢
exists型子查詢:把外層查詢結果拿到內層,看內層的查詢是否成立
按子查詢與外部查詢的依賴關系分類:
獨立子查詢:不依賴外部查詢而運行的子查詢
相關子查詢:是指引用了外部查詢列的子查詢,即子查詢會對外部查詢的每行進行一次計算。
1、標量子查詢:
是指子查詢返回的是單一值的標量,如一個數字或一個字符串,也是子查詢中最簡單的返回形式
可以使用 = > < >= <= <> 這些操作符對子查詢的標量結果進行比較,通常子查詢的位置在比較式的右側
#查詢大于平均年齡的學生
select * from stu age>(select avg(age) from stu)
#查詢王昭君的成績,并顯示成績
select * from scores where s_no=(select sid from stu where name='王昭君')
注意子查詢結果只能是一個值
2、列級子查詢
指子查詢返回的結果集是 一列N 行
因為子查詢返回的結果是多個值,不是一個結果,
所以不能直接使用 = > < >= <= <> 這些比較標量結果的操作符
需要IN、ANY、SOME 、ALL 操作符,搭配= > < >= <= <> 使用
#查詢18歲的學生成績,顯示成績
select * from score where stuid in (select stuid from stu where age=18)
select * from score where stuid > any (select stuid from stu where age=18)
select * from score where stuid > all (select stuid from stu where age=18)
注意:對于 子查詢中的表是空表的情況,語句均返回 NULL;
3、行級子查詢
指子查詢返回的結果集是一行 N 列,該子查詢的結果通常是對表的某行數據進行查詢而返回的結果集
select * from stu where sex='男' and age=26
#可以寫成
select * from stu where (sex,age)=('男',26)
#因此 ('男',26)里面兩個值可以寫成語句
select * from stu where (sex,age)=
(select sex,age from stu where sex='男' order by age limit 1)
#()與()字段個數要對應
4、表子查詢
指子查詢返回的結果集是 N 行 N 列的一個表數據
將子查詢結果充當一張表,要求必須起別名
select * from (select * from stu) as s
select* from article where (title,content,uid) in (select title,content,uid from blog)
select * from 表1
inner join (可以是查詢出來的結果當作數據源使用) as 別名
on 表1.字段=表2.字段
where 條件
#查詢數據庫和系統測試的課程成績
select * from score
inner join (select * from course where cname in ('數據庫','系統測試')) as c
on score.cid=c.cid
#比起
select * from score
inner join course on score.cid=c.cid
where course.cname in ('數據庫','系統測試')
#性能高一點
三、子查詢中特定的關鍵詞使用
1、 in 、not in
in 、 =any 、 =some :表示一個范圍內
not in 、 <>all:表示不在一個范圍內
2、 any| some 任意一個,只要條件滿足任意的一個,就返回TRUE
=any、 =some、 in:等于子查詢返回的結果
>any、 >some :大于子查詢返回的結果中任意一個值,就是大于最小值
!=any 、!=some:沒有意義,就是查了所有
3、 all 所有
=all:沒有意義,一個值不可能同時等于多個值
>all:大于子查詢返回的結果中所有值,就是大于最大值
!=all 、<>all 、not in:不等于子查詢返回的結果中所有值,就是非
4、 exists、not exists
用于檢查子查詢是否至少會返回一行數據,該子查詢實際上并不返回任何數據,而是返回值True或False,檢測 行 的存在
與其它謂詞和邏輯表達式不同的是,
無論輸入子查詢是否返回行,exists都不會返回unknown,
對于exists來說,unknown就是false
select... fromtable where exists (select........)
將主查詢的數據,放到子查詢中做條件驗證,根據驗證結果(TRUE 或 FALSE)來決定主查詢的數據結果是否得以保留
#獲得城市為hangzhou,并且存在訂單的用戶
select *
from table1
where city='hangzhou' and exists
(select *
from table2
where table1.customer_id=table2.customer_id);
四、子查詢優化
很多查詢中需要使用子查詢。使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以避免事務或者表鎖死。子查詢可以使查詢語 句很靈活,但子查詢的執行效率不高。
子查詢時,MySQL需要為內層查詢語句的查詢結果建立一個臨時表。然后外層查詢語句再臨時表中查詢記錄。查詢完畢 后,MySQL需要撤銷這些臨時表。因此,子查詢的速度會受到一定的影響。如果查詢的數據量比較大,這種影響就會隨之增大。
在MySQL中可以使用連接查 詢來替代子查詢。連接查詢不需要建立臨時表,其速度比子查詢要快。
如
例子1:
SELECT * FROM t1
WHERE t1.a1 NOT in (SELECT a2 FROM t2 )
優化后:
SELECT * FROM t1
LEFT JOIN t2 ON t1.a1=t2.a2
WHERE t2.a2 IS NULL
例子2:
SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog)
優化后:
SELECT * FROM article
inner join blog
on (article.title=blog.title AND article.content=blog.content AND article.uid=blog.uid)
練習:
1.查詢所有價格大于平均價格(保留2位小數)的商品,并按價格降序排序
select * from goods where price>
(select round(avg(price),2) from goods ) order by price desc
查詢價格大于或等于“超極本”價格的商品,并按價格降序排序
子查詢返回的是一列多行
select * from goods where price >=any
(select price from goods where cate='超極本' ) order by price desc
總結
以上是生活随笔為你收集整理的mysql子查询字符串位置_MySql基础-子查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java calendar field_
- 下一篇: linux cmake编译源码,linu