欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL里面的子查詢實(shí)例

 更新時間:2008年04月06日 01:12:20   作者:  
最近學(xué)習(xí)php+mysql執(zhí)行操作,發(fā)現(xiàn)了這一篇實(shí)例代碼
一,子選擇基本用法
1,子選擇的定義
子迭擇允許把一個查詢嵌套在另一個查詢當(dāng)中。比如說:一個考試記分項(xiàng)目把考試事件分為考試(T)和測驗(yàn)(Q)兩種情形。下面這個查詢就能只找出學(xué)生們的考試成績
select * from score where event_id in (select event_id from event where type='T');
2,子選擇的用法(3種)
        用子選擇來生成一個參考值
在這種情況下,用內(nèi)層的查詢語句來檢索出一個數(shù)據(jù)值,然后把這個數(shù)據(jù)值用在外層查詢語句的比較操作中。比如說,如果要查詢表中學(xué)生們在某一天的測驗(yàn)成績,就應(yīng)該使用一個內(nèi)層查詢先找到這一天的測驗(yàn)的事件號,然后在外層查詢語句中用這個事件號在成績表里面找到學(xué)生們的分?jǐn)?shù)記錄。具體語句為:
select * from score where 
id=(select event_id from event where date='2002-03-21' and type='Q');
需要注意的是:在應(yīng)用這種內(nèi)層查詢的結(jié)果主要是用來進(jìn)行比較操作的分法時,內(nèi)層查詢應(yīng)該只有一個輸出結(jié)果才對??蠢樱绻胫滥膫€美國總統(tǒng)的生日最小,構(gòu)造下列查詢
select * from president where birth=min(birth)
這個查詢是錯的!因?yàn)镸ySQL不允許在子句里面使用統(tǒng)計函數(shù)!min()函數(shù)應(yīng)該有一個確定的參數(shù)才能工作!所以我們改用子選擇:
select * from president where birht=(select min(birth) from presidnet);
        exists 和 not exists 子選擇
上一種用法是把查間結(jié)果由內(nèi)層傳向外層、本類用法則相反,把外層查詢的結(jié)果傳遞給內(nèi)層。看外部查詢的結(jié)果是否滿足內(nèi)部查間的匹配徑件。這種“由外到內(nèi)”的子迭擇用法非常適合用來檢索某個數(shù)據(jù)表在另外一個數(shù)據(jù)表里面有設(shè)有匹配的記錄

數(shù)據(jù)表t1                                        數(shù)據(jù)表t2
I1        C1                I2        C2
1
2
3        A

C                2
3
4        C

A
先找兩個表內(nèi)都存在的數(shù)據(jù)
select i1 from t1 where exists(select * from t2 where t1.i1=t2.i2);
再找t1表內(nèi)存在,t2表內(nèi)不存在的數(shù)據(jù)
select i1 form t1 where not exists(select * from t2 where t1.i1=t2.i2);

需要注意:在這兩種形式的子選擇里,內(nèi)層查詢中的星號代表的是外層查詢的輸出結(jié)果。內(nèi)層查詢沒有必要列出有關(guān)數(shù)據(jù)列的名字,田為內(nèi)層查詢關(guān)心的是外層查詢的結(jié)果有多少行。希望大家能夠理解這一點(diǎn)
        in 和not in 子選擇
