日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql子查询字符串位置_MySql基础-子查询

發布時間:2025/3/12 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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基础-子查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。