MySQL子查詢,多表查詢

2021-09-22 10:33:22 字數 4037 閱讀 7343

為了便於介紹我們建立以下表:

create

table user_info(

id int(2

)primary

key,

user_name varchar(12

)unique

, password varchar(15

)not

null

, real_name varchar(8

)not

null

, age int(3

));create

table address(

id int(2

)primary

key,

user_id int(2

)not

null

, real_name varchar(8

),mobile char(11

),address varchar

(150))

;insert

into user_info values(1

,'淺唱灬幸福'

,'8912@321'

,'王曉明',12

);insert

into address values(1

,1,'王小明'

,'15516472282'

,'山西太原');

insert

into address values(2

,1,'王鑫'

,'18404905139'

,'山西大同');

insert

into address values(3

,1,'任建'

,'15333021730'

,'山西晉城');

insert

into user_info values(2

,'ぅ浮生若夢〤'

,'56701wz'

,'王楠',36

);insert

into address values(4

,2,'王楠'

,'15010303314'

,'北京海淀');

insert

into address values(5

,2,'趙婕'

,'18435224278'

,'山西長治');

insert

into user_info values(3

,'街角の風鈴'

,'27w4921'

,'李曉飛',9

);insert

into address values(6

,6,'劉倩'

,'13159775555'

,'吉林長春'

);

sql是一種結構化查詢語言,它允許乙個查詢作為子查詢巢狀在另乙個select語句中。

1、集合的比較引出的子查詢

例如查詢出比王曉明年齡大的買家資訊,我們首先要得到王曉明的年齡:

select age from user_info where real_name =

'王曉明'

將它作為子查詢,我們得到該查詢的sql語句:

select

*from user_info

where age>

all(

select age from user_info where real_name =

'王曉明'

)

查詢結果:

此處比較方式有any,all

2、in引出的子查詢

在address中查詢出與王小明的user_id相同的所有使用者的真實姓名。

首先得到王小明的user_id

select user_id from address where real_name =

'王小明'

將它作為子查詢:

select real_name

from address

where user_id in

(select user_id from address where real_name =

'王小明'

)

查詢結果:王小明,王鑫,任建

多個表關聯查詢需要依據多表之間列關係將其連線起來,這種連線方式分為三種:內連線(inner join)、外連線(outer join)及交叉連線(cross join)

1、內連線(inner join)

select ui.

*,addr.

*from user_info ui [

inner

]join address addr on ui.id = addr.user_id;

#顯式等值連線

select ui.

*,addr.

*from user_info ui,address addr where ui.id = addr.user_id;

#隱式等值連線

執行結果:

2、外連線(outer join)

左外連線(left [outer] join)

返回的結果集中不僅包含表之間滿足on連線條件的全部資料行,還包含左表(「left [outer] join」關鍵字左邊的表)不滿足on連線條件的資料行;

select ui.

*,addr.

*from user_info ui left

join address addr on ui.id = addr.user_id;

執行結果:

右外連線(right [outer] join)

返回的結果集中不僅包含表之間滿足on連線條件的全部資料行,還包含右表(即「right [outer] join」關鍵字右邊的表)不滿足on連線條件的資料行。

select ui.

*,addr.

*from user_info ui right

join address addr on ui.id = addr.user_id;

執行結果:

全外連線(full [outer] join)

返回的結果集中不僅包含表之間滿足on連線條件的全部資料行,還包含左表(「full [outer] join」關鍵字左邊的表)和右表(「full [outer join」關鍵字右邊的表)中不滿足on連線條件的資料行。

mysql中沒有全外鏈結,所以在此我們不在舉例。

交叉連線(cross join)

左表(「cross join」關鍵字左邊的表)中的每一行與右表(「cross join」關鍵字右邊的表)中的所有行組合,交叉聯接的結果是乙個笛卡爾積

select ui.

*,addr.

*from user_info ui cross

join address addr;

執行結果:

此種查詢無實際意義。

MySQL子查詢與多表查詢

1 什麼是子查詢 查詢中的查詢即為子查詢,一般使用括號將子查詢sql括起來,如下sql語句 select from select from user info users2 什麼時候用子查詢 當在查詢過程中需要知道乙個已知量的不確定資料時使用子查詢。select from address where...

MySQL多表查詢與子查詢

多表查詢 多表查詢實際上根據查詢要求先將兩個表連線起來,形成一張新錶,再在新錶中查詢出滿足條件的記錄多表查詢可分為連線查詢和子查詢。一 連線查詢 可分為外連線和內連線 關於外鏈結的幾點說明 a 左外連線包括兩個表中滿足條件的行,再加上在join子句中指出的左表中不滿足的行。b 不滿足鏈結條件的行在結...

MySQL 多表關聯子查詢

select from major subject discussion a join select id from fa user a join select class from major subject classes a join select subject no from major ...