在這種子選擇里面,內(nèi)層查詢語句應(yīng)該僅僅返回一個數(shù)據(jù)列,這個數(shù)據(jù)列里的值將由外層查詢語句中的比較操作來進(jìn)行求值。還是以上題為例
先找兩個表內(nèi)都存在的數(shù)據(jù)
select i1 from t1 where i1 in (select i2 from t2);
再找t1表內(nèi)存在,t2表內(nèi)不存在的數(shù)據(jù)
select i1 form t1 where i1 not in (select i2 from t2);
好象這種語句更容易讓人理解,再來個例子
比如你想找到所有居住在A和B的學(xué)生。
select * from student where state in(‘A','B')
二,        把子選擇查詢改寫為關(guān)聯(lián)查詢的方法。
1,匹配型子選擇查詢的改寫
下例從score數(shù)據(jù)表里面把學(xué)生們在考試事件(T)中的成績(不包括測驗(yàn)成績?。┎樵兂鰜?。
Select * from score where event_id in (select event_id from event where type='T');
可見,內(nèi)層查詢找出所有的考試事件,外層查詢再利用這些考試事件搞到學(xué)生們的成績。
這個子查詢可以被改寫為一個簡單的關(guān)聯(lián)查詢:
Select score.* from score, event where score.event_id=event.event_id and event.event_id='T';
下例可以用來找出所有女學(xué)生的成績。
Select * from score where student_id in (select student_id form student where sex = ‘f');
可以把它轉(zhuǎn)換成一個如下所示的關(guān)聯(lián)查詢:
Select * from score
Where student _id =student.student_id and student.sex ='f';
把匹配型子選擇查詢改寫為一個關(guān)聯(lián)查詢是有規(guī)律可循的。下面這種形式的子選擇查詢:
Select * from tablel
Where column1 in (select column2a from table2 where column2b = value);
可以轉(zhuǎn)換為一個如下所示的關(guān)聯(lián)查詢:
Select tablel. * from tablel,table2
Where table.column1 = table2.column2a and table2.column2b = value;
(2)非匹配(即缺失)型子選擇查詢的改寫
子選擇查詢的另一種常見用途是查找在某個數(shù)據(jù)表里有、但在另一個數(shù)據(jù)表里卻沒有的東西。正如前面看到的那樣,這種“在某個數(shù)據(jù)表里有、在另一個數(shù)據(jù)表里沒有”的說法通常都暗示著可以用一個left join 來解決這個問題。請看下面這個子選擇查詢,它可以把沒有出現(xiàn)在absence數(shù)據(jù)表里的學(xué)生(也就是那些從未缺過勤的學(xué)生)給查出來:
Select * from student
Where student_id not in (select student_id from absence);
這個子選擇查詢可以改寫如下所示的left join 查詢:
Select student. *
From student left join absence on student.student_id =absence.student_id
Where absence.student_id is null;
把非匹配型子選擇查詢改寫為關(guān)聯(lián)查詢是有規(guī)律可循的。下面這種形式的子選擇查詢:
Select * from tablel
Where column1 not in (select column2 from table2);
可以轉(zhuǎn)換為一個如下所示的關(guān)聯(lián)查詢:
Select tablel . *
From tablel left join table2 on tablel.column1=table2.column2
Where table2.column2 is null;
注意:這種改寫要求數(shù)據(jù)列table2.column2聲明為not null。

相關(guān)文章

  • mysql中workbench實(shí)例詳解

    mysql中workbench實(shí)例詳解

    在本篇文章里小編給大家分享了關(guān)于mysql中workbench實(shí)例內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2019-01-01
  • 完美解決mysql in條件語句只讀取一條信息問題的2種方案

    完美解決mysql in條件語句只讀取一條信息問題的2種方案

    使用mysql多表查詢時一個表中的某個字段作為另一表的in查詢條件,只能讀取一條信息,而直接用數(shù)字的話可以正常讀取
    2018-04-04
  • MySQL遞歸sql語句WITH表達(dá)式實(shí)現(xiàn)方法代碼

    MySQL遞歸sql語句WITH表達(dá)式實(shí)現(xiàn)方法代碼

    SQL遞歸查詢語句是指通過遞歸方式對數(shù)據(jù)進(jìn)行查詢的語句,下面這篇文章主要給大家介紹了關(guān)于MySQL遞歸sql語句WITH表達(dá)式實(shí)現(xiàn)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • MySQL關(guān)鍵字問題分析與解決方案

    MySQL關(guān)鍵字問題分析與解決方案

    在實(shí)際開發(fā)中,我們常常會遇到由于SQL語法錯誤導(dǎo)致的數(shù)據(jù)庫操作應(yīng)用不能正常運(yùn)行的情況,其中,使用了MySQL關(guān)鍵字作為表名或字段名,而沒有邏輯地處理,帶來的問題最為常見,本文將從一個實(shí)際案例出發(fā),深入分析關(guān)鍵字問題及其解決方案,并提供進(jìn)一步優(yōu)化與避免方案
    2024-12-12
  • mysql刪除操作其實(shí)是假刪除問題

    mysql刪除操作其實(shí)是假刪除問題

    這篇文章主要介紹了mysql刪除操作其實(shí)是假刪除問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 一條SQL語句在MySQL中是如何執(zhí)行的

    一條SQL語句在MySQL中是如何執(zhí)行的

    本篇文章會分析下一個sql語句在mysql中的執(zhí)行流程,包括sql的查詢在mysql內(nèi)部會怎么流轉(zhuǎn),sql語句的更新是怎么完成的,需要的朋友可以參考一下
    2021-10-10
  • 細(xì)談Mysql的存儲過程和存儲函數(shù)

    細(xì)談Mysql的存儲過程和存儲函數(shù)

    存儲函數(shù)與存儲過程作用類同,不同的是存儲過程只能使用CALL語句來調(diào)用存儲過程,只能用輸出變量返回值,而存儲函數(shù)可以從語句外調(diào)用(即通過引用函數(shù)名),也能返回標(biāo)量值。下面小編給大家詳細(xì)講一講
    2019-05-05
  • MySQL中DML添加數(shù)據(jù)insert的操作方法

    MySQL中DML添加數(shù)據(jù)insert的操作方法

    DML英文全稱Data Manipulation Language數(shù)據(jù)操作語言,用來對數(shù)據(jù)庫中表的數(shù)據(jù)記錄進(jìn)行增、刪、改在實(shí)際開發(fā)過程中使用比較多,務(wù)必掌握操作,這篇文章主要介紹了MySQL中DML添加數(shù)據(jù)insert的操作方法,需要的朋友可以參考下
    2023-07-07
  • MySQL徹底卸載并且重新安裝教程

    MySQL徹底卸載并且重新安裝教程

    本文詳細(xì)介紹了卸載和重新安裝MySQL的步驟,包括停止MySQL服務(wù)、卸載軟件、清理殘余文件、刪除注冊表、刪除環(huán)境變量配置等,重新安裝時,需要下載MySQL、配置環(huán)境變量、新建配置文件、初始化MySQL服務(wù)、注冊MySQL服務(wù)、啟動MySQL服務(wù)、修改默認(rèn)賬戶密碼以及登錄MySQL
    2025-01-01
  • Mysql表數(shù)據(jù)比較大情況下修改添加字段的方法實(shí)例

    Mysql表數(shù)據(jù)比較大情況下修改添加字段的方法實(shí)例

    最近遇到的一個問題,需要在一張1800萬數(shù)據(jù)量的表中添加加一個字段,所以這篇文章主要給大家介紹了關(guān)于Mysql表數(shù)據(jù)比較大情況下修改添加字段的方法,需要的朋友可以參考下
    2022-06-06

最新評論