1. 程式人生 > 其它 >MySQL(十一) DQL多表連結查詢基本使用

MySQL(十一) DQL多表連結查詢基本使用

技術標籤:資料庫&訊息佇列mysql資料庫sql

MySQL DQL多表連結查詢基本使用

多表查詢思路:
  • joininner join 簡寫
1.資料來自多張表,優先想到多表連線join ON

2.關聯表寫join兩端

3.on條件寫兩表的關聯列

4.所有查詢條件select後,注意表名和別名

5.where過濾條件寫最後
  • **註釋:**INNER JOIN 與 逗號多表 是相同的。

    select * from student,sc where student.sno=sc.sno;   '相同'   select * from student inner
    join sc on student.sno=sc.sno;
  • inner join是內連線,顯示符合連線條件的記錄,連線條件已經指明瞭。與直接使用where 條件過濾條件一樣的兩個表符合條件的資料。

  • left join 左連線查詢結果是以左邊的表為主,右表的資料匹配不到的欄位為null;

  • right join 右連線查詢結果以右邊的表為主,左表的資料匹配不到的欄位為null;

MySQL官方示例庫

下載地址

備用下載地址

兩張表查詢:
#查詢一下世界上人口數量小於100人的城市名和國家名
select city.countrycode as daihao, country.name as guojia,city.name as chengshi,city.population as renkou from city join
country on country.code=city.countrycode where city.population<100;

img

#查詢城市shenyang,城市人口,所在國家名(name)及國土面積(surfacearea)
select country.name,city.name,country.SurfaceArea from city join country on city.countrycode=country.code where city.name='shenyang';

img

#查詢城市為heze,城市人口,所在國家名(name),及國土面積(surfacearea)
select country.name,city.name,city.population,country.surfacearea from city join country on city.countrycode=country.code where city.name='heze';

img


案例:

建立school庫:

CREATE DATABASE school CHARSET utf8;
USE school
建立學生表:
CREATE TABLE student(
sno INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '學號',
sname VARCHAR(20) NOT NULL COMMENT '姓名',
sage  TINYINT UNSIGNED  NOT NULL COMMENT '年齡',
ssex  ENUM('f','m') NOT NULL DEFAULT 'm' COMMENT '性別'
)ENGINE=INNODB CHARSET=utf8;

student(sno,sname,sage,ssex) 學生表 
sno:  學號;
sname:學生姓名;
sage: 學生年齡;
ssex: 學生性別;
建立課程表:
CREATE TABLE course(
cno INT NOT NULL PRIMARY KEY COMMENT '課程編號',
cname VARCHAR(20) NOT NULL COMMENT '課程名字',
tno INT NOT NULL COMMENT '教師編號'
)ENGINE=INNODB CHARSET utf8;

course(cno,cname,tno) 課程表 
cno:  課程編號;
cname:課程名字;
tno:  教師編號 ;
建立成績表:
CREATE TABLE sc (
sno INT NOT NULL COMMENT '學號',
cno INT NOT NULL COMMENT '課程編號',
score INT  NOT NULL DEFAULT 0 COMMENT '成績'
)ENGINE=INNODB CHARSET=utf8;

sc(sno,cno,score) 成績表 
sno:  學號;
cno:  課程編號;
score:成績 ;
建立教師表:
CREATE TABLE teacher(
tno INT NOT NULL PRIMARY KEY COMMENT '教師編號',
tname VARCHAR(20) NOT NULL COMMENT '教師名字'
)ENGINE=INNODB CHARSET utf8;

teacher(tno,tname)  教師表 
tno:  教師編號; 
tname:教師名字;
學生表中錄入N為學生:
INSERT INTO student(sno,sname,sage,ssex) VALUES(1,'zhang3',18,'m');

INSERT INTO student(sno,sname,sage,ssex) VALUES (2,'zhang4',18,'m'),(3,'li4',18,'m'),(4,'wang5',19,'f');

INSERT INTO student VALUES(5,'zh4',18,'m'),(6,'zhao4',18,'m'),(7,'ma6',19,'f');

INSERT INTO student(sname,sage,ssex) VALUES('olda',20,'m'),('oldgirl',20,'f'),('oldp',25,'m');
教師表中錄入三位老師:
INSERT INTO teacher(tno,tname) VALUES(101,'olda'),(102,'hesw'),(103,'oldguo');
課程表中錄入三門課程:
INSERT INTO course(cno,cname,tno) VALUES(1001,'linux',101),(1002,'python',102),(1003,'mysql',103);
成績表中錄入學生成績:
INSERT INTO sc(sno,cno,score)
VALUES
(1,1001,80),
(1,1002,59),
(2,1002,90),
(2,1003,100),
(3,1001,99),
(3,1003,40),
(4,1001,79),
(4,1002,61),
(4,1003,99),
(5,1003,40),
(6,1001,89),
(6,1003,77),
(7,1001,67),
(7,1003,82),
(8,1001,70),
(9,1003,80),
(10,1003,96);
SQL練習題:

group_concat()函式是以一行顯示所有查詢到的值

統計zhang3,學習了幾門課:
select st.sname,count(sc.sno) from student as st join sc on st.sno=sc.sno where st.sname='zhang3';

img

查詢zhang3,學習的課程名稱有哪些:
select st.sname,co.cname from student as st join sc on st.sno=sc.sno join course as co on sc.cno=co.cno where st.sname='zhang3';select st.sname,group_concat(co.cname) from student as st join sc on st.sno=sc.sno join course as co on sc.cno=co.cno where st.sname='zhang3';

img

查詢olda老師教的學生名:
select te.tname,group_concat(st.sname) from teacher as te join course as co on te.tno=co.tno join sc on co.cno=sc.cno join student as st on st.sno=sc.sno where te.tname='olda';

img

查詢olda所教課程的平均分數:
select te.tname,avg(sc.score) from teacher as te join course as co on te.tno=co.tno join sc on co.cno=sc.cno where te.tname='olda';

img

查詢olda所教的80分以上的學生姓名:
select te.tname,st.sname,sc.score from teacher as te join course as co on te.tno=co.tno join sc on co.cno=sc.cno join student as st on sc.sno=st.sno where te.tname='olda' and sc.score>=80;

olda所教的80分以上的學生姓名:

select te.tname,st.sname,sc.score from teacher as te join course as co on te.tno=co.tno join sc on co.cno=sc.cno join student as st on sc.sno=st.sno where te.tname='olda' and sc.score>=80;

img