Mysql 語句複習-左右連接就是這麼簡單

mysql 內置語句


mysql> create database testdatabase;
Query OK, 1 row affected (0.02 sec)

mysql> use testdatabase
Database changed

mysql> show tables;
Empty set (0.00 sec)
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| my |
| mysql |
| performance_schema |
| sys |
| testdatabase |
±-------------------+

mysql> exit
Bye

準備表、數據


建學生表

CREATE TABLE Student(Sno VARCHAR(10),Sname NVARCHAR(10),Sage DATETIME,Ssex NVARCHAR(10));

INSERT INTO Student VALUES(‘01’ , ‘趙雷’ , ‘1990-01-01’ , ‘男’);
INSERT INTO Student VALUES(‘02’ , ‘錢電’ , ‘1990-12-21’ , ‘男’);
INSERT INTO Student VALUES(‘03’ , ‘孫風’ , ‘1990-05-20’ , ‘男’);
INSERT INTO Student VALUES(‘04’ , ‘李雲’ , ‘1990-08-06’ , ‘男’);
INSERT INTO Student VALUES(‘05’ , ‘周梅’ , ‘1991-12-01’ , ‘女’);
INSERT INTO Student VALUES(‘06’ , ‘吳蘭’ , ‘1992-03-01’ , ‘女’);
INSERT INTO Student VALUES(‘07’ , ‘鄭竹’ , ‘1989-07-01’ , ‘女’);
INSERT INTO Student VALUES(‘08’ , ‘王菊’ , ‘1990-01-20’ , ‘女’) ;

####建課程表

CREATE TABLE Course(Cno VARCHAR(10),Cname NVARCHAR(10),Tno VARCHAR(10));
INSERT INTO Course VALUES(‘01’ , ‘語文’ , ‘02’);
INSERT INTO Course VALUES(‘02’ , ‘數學’ , ‘01’);
INSERT INTO Course VALUES(‘03’ , ‘英語’ , ‘03’);

建課程表

CREATE TABLE Teacher(Tno VARCHAR(10),Tname NVARCHAR(10));
INSERT INTO Teacher VALUES(‘01’ , ‘張三’);
INSERT INTO Teacher VALUES(‘02’ , ‘李四’);
INSERT INTO Teacher VALUES(‘03’ , ‘王五’);

建成績表

CREATE TABLE SC(Sno VARCHAR(10),Cno VARCHAR(10),score DECIMAL(18,1));
INSERT INTO SC VALUES(‘01’ , ‘01’ , 80);
INSERT INTO SC VALUES(‘01’ , ‘02’ , 90);
INSERT INTO SC VALUES(‘01’ , ‘03’ , 99);
INSERT INTO SC VALUES(‘02’ , ‘01’ , 70);
INSERT INTO SC VALUES(‘02’ , ‘02’ , 60);
INSERT INTO SC VALUES(‘02’ , ‘03’ , 80);
INSERT INTO SC VALUES(‘03’ , ‘01’ , 80);
INSERT INTO SC VALUES(‘03’ , ‘02’ , 80);
INSERT INTO SC VALUES(‘03’ , ‘03’ , 80);
INSERT INTO SC VALUES(‘04’ , ‘01’ , 50);
INSERT INTO SC VALUES(‘04’ , ‘02’ , 30);
INSERT INTO SC VALUES(‘04’ , ‘03’ , 20);
INSERT INTO SC VALUES(‘05’ , ‘01’ , 76);
INSERT INTO SC VALUES(‘05’ , ‘02’ , 87);
INSERT INTO SC VALUES(‘06’ , ‘01’ , 31);
INSERT INTO SC VALUES(‘06’ , ‘03’ , 34);
INSERT INTO SC VALUES(‘07’ , ‘02’ , 89);
INSERT INTO SC VALUES(‘07’ , ‘03’ , 98);

查詢語句


SELECT * FROM sc ;
這裏寫圖片描述
SELECT * FROM sc WHERE cno =‘01’
這裏寫圖片描述

SELECT * FROM sc WHERE cno = ‘02’
在這裏插入圖片描述

  • SELECT * FROM sc WHERE cno =‘01’)a 與SELECT * FROM sc WHERE cno = ‘02’)b 等值連接

SELECT * FROM( SELECT * FROM sc WHERE cno =‘01’)a JOIN (SELECT * FROM sc WHERE cno = ‘02’)b ON a.sno= b.sno;
這裏寫圖片描述

  • SELECT * FROM sc WHERE cno =‘01’)a 與SELECT * FROM sc WHERE cno = ‘02’)b 右連接連接,結果會多顯示語句中右表b(因爲是右連接)中沒有匹配的行

SELECT * FROM( SELECT * FROM sc WHERE cno =‘01’)a RIGHT JOIN (SELECT * FROM sc WHERE cno = ‘02’)b ON a.sno= b.sno;
這裏寫圖片描述

  • SELECT * FROM sc WHERE cno =‘01’)a 與SELECT * FROM sc WHERE cno = ‘02’)b 左連接,結果會多顯示語句中左表a(因爲是左連接)中沒有匹配的行

SELECT * FROM( SELECT * FROM sc WHERE cno =‘01’)a LEFT JOIN (SELECT * FROM sc WHERE cno = ‘02’)b ON a.sno= b.sno;
這裏寫圖片描述


以下驗證結果是否如上我說,這是a左連接b,連接條件由a.sno= b.sno 換成b.sno= a.sno ,結果還是多顯示a,即語句左邊的沒有匹配的行

SELECT * FROM( SELECT * FROM sc WHERE cno =‘02’)a LEFT JOIN (SELECT * FROM sc WHERE cno = ‘01’)b ON b.sno= a.sno;

這裏寫圖片描述

換其他表驗證,也是符合的。

SELECT * FROM( SELECT * FROM sc WHERE cno =‘01’)a RIGHT JOIN sc ON a.sno= sc.sno;
這裏寫圖片描述
//以a表爲條件,向右邊的sc連接(對接),對接更好理解,能以sno對接正確的
對接,若sc中有而a表有沒有,則顯示a這行爲空,sc顯示該行實際記錄。右連接一直是保留右邊沒有對接多餘的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章