1、什麼是子查詢:查詢中的查詢即為子查詢,一般使用括號將子查詢sql括起來,如下sql語句:
select * from (select * from user_info) users
2、什麼時候用子查詢:當在查詢過程中需要知道乙個已知量的不確定資料時使用子查詢。
select * from address where user_id=(select id from user_info where real_name='王曉明') ##使用子查詢先通過姓名獲取id,然後再通過使用者id查詢位址表
3、怎麼使用子查詢:如果子查詢只返回乙個結果,則可以使用=,也可以使用in;但是如果確定子查詢永遠只返回乙個結果,則不建議使用in,例如上面sql語句可變為如下sql語句
select * from address where user_id in(select id from user_info where real_name='王曉明');
多個表關聯查詢需要依據多表之間列關係將其連線起來,這種連線方式分為三種:內連線(inner join)、外連線(outer join)及交叉連線(cross join)
以下面乙個例子來說明內連線、外連線和交叉連線。
1、建立user_info表和address表,向兩個表中新增如下資料
#user_info表
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)
); #address表
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','吉林長春'); ##只有位址資訊,沒有使用者資訊。
2、現在我想查詢每個使用者的位址,該怎樣查詢?
select * from address where user_id in(select id from user_info)
輸出結果
分析:這種方式缺少了兩條不完整的資料(與這兩條sql語句對應的資料:insert into user_info values(3,'街角の風鈴','27w4921','李曉飛',9);insert into address values(6,6,'劉倩','13159775555','吉林長春');)
select ui.*,addr.*
from user_info ui
left join address addr on addr.user_id=ui.id
輸出結果
分析:這種方式缺少了一條不完整的資料(與sql語句:insert into address values(6,6,'劉倩','13159775555','吉林長春'); 對應的這條資料) 其中缺少位址資訊的那條資料也可以查詢到,其位址資訊用null填充。
select ui.*,addr.*
from user_info ui
right join address addr on addr.user_id=ui.id
輸出結果
分析:這種方式缺少了一條不完整的資料(與sql語句:insert into user_info values(3,'街角の風鈴','27w4921','李曉飛',9);對應的這條資料) 其中缺少使用者資訊的那條資料也可以查詢到,其使用者資訊用null填充。
select ui.*,addr.* from user_info ui full join address addr on ui.id = addr.user_id;
輸出結果
分析:mysql資料庫不支援全外連線。
select ui.*,addr.*
from user_info ui
inner join address addr on addr.user_id=ui.id
輸出結果
分析:這種方式缺少了兩條不完整的資料(與這兩條sql語句對應的資料:insert into user_info values(3,'街角の風鈴','27w4921','李曉飛',9);insert into address values(6,6,'劉倩','13159775555','吉林長春');)。位址資訊和使用者資訊不完整的資料都無法查詢。
select ui.*,addr.* from user_info ui cross join address addr order by ui.id
輸出結果
分析:顯示左表(cross join左邊的表)user_info的每一行資料與右表(cross join右邊的表)address所有行資料的交叉組合結果。
MySQL多表查詢與子查詢
多表查詢 多表查詢實際上根據查詢要求先將兩個表連線起來,形成一張新錶,再在新錶中查詢出滿足條件的記錄多表查詢可分為連線查詢和子查詢。一 連線查詢 可分為外連線和內連線 關於外鏈結的幾點說明 a 左外連線包括兩個表中滿足條件的行,再加上在join子句中指出的左表中不滿足的行。b 不滿足鏈結條件的行在結...
MySQL子查詢,多表查詢
為了便於介紹我們建立以下表 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 in...
mysql離散查詢 MySQL多表查詢與子查詢
多表查詢 多表查詢實際上根據查詢要求先將兩個表連線起來,形成一張新錶,再在新錶中查詢出滿足條件的記錄多表查詢可分為連線查詢和子查詢。a 左外連線包括兩個表中滿足條件的行,再加上在join子句中指出的左表中不滿足的行。b 不滿足鏈結條件的行在結果中顯示為null c.全外連線中參加連線的兩個表中的每一...