日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL基础(三)表关系及数据的增删改查

發布時間:2025/3/17 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL基础(三)表关系及数据的增删改查 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這一部分主要使用SQL中的DML,數據庫操作語言(data manipulation language),對數據庫數據進行增、刪、改、查操作,作為前提,先介紹關系型數據庫中的表關系。

關系型數據庫(RDBMS)

MySQL作為關系型數據庫,數據是存儲在表中的,假如設計一個訂單系統,可能包含以下信息:

  • 供應商(Vendors)
  • 產品目錄(Products)
  • 客戶列表(Customers)
  • 訂單(Orders)
  • 可能還會為產品打上一些標簽(比如,新品,進口商品,本地特產等)

每個表中都有個特殊的列(字段),稱為主鍵(Primary Key),其值用來唯一標識表中的一行數據(記錄)。表中還可以有稱為外鍵(Foreign Key)的列,引用同一個表或不同表中某行的主鍵。因此,通過外鍵,表與表之間是有關聯關系的,這也是建立關系型數據庫模型的基礎。

下面我們試著設計一下這個訂單系統的表結構,就拿其中的供應商(Vendors)和產品目錄(Products)來說:

供應商表(Vendors):

列說明主鍵/外鍵
vendor_id供應商唯一ID,PK
vend_name供應商名字
vend_address供應商地址


產品目錄表(Products):

列說明主鍵/外鍵
prod_id產品唯一IDPK
prod_name產品名字
prod_price產品價格
vendor_id供應商ID(關聯Vendors表的vendor_id列)FK


Products表存放產品記錄,每個產品都有prod_name, prod_price,并且有唯一的prod_id作為主鍵。除此之外,還有一個外鍵vendor_id,引用Vendors表中的vend_id,通過這種方式,為每個產品指定了供應商。我們不需要在產品表中再添加更多的列來存儲其供應商的具體信息,以后直接根據這個外鍵,去Vendors表中查詢即可。

從中我們可以看出,關系型數據庫在存儲數據時是很高效的,避免了數據冗余。而且,關系型數據庫的可伸縮性遠比非關系型數據庫要好。比如,對數據庫中供應商名字,地址等信息的修改,可以只更新Vendors表中的記錄,相關表中的記錄不用改動。

但是另一方方面,將數據分別存放在不同的表中有時是很復雜的,我們需要查詢多個關聯的表,才能拿到我們想要的數據。因此,在設計表結構,以及編寫SQL語句時,需要很好地理這種關聯關系,知道什么信息存在什么表中。

表關系種類

一對多

比如上面的供應商和產品,一個供應商可能提供多個產品,而一個產品只能屬于一個供應商,在多的一邊(產品表)通過Foreign Key 描述這種關系。

一對一

比如,一張訂單對應一張訂單詳情;一篇文章摘要,對應一篇具體的文章內容。一對一關系的Foreign Key建在關系的哪邊都行。

多對多

這個是相對復雜的一種,但是也很好理解。還是上面的例子,比如給產品打標簽,一個產品可能有多個標簽(”進口“, ”新品“),而一個標簽下可以對應多個產品(進口商品可能有很多)。

特別要注意的是,如果要描述多對多關系,需要借助第三張表,這個表稱為關系表,這張表實際存儲時,看起來是這樣的:

id (PK)prod_id (FK)tag_id (FK)
111
212
321
431

除了自增的主鍵id,它還有兩個外鍵,一個prod_id關聯產品表,一個tag_id關聯標簽表。

插入數據(INSERT INTO)

這里將以教學管理為例,來創建數據庫,創建表,插入數據。最后一部分的綜合練習,將基于接下來要創建的數據。

創建表并定義約束關系

首先,創建一個數據庫,就命名為school吧

CREATE DATABASE school CHARSET utf8;

關于表創建和約束的更多詳細,請參考MySQL基礎(二)數據庫、表的創建及操作

下面我們我們將創建5張表,分別是:

  • 班級表(Class)
  • 課程表(Course)
  • 成績表(Score)
  • 學生表(Student)
  • 教師表(Teacher)

其中班級表和課程表是一對多關系;班級表和學生表是一對多關系;教師表和課程表是一對多關系;學生表和課程表是多對多關系。

-- ------------------------- -- 創建班級表 -- ------------------------- CREATE TABLE Class (cls_id int NOT NULL PRIMARY KEY AUTO_INCREMENT , -- PKcaption char(30) NOT NULL );-- ------------------------- -- 創建課程表 -- ------------------------- CREATE TABLE Course (crs_id int NOT NULL PRIMARY KEY AUTO_INCREMENT , -- PKcrs_name char(30) NOT NULL ,teacher_id int NOT NULL -- FK );-- ------------------------- -- 創建成績表 -- ------------------------- CREATE TABLE Score (scr_id int NOT NULL PRIMARY KEY AUTO_INCREMENT , -- PKnum tinyint NOT NULL ,student_id int NOT NULL , -- FKcourse_id int NOT NULL -- FK );-- ------------------------- -- 創建學生表 -- ------------------------- CREATE TABLE Student (std_id int NOT NULL PRIMARY KEY AUTO_INCREMENT , -- PKgender enum('女', '男') NOT NULL ,std_name char(30) NOT NULL ,class_id int NOT NULL -- FK );-- ------------------------- -- 創建教師表 -- ------------------------- CREATE TABLE Teacher (tea_id int NOT NULL PRIMARY KEY AUTO_INCREMENT , -- PKtea_name char(30) NOT NULL );-- ------------------------- -- 定義外鍵 -- ------------------------- ALTER TABLE Course ADD CONSTRAINT FK_Course_Teacher FOREIGN KEY (teacher_id) REFERENCES Teacher (tea_id);ALTER TABLE Score ADD CONSTRAINT FK_Score_Student FOREIGN KEY (student_id) REFERENCES Student (std_id); ALTER TABLE Score ADD CONSTRAINT FK_Score_Course FOREIGN KEY (course_id) REFERENCES Course (crs_id);ALTER TABLE Student ADD CONSTRAINT FK_Student_Class FOREIGN KEY (class_id) REFERENCES Class (cls_id);

定義外鍵的方式

注意:定義外鍵的數據類型一定要和關聯表主鍵的數據類型一致!

建表時定義
CREATE TABLE Course (crs_id int PRIMARY KEY AUTO_INCREMENT , crs_name char(30) NOT NULL ,teacher_id int NOT NULL ,CONSTRAINT FK_Course_Teacher -- 外鍵名FOREIGN KEY (teacher_id) -- 外鍵字段REFERENCES Teacher (tea_id) -- 關聯表主鍵字段 );
建表后定義
CREATE TABLE Course (crs_id int PRIMARY KEY AUTO_INCREMENT , crs_name char(30) NOT NULL ,teacher_id int NOT NULL );ALTER TABLE Course ADD CONSTRAINT FK_Course_Teacher -- 外鍵名 Foreign KEY (teacher_id) REFERENCES Teacher (tea_id); -- 外鍵字段和關聯表主鍵字段
刪除外鍵

格式

ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名;

示例

ALTER TABLE Course DROP FOREIGN KEY FK_Course_Teacher;

插入數據

插入單條數據

格式

INSERT INTO 表名 [(fld1, fld2, ..., fldn)] VALUES (val1, val2, ..., valn);

注意:表名后的字段名可以省略,但建議加上,VALUES的值將依次匹配字段名,而不一定非要按照表中字段的實際次序;有默認值的字段或自增字段可不提供值。另外,對于自增id,如果插入數據時指定了非連續的值,比如表記錄最后一行id是3,插入數據時指定id是9,那么以后再插入數據時,id將從9開始自增。

插入多條數據

格式

INSERT INTO 表名 [(fld1, fld2, ..., fldn)] VALUES (val1, val2, ..., valn),(val1, val2, ..., valn),-- ...(val1, val2, ..., valn);

示例

下面,我們將為上面創建的那5張表填充數據:

-- -------------------------- -- 插入班級數據 -- -------------------------- INSERT INTO Class (caption) VALUES ('三年二班'), ('三年三班'), ('一年二班'), ('二年九班');-- -------------------------- -- 插入教師數據 -- -------------------------- INSERT INTO Teacher (tea_name) VALUES ('張磊老師'), ('李平老師'), ('劉海燕老師'), ('朱云海老師'), ('李杰老師');-- ------------------------- -- 插入課程數據 -- ------------------------- INSERT INTO Course (crs_name, teacher_id) VALUES ('生物', 1), ('物理', 2), ('體育', 3), ('美術', 2);-- ------------------------- -- 插入學生數據 -- ------------------------- INSERT INTO Student (gender, std_name, class_id) VALUES ('男', '理解', 1), ('女', '鋼蛋', 1), ('男', '張三', 1), ('男', '張一', 1),('女', '張二', 1), ('男', '張四', 1), ('女', '鐵錘', 2), ('男', '李三', 2), ('男', '李一', 2), ('女', '李二', 2), ('男', '李四', 2), ('女', '如花', 3),('男', '劉三', 3), ('男', '劉一', 3), ('女', '劉二', 3), ('男', '劉四', 3);-- -------------------------- -- 插入成績數據 -- -------------------------- INSERT INTO Score (num, student_id, course_id) VALUES (10,1,1),(9,1,2),(66,1,4),(8,2,1),(68,2,3),(99,2,4),(77,3,1),(66,3,2),(87,3,3),(99,3,4),(79,4,1),(11,4,2),(67,4,3),(100,4,4),(79,5,1),(11,5,2),(67,5,3),(100,5,4),(9,6,1),(100,6,2),(67,6,3),(100,6,4),(9,7,1),(100,7,2),(67,7,3),(88,7,4),(9,8,1),(100,8,2),(67,8,3),(88,8,4),(91,9,1),(88,9,2),(67,9,3),(22,9,4),(90,10,1),(77,10,2),(43,10,3),(87,10,4),(90,11,1),(77,11,2),(43,11,3),(87,11,4),(90,12,1),(77,12,2),(43,12,3),(87,12,4),(87,13,3);

修改和刪除數據

修改數據(UPDATE)

格式:

UPDATE 表名 SET fld1=val1, fld2=val2, ... -- 賦值,多個字段之間以逗號分隔 WHERE 條件; -- 過濾條件

注意:如果沒有WHERE子句,將更新所有的行!

示例:

-- 將學號為2,課程id為1 的成績加10分 UPDATE score SET num = num + 10 WHERE student_id=2 and course_id=1;

刪除數據

DELETE

DELETE FROM 表名 WHERE 條件; -- 過濾條件

刪除記錄:先查出所有符合條件的記錄,然后一條條刪除,數據很多比較慢。如果有自增id,再插入新數據時,id會在原有的基礎上自增。

TRUNCATE

如果需要刪除整張表的記錄,那么使用TRUNCATE速度更快,它是直接刪除表,然后新建一張帶原來字段的表。

TRUNCATE TABLE 表名;

單表查詢(SELECT)

基本格式:

SELECT fld, ... -- 選擇字段 FROM tablename -- 選擇表 [WHERE ...] -- WHERE 條件 [GROUP BY ...] -- 分組 [HAVING ...] -- HAVING 條件 [ORDER BY ...] -- 排序 LIMIT ... ; -- 限制條數

WHERE子句

數據庫表一般包含大量的數據,很少需要檢索表中的所有行,通常會根據需要指定過濾條件。WHERE子句就是用來指定過濾條件的。

WHERE子句操作符

操作符說明操作符說明
=等于LIKE ‘_…%’模糊搜索
!=不等于_通配符:匹配一個字符
>大于%通配符:匹配任意字符任意個數
>=大于等于AND邏輯與
<小于NOT邏輯非
<=小于等于OR邏輯或
BETWEEN x AND y在x與y之間(左右包含)REGEXP正則匹配
IN (val1, val2, …)指定條件范圍

AS 顯示別名

更改列名顯示

格式:

SELECT fieldname AS fieldname_new FROM tablename;

示例:

SELECT tea_id as ID, tea_name as 教師姓名 FROM Teacher;+----+------------+ | ID | 教師姓名 | +----+------------+ | 1 | 張磊老師 | | 2 | 李平老師 | | 3 | 劉海燕老師 | | 4 | 朱云海老師 | | 5 | 李杰老師 | +----+------------+ 5 rows in set (0.00 sec)-- 也可以省略AS SELECT tea_id ID, tea_name 教師姓名 FROM Teacher;

列值相加

假如有學生各科成績表,使用別名表示學生總分,使用+將列值相加

SELECT name as 姓名, math + chinese + english as 總成績 FROM ExamResult; -- 表不存在,這里只是示例

ORDER BY 排序

根據指定列排序,ASC升序,DESC降序

-- 查詢成績表中課程id為2的分數和學生,并以分數倒序顯示 SELECT num AS 分數, student_id AS 學生ID FROM Score WHERE course_id = 2 ORDER BY num DESC;+------+--------+ | 分數 | 學生ID | +------+--------+ | 100 | 6 | | 100 | 7 | | 100 | 8 | | 88 | 9 | -- ...... +------+--------+ 11 rows in set (0.14 sec)

LIMIT 限制查詢條數

-- 查詢學生表中3個姓張的學生 SELECT std_id, gender, std_name FROM Student WHERE std_name LIKE '張%' LIMIT 3;+--------+--------+----------+ | std_id | gender | std_name | +--------+--------+----------+ | 3 | 男 | 張三 | | 4 | 男 | 張一 | | 5 | 女 | 張二 | +--------+--------+----------+ 3 rows in set (0.28 sec)

使用LIMIT 可以提高數據庫性能。對于上面的這個模糊搜索,即使已經找到了,也將遍歷整個數據庫,如果數據庫中存儲了海量數據,這種全表掃描將極大影響性能。使用LIMIT后,找到指定條數的記錄后,就會停止查找。

LIMIT [offset,] rows其實可以接受兩個參數,第一參數是偏移。默認不寫是偏移0。在最后綜合練習的第20題,你將看到它的應用。

聚合函數

聚合函數用來匯總數據:

函數說明
AVG()返回某列的平均值
COUNT()返回某列的行數
MAX()返回某列的最大值
MIN()返回某列的最小值
SUM()返回某列子和

AVG

-- 從成績表中,查找學生id是3的學生的平均成績 SELECT AVG(num) AS avg_num FROM Score WHERE student_id=3;+---------+ | avg_num | +---------+ | 82.2500 | +---------+

COUNT

該函數有兩種使用方式:

  • COUNT(*) 對表中行的數目進行計數
  • COUNT(column) 對特定列中具有值的行進行計數(會忽略列值為NULL的行)
-- 查找學生總數 SELECT COUNT(*) AS total_num FROM Student;+-----------+ | total_num | +-----------+ | 16 | +-----------+

MAX MIN

  • MAX()一般用來找出最大的數值或日期,對于文本數據,將返回該列排序后的最后一行
  • 如果SELECT選擇多列,對其中一列使用MAX()統計最大值,比如下面這個例子,查詢出來的某列具有最大值的行和其它列所在的行,并不是同一行
-- 統計課程3的最高成績 SELECT student_id, MAX(num) FROM Score WHERE course_id=3;+------------+----------+ | student_id | MAX(num) | +------------+----------+ | 2 | 87 | +------------+----------+-- 事實上,課程3最高成績對應的學生id是3 SELECT student_id, num FROM Score WHERE course_id=3 ORDER BY num DESC LIMIT 3;+------------+-----+ | student_id | num | +------------+-----+ | 3 | 87 | | 13 | 87 | | 2 | 68 | +------------+-----+-- 第一次查詢結果中的2,只是第一次出現課程3的那一行的student_id SELECT student_id, num FROM Score WHERE course_id=3 LIMIT 3;+------------+-----+ | student_id | num | +------------+-----+ | 2 | 68 | | 3 | 87 | | 4 | 67 | +------------+-----+

MIN()函數同理,不贅述。

求最大值和最小值,有時候通過DESC ASC排序,配合LIMIT更方便,比如最后綜合練習中的19題。

SUM

-- 計算訂單號為20005的訂單總金額 SELECT SUM(item_price*quantity) AS total_price FROM OrderItems WHERE order_num = 20005;

注意:

如上所示,利用標準的算術操作符,所有的聚集函數都可以用來執行多個列上的計算

ALL & DISTINCT
  • ALL 對所有行執行計算,是默認行為,不需要指定
  • DISTINCT 只對包含不同列值的行進行計算(因此聚合函數必須指定列名),需要顯示地指定該參數

以查詢平均成績為例,二者的結果是不一樣的,DISTINCT參數會過濾掉重復的成績再計算

SELECT AVG(num) FROM Score; -- 默認行為是 ALL+----------+ | AVG(num) | +----------+ | 67.2979 | +----------+SELECT AVG(DISTINCT num) FROM Score; +-------------------+ | AVG(DISTINCT num) | +-------------------+ | 60.2941 | +-------------------+

在最后綜合練習的第11題中,你也將看到相關應用。

組合聚合函數

SELECT語句可以根據需要包含多個聚集函數,比如:

SELECT COUNT(*) as num_items,MIN(num) as score_min,MAX(num) AS score_max,AVG(num) AS score_avg FROM Score;+-----------+-----------+-----------+-----------+ | num_items | score_min | score_max | score_avg | +-----------+-----------+-----------+-----------+ | 47 | 9 | 100 | 67.2979 | +-----------+-----------+-----------+-----------+

其它內置函數

文本處理函數

函數說明
UPPER()大寫
LOW()小寫
LENGTH()返回字符串長度(Bytes)
SOUNDEX()返回字符串的SOUNDEX值
CONCAT()拼接字段/字符串
LENGTH()

長度是字節(在utf8編碼中,一個中文字符占3個字節)

SOUNDEX()

將任何文本字符串轉化為描述其語言表示的字母數字模式的算法,SOUNDEX 考慮了類似的發音字符和音節,使得能夠對字符串進行發音比較,而不是字母比較。(看這個介紹就知道,不支持中文,實測確實如此,很遺憾…)這里給出一個例子:

假如有一張顧客表,其聯系名為Michael Green,但如果記錯了,輸入了 Michelle Green 來查找,肯定是找不到的。如果用SOUNDEX()函數進行搜索,就可以解決這個問題,它匹配所有發音類似于Michael Green的聯系名

SELECT cust_name, cust_contact FROM Customers WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
CONCAT()

MySQL使用CONCAT函數來拼接字段和字符串(其它DBMS中可能使用 + 和 ||)

-- 將tea_id字段與tea_name字段聯合顯示 SELECT CONCAT('(', tea_id, ')', tea_name) AS '(ID)姓名' FROM Teacher;+---------------+ | (ID)姓名 | +---------------+ | (1)張磊老師 | | (2)李平老師 | | (3)劉海燕老師 | | (4)朱云海老師 | | (5)李杰老師 | +---------------+

日期和時間處理函數

這一塊兒的函數比較多,要用的時候可以根據需求,去查詢文檔

GROUP BY分組和 HAVING過濾

GROUP BY可以將數據分為多個邏輯組,再對每個組進行聚合計算

注意區別WHERE和HAVING:

  • WHERE過濾行,HAVING過濾分組
  • WHERE在數據分組前進行過濾, HAVING在數據分組后進行過濾,結合GROUP BY子句使用
-- 具有兩個以上的產品,且產品價格大于4的供應商 SELECT vend_id, COUNT(*) AS num_prods FROM Products WHERE prod_price >= 4 -- 產品價格大于4 GROUP BY vend_id -- 根據供應商分組 HAVING COUNT(*) >= 2 -- 具有兩個以上的產品 -- 從成績表中,查詢每門課的平均成績 SELECT AVG(num) AS 'score_avg', course_id FROM Score GROUP BY course_id;+-----------+-----------+ | score_avg | course_id | +-----------+-----------+ | 54.2500 | 1 | | 65.0909 | 2 | | 64.4167 | 3 | | 85.2500 | 4 | +-----------+-----------+ 4 rows in set (0.00 sec)

InnoDb 外鍵約束支持的ON語句

這里將建立外鍵的表稱為子表,外鍵引用的表稱為父表(主表)。

外鍵約束是雙重的:

  • 對子表來說,如果引用的記錄在父表中找不到,那么不允許在子表中插入或更新數據
  • 對父表來說,如果某記錄被子表引用,那么該記錄不能被隨便刪除(具體取決于子表在定義外鍵約束時的ON語句)

外鍵約束的四種ON語句方式:

CASCADE

級聯刪除:如果父表的記錄被刪除,那么子表中對應的記錄也被自動刪除

FOREIGN KEY (xx_id) REFERENCES parent_tablename (id) ON DELETE CASCADE;

SET NULL

刪除父表中某條記錄時,將子表中引用了該記錄的外鍵設為NULL

FOREIGN KEY (xx_id) REFERENCES parent_tablename (id) ON DELETE SET NULL;

RESTRICT

如果子表中引用了父表記錄,則不允許對父表中的該記錄進行刪除。

NO ACTION

在MySQL中同RESTRICT。

組合查詢(UNION)

UNION

通過UNION操作符,可以執行多個SELECT查詢,并將結果作為一個查詢結果返回,這就是組合查詢(也稱并查詢,復合查詢 compound query)。

UNION使用場景:

  • 在一個查詢中從不同的表返回結果
  • 對一個表執行多個查詢,按一個查詢返回結果

使用形式:

SELECT column1, column2, ... FROM tablename WHERE ... UNION -- 使用UNION連接多個查詢 SELECT column1, column2, ... FROM tablename WHERE ...

比如,從學生表中查詢性別為“男”,或者 姓”李“的學生:

SELECT std_id, std_name, gender FROM Student WHERE gender = '男' UNION SELECT std_id, std_name, gender FROM Student WHERE std_name LIKE '李%'; +--------+----------+--------+ | std_id | std_name | gender | +--------+----------+--------+ | 1 | 理解 | 男 | | 3 | 張三 | 男 | | 4 | 張一 | 男 | | 6 | 張四 | 男 | | 8 | 李三 | 男 | | 9 | 李一 | 男 | | 11 | 李四 | 男 | | 13 | 劉三 | 男 | | 14 | 劉一 | 男 | | 16 | 劉四 | 男 | | 10 | 李二 | 女 | +--------+----------+--------+

當然以上要求也可以用WHERE子句來做,可能還更簡潔,用OR連接兩個條件即可。事實上,UNION和WHERE常常是可以互換的,但是對于較為復雜的過濾條件,或者從多個表中檢索數據時,使用UNION可能會更簡單。

可以看到UNION非常容易使用,但在進行組合時,要注意幾條規則:

  • UNION必須由兩條或以上的SELECT語句組成,中間用UNION連接
  • UNION中的每個查詢必須包含相同的列,表達式或聚合函數(次序可以不同)
  • 列數據類型必須兼容

UNION ALL

默認UNION會從查詢結果中取出重復的行,如果不希望這么做,可以使用UNION ALL

對組合查詢排序

在組合查詢中,如果要對查詢結果排序,只能使用一條ORDER BY子句,且必須位于最后一條SELECT語句之后。

多表查詢(SELECT)

內聯結(INNER JOIN)

多表查詢需要利用聯結,使多個表返回一組輸出。聯結是SQL中最重要,最強大的特性!

最基本的方式是,在查詢時,指定要聯結的所有表,以及關聯它們的方式即可。

基本格式:

SELECT column1, column2, ... -- 選擇位于不同表中要檢索的列 FROM tablename1, tablename2 -- 要聯結的表 WHERE ... -- 指定聯結條件,非常重要!!!

我們看一個例子:

SELECT crs_name, tea_name FROM Course, Teacher WHERE Course.teacher_id = Teacher.tea_id; -- 完全限定列名+----------+------------+ | crs_name | tea_name | +----------+------------+ | 生物 | 張磊老師 | | 物理 | 李平老師 | | 體育 | 劉海燕老師 | | 美術 | 李平老師 | +----------+------------+

完全限定列名:用一個句點分隔表名和列名,以避免列名混淆。

笛卡兒積

如果沒有WHERE子句指定聯結條件,第一個表中的每一行將與第二個表中的每一行配對,而不管它們邏輯上是否能匹配在一起。這樣返回的結果稱為笛卡兒積,檢索出的行的數目等于兩個表行數的乘積。

內聯接

上面這種聯結方式稱為等值聯結(equijoin),也叫內聯接(inner join),它基于兩個表之間的相等測試。

我們也可以使用另一種的語法,明確指定聯結的類型:

SELECT column1, column2, ... -- 選擇位于不同表中要檢索的列 FROM tablename1 INNER JOIN tablename2 -- 要聯結的表 ON ... -- ON指定聯結條件,非常重要!!!

下面的SELECT語句返回與上面例子完全相同的結果:

SELECT crs_name, tea_name FROM Course INNER JOIN Teacher ON Course.teacher_id = Teacher.tea_id;

在聯結中使用別名

之前的AS別名也可以用在聯結中,好處是:

  • 縮短SQL語句
  • 允許在一條SQL語句中多次使用相同的表(下面自聯結會用到)

我們將上面的例子用AS別名改寫下:

SELECT crs_name, tea_name FROM Course AS c INNER JOIN Teacher AS t ON c.teacher_id = t.tea_id;

這樣做還有一個好處就是,一旦聯結的多張表中出現了字段名重復,可以通過別名.字段名(完全限定列名)的方式加以區分:

SELECT a.name, b.name FROM TableA AS a INNER JOIN TableB AS b ON a.fk = b.pk;

自聯結(self-join)

自聯結(self-join),聯結的兩張表是相同的表,通過AS別名來區分。

在最后的綜合練習第8題,第21題,你將看到它的應用。

外聯結(outer-join)

假如有一個父表,和一個子表,子表通過外鍵引用父表中的記錄。但并不是父表中的所有記錄都會被引用,比如顧客表(父表)和訂單表(子表),肯定會有沒有下單的顧客。如果在統計顧客的訂單數時,希望將沒有下單的顧客也包括進來,那么用內聯結就不合適。這個時候就要用到外聯結。

左外聯結(LEFT JOIN)

在內聯結的基礎上,增加左邊有,右邊沒有的結果,沒有的部分顯示為Null。注意:左右指的是聯結條件的兩段。

使用左外連接來查詢所有顧客的訂單,包括那些沒下單的顧客時,可以這樣寫

SELECT Customers.cust_id, Orders.order_num FROM Customers LEFT JOIN Orders ON Customers.cust_id = Orders.cust_id; -- 聯結條件

右外聯結(RIGHT JOIN)

在內聯結的基礎上,增加右邊有,左邊沒有的結果,沒有的部分顯示為Null。

如果將聯結條件順序調換一下,左右聯結的效果是一樣的。

SELECT Customers.cust_id, Orders.order_num FROM Customers RIGHT JOIN Orders ON Orders.cust_id = Customers.cust_id; -- 聯結條件

全外聯結

在內連接的基礎上增加左邊有右邊沒有的,和右邊有左邊沒有的結果。MySQL是不支持的FULL JOIN的!但是可以通過UNIO組合左外聯結和右外聯結,達到同樣的效果。

子查詢(subquery)

子查詢就是嵌套在其它查詢中的查詢,注意:MySQL4.1之前的版本是不支持這一特性的。

使用場景:

  • 利用子查詢進行過濾
  • 創建計算字段
  • 更多使用查看后面綜合練習

利用子查詢進行過濾

將一條SELECT語句的返回結果作為另一條SELECT語句的WHERE子句

SELECT cln FROM tablename WHERE cln IN (SELECT clnFROM tablenameWHERE cln IN (SELECT clnFROM tablenameWHERE 查詢條件));

在這里,子查詢由內向外處理,對于嵌套子查詢的數目也沒有限制,但在實際使用時,出于性能考慮,不要嵌套太多的子查詢。

作為計算字段

假如有一個顧客表Customers和訂單表Orders,Orders表通過cust_id外鍵引用Customers表中的cust_id主鍵。要求查詢Customers表中每個顧客的訂單總數。

要完成以上需求,需要以下兩步:

  • 從Customers表中檢索出顧客列表
  • 對于檢索出的每個顧客,統計其在Orders表中的訂單數目

下面利用子查詢完成這一需求

SELECT cust_name,(SELECT COUNT(*)FROM OrdersWHERE Orders.cust_id = Customers.cust_id) AS orders FROM Customers;+---------------+--------+ | cust_name | orders | +---------------+--------+ | Village Toys | 2 | | Kids Place | 0 | | Fun4All | 1 | | Fun4All | 1 | | The Toy Store | 1 | +---------------+--------+

說明:orders是一個計算字段,它由子查詢建立,該子查詢對檢索出的每個顧客執行一次。這里也使用了完全限定列名,以避免列名混淆。

通過聯結,也可以完成這一需求:

SELECT cust_name, COUNT(Orders.order_num) AS orders FROM Customers LEFT JOIN Orders ON Customers.cust_id = Orders.cust_id GROUP BY Customers.cust_id;

要注意的一點是,這里COUNT后不能用*,否則就是對行作統計,必須指定列名,這樣如果該列沒有值(顧客沒有訂單NULL),就不會被統計進去。

綜合練習

這里將以插入數據部分創建的教學管理數據為基礎,進行練習。

1. 將所有的課程的名稱以及對應的任課老師姓名打印出來

SELECT crs_name, tea_name FROM Course LEFT JOIN Teacher ON Course.teacher_id = Teacher.tea_id; +----------+------------+ | crs_name | tea_name | +----------+------------+ | 生物 | 張磊老師 | | 物理 | 李平老師 | | 體育 | 劉海燕老師 | | 美術 | 李平老師 | +----------+------------+ 4 rows in set (0.00 sec)

2. 查詢學生表中男女生各有多少人?

SELECT gender, COUNT(*) AS total FROM Student GROUP BY gender; +--------+-------+ | gender | total | +--------+-------+ | 女 | 6 | | 男 | 10 | +--------+-------+ 2 rows in set (0.00 sec)

3. 查詢物理成績等于100的學生的姓名

SELECT std_name, num FROM Student INNER JOIN Score ON Score.course_id = (SELECT crs_id FROM Course WHERE crs_name='物理') AND Score.num = 100 AND Score.student_id = Student.std_id; +----------+-----+ | std_name | num | +----------+-----+ | 張四 | 100 | | 鐵錘 | 100 | | 李三 | 100 | +----------+-----+ 3 rows in set (0.00 sec)

4. 查詢平均成績大于八十分的同學的姓名和平均成績

-- 將成績根據學生id分組 SELECT std_name, AVG(Score.num) FROM Student LEFT JOIN Score ON Student.std_id = Score.student_id GROUP BY Score.student_id HAVING AVG(Score.num)>80; +----------+----------------+ | std_name | AVG(Score.num) | +----------+----------------+ | 張三 | 82.2500 | | 劉三 | 87.0000 | +----------+----------------+ 2 rows in set (0.04 sec)

5. 查詢所有學生的學號,姓名,選課數,總成績

SELECT std_id, std_name, COUNT(Score.course_id), SUM(Score.num) FROM Student LEFT JOIN Score ON Student.std_id = Score.student_id GROUP BY Student.std_id; +--------+----------+------------------------+----------------+ | std_id | std_name | COUNT(Score.course_id) | SUM(Score.num) | +--------+----------+------------------------+----------------+ | 1 | 理解 | 3 | 85 | | 2 | 鋼蛋 | 3 | 185 | | 3 | 張三 | 4 | 329 | | 4 | 張一 | 4 | 257 | | 5 | 張二 | 4 | 257 | | 6 | 張四 | 4 | 276 | | 7 | 鐵錘 | 4 | 264 | | 8 | 李三 | 4 | 264 | | 9 | 李一 | 4 | 268 | | 10 | 李二 | 4 | 297 | | 11 | 李四 | 4 | 297 | | 12 | 如花 | 4 | 297 | | 13 | 劉三 | 1 | 87 | | 14 | 劉一 | 0 | NULL | | 15 | 劉二 | 0 | NULL | | 16 | 劉四 | 0 | NULL | +--------+----------+------------------------+----------------+ 16 rows in set (0.00 sec)

6. 查詢姓李老師的個數

SELECT COUNT(*) AS Li_nums FROM Teacher WHERE tea_name LIKE '李%'; +---------+ | Li_nums | +---------+ | 2 | +---------+ 1 row in set (0.00 sec)

7. 查詢沒有報李平老師課的學生姓名

-- 找出選了李平課的學生,取反; 聯結之后再過濾 SELECT std_name FROM Student WHERE std_id NOT IN (SELECT Score.student_idFROM ScoreWHERE Score.course_id in (SELECT crs_idFROM Course LEFT JOIN TeacherON Course.teacher_id = Teacher.tea_idWHERE tea_name LIKE '李平%'));

8. 查詢物理課程比生物課程高的學生的學號

-- 物理成績和生物成績作兩列才能比較;學號一致 SELECT Phy.student_id FROM (SELECT student_id, crs_name, num FROM Score LEFT JOIN CourseON Score.course_id = Course.crs_idWHERE crs_name LIKE '物理') AS Phy INNER JOIN (SELECT student_id, crs_name, numFROM Score LEFT JOIN CourseON Score.course_id = Course.crs_idWHERE crs_name LIKE '生物') AS Bio ON Phy.student_id = Bio.student_id WHERE Phy.num > Bio.num; +------------+ | student_id | +------------+ | 6 | | 7 | | 8 | +------------+ 3 rows in set (0.00 sec)

9. 查詢沒有同時選修物理課程和體育課程的學生姓名

-- 找到同時選了的同學取反 SELECT std_name FROM Student WHERE std_id NOT IN (SELECT Phy.student_idFROM (SELECT student_idFROM Score LEFT JOIN CourseON Course.crs_id = Score.course_idWHERE crs_name LIKE '物理') AS PhyINNER JOIN (SELECT student_id FROM Score LEFT JOIN CourseON Course.crs_id = Score.course_idWHERE crs_name LIKE '體育') AS GymON Phy.student_id = Gym.student_id);-- 因為是同時選了,所以Phy和Gym聯結要用INNER JOIN, 否則會出現只選了一門的 +----------+ | std_name | +----------+ | 理解 | | 鋼蛋 | | 劉三 | | 劉一 | | 劉二 | | 劉四 | +----------+ 6 rows in set (0.01 sec)

10. 查詢掛科超過兩門(包括兩門)的學生姓名和班級

-- 篩選課程分數<60 按學生分組,計數 SELECT Student.std_name, Class.caption FROM Student LEFT JOIN Class ON Student.class_id = Class.cls_id WHERE Student.std_id IN (SELECT student_idFROM ScoreWHERE num < 60GROUP BY student_idHAVING COUNT(*) >= 2); +----------+----------+ | std_name | caption | +----------+----------+ | 理解 | 三年二班 | +----------+----------+ 1 row in set (0.07 sec)

11. 查詢選修了所有課程的學生姓名

-- 學生分組 成績記錄等于課程數的 SELECT DISTINCT std_name -- 需要加 DISTICT 去重,否則每個名字出現多次 FROM Student INNER JOIN Score ON Student.std_id = Score.student_id WHERE Student.std_id IN (SELECT student_idFROM Score GROUP BY student_idHAVING COUNT(student_id) = (SELECT COUNT(crs_name) FROM Course)); +----------+ | std_name | +----------+ | 張三 | | 張一 | | 張二 | | 張四 | | 鐵錘 | | 李三 | | 李一 | | 李二 | | 李四 | | 如花 | +----------+ 10 rows in set (0.00 sec)

12. 查詢李平老師教的課程的所有成績記錄

SELECT num FROM Score WHERE course_id IN (SELECT Course.crs_idFROM Course INNER JOIN TeacherON Course.teacher_id = Teacher.tea_idWHERE tea_name LIKE '李平%'); +-----+ | num | +-----+ | 9 | | 66 | | 11 | | 11 | -- ... | 87 | | 87 | | 87 | +-----+ 23 rows in set (0.08 sec)

13. 查詢選課學生都選修了的課程號和課程名

-- 所有學生都選了的課程id:根據課程id分類計數,找出結果等于選課學生數的 SELECT crs_id, crs_name FROM Course INNER JOIN (SELECT course_id FROM ScoreGROUP BY course_idHAVING COUNT(course_id) = (SELECT COUNT(DISTINCT student_id) FROM Score)) AS Tmp ON Course.crs_id = Tmp.course_id; Empty set (0.00 sec)

14. 查詢每門課程被選修的次數

SELECT course_id, COUNT(course_id) FROM Score GROUP BY course_id; +-----------+------------------+ | course_id | COUNT(course_id) | +-----------+------------------+ | 1 | 12 | | 2 | 11 | | 3 | 12 | | 4 | 12 | +-----------+------------------+ 4 rows in set (0.00 sec)

15. 查詢只選修了一門課程的學生姓名和學號

SELECT std_id, std_name FROM Student INNER JOIN (SELECT student_idFROM ScoreGROUP BY student_idHAVING COUNT(student_id)=1) AS Tmp ON Student.std_id = Tmp.student_id; +--------+----------+ | std_id | std_name | +--------+----------+ | 13 | 劉三 | +--------+----------+ 1 row in set (0.00 sec)

16. 查詢所有學生考出的成績并按從高到低排序(成績去重)

SELECT DISTINCT num FROM Score ORDER BY num DESC; +-----+ | num | +-----+ | 100 | | 99 | -- ... | 10 | | 9 | +-----+ 17 rows in set (0.00 sec)

17. 查詢平均成績大于85的學生姓名和平均成績

SELECT std_name, AVG(num) FROM Student INNER JOIN Score ON Student.std_id = Score.student_id GROUP BY Student.std_id HAVING AVG(num) > 85; +----------+----------+ | std_name | AVG(num) | +----------+----------+ | 劉三 | 87.0000 | +----------+----------+ 1 row in set (0.00 sec)

18. 查詢生物成績不及格的學生姓名和對應生物分數

SELECT std_name, num FROM Student INNER JOIN (SELECT student_id, numFROM Score INNER JOIN CourseON Score.course_id = Course.crs_idWHERE crs_name LIKE '生物' AND num < 60) AS Tmp ON Student.std_id = Tmp.student_id; +----------+-----+ | std_name | num | +----------+-----+ | 理解 | 10 | | 鋼蛋 | 18 | | 張四 | 9 | | 鐵錘 | 9 | | 李三 | 9 | +----------+-----+ 5 rows in set (0.00 sec)

19. 查詢在所有選修了李平老師課程的學生中,這些課程(李平老師的課程,不是所有課程)平均成績最高的學生姓名

-- 求最大值可以考慮用DESC 倒序 SELECT std_name FROM Student INNER JOIN (SELECT student_idFROM Score INNER JOIN (SELECT crs_idFROM Course INNER JOIN TeacherON Course.teacher_id = Teacher.tea_idWHERE tea_name LIKE '李平%') AS TmpON Score.course_id = Tmp.crs_idGROUP BY student_idORDER BY AVG(num) DESC LIMIT 1) AS RES ON Student.std_id = RES.student_id; +----------+ | std_name | +----------+ | 張四 | +----------+ 1 row in set (0.00 sec)

20. 查詢每門課程成績最好的前兩名學生姓名

-- 將SELECT結果作為字段名; LIMIT m, n 取出第二高的分數 SELECT * FROM Score LEFT JOIN (SELECT scr_id, (SELECT numFROM Score AS s2WHERE s2.course_id = s1.course_idORDER BY num DESC LIMIT 1) AS first_num,(SELECT DISTINCT numFROM Score AS s2WHERE S2.course_id = s1.course_idORDER BY num DESC LIMIT 1,1) AS second_numFROM score as s1) AS T ON Score.scr_id = T.scr_id WHERE Score.num <= T.first_num AND Score.num >= T.second_num;

21. 查詢同一個學生不同課程但成績相同的學生的學號,課程號,成績

-- 自聯結 SELECT A.student_id, A.course_id, A.num FROM Score AS A, Score AS B WHERE A.course_id != B.course_id AND A.student_id = B.student_id AND A.num = B.num; +------------+-----------+-----+ | student_id | course_id | num | +------------+-----------+-----+ | 6 | 2 | 100 | | 6 | 4 | 100 | +------------+-----------+-----+ 2 rows in set (0.00 sec)

22. 查詢沒學過“李平”老師課程的學生姓名以及選修的課程名稱

SELECT std_name, crs_name, tea_name FROM Student INNER JOIN (SELECT student_id, crs_name, tea_nameFROM Score INNER JOIN (SELECT crs_id, crs_name, tea_nameFROM CourseINNER JOIN (SELECT tea_id, tea_nameFROM TeacherWHERE tea_name NOT LIKE '李平%') AS TON Course.teacher_id = T.tea_id) AS CON Score.course_id = C.crs_id) AS S ON Student.std_id = S.student_id ORDER BY std_name; +----------+----------+------------+ | std_name | crs_name | tea_name | +----------+----------+------------+ | 劉三 | 體育 | 劉海燕老師 | | 如花 | 體育 | 劉海燕老師 | | 如花 | 生物 | 張磊老師 | -- ... | 鐵錘 | 生物 | 張磊老師 | | 鐵錘 | 體育 | 劉海燕老師 | +----------+----------+------------+ 24 rows in set (0.00 sec)

23. 任課最多的老師中學生單科成績最高的學生姓名

-- 任課最多的老師課程id下的學生 SELECT std_name, num, crs_name FROM Student INNER JOIN (SELECT student_id, num, crs_nameFROM Score INNER JOIN (SELECT crs_id, crs_nameFROM CourseINNER JOIN (SELECT teacher_idFROM courseGROUP BY teacher_idORDER BY COUNT(teacher_id) DESC LIMIT 1) AS TON Course.teacher_id = T.teacher_id) AS CON Score.course_id = C.crs_id) AS S ON Student.std_id = S.student_id ORDER BY num DESC LIMIT 8; -- 數據問題,同時有很多最高的。。。 +----------+-----+----------+ | std_name | num | crs_name | +----------+-----+----------+ | 李三 | 100 | 物理 | | 張四 | 100 | 美術 | | 鐵錘 | 100 | 物理 | | 張二 | 100 | 美術 | | 張四 | 100 | 物理 | | 張一 | 100 | 美術 | | 張三 | 99 | 美術 | | 鋼蛋 | 99 | 美術 | +----------+-----+----------+ 8 rows in set (0.00 sec)

總結

以上是生活随笔為你收集整理的MySQL基础(三)表关系及数据的增删改查的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产成人精品av在线 | 97爱 | 91视频免费国产 | 在线播放 日韩专区 | 欧美精品第一 | 免费网站观看www在线观看 | 欧美性护士 | av免费看在线 | 亚在线播放中文视频 | 成人试看120秒 | 午夜精品久久久久久久久久久 | 亚洲精品久久久久中文字幕二区 | 丁香综合av | 一区免费观看 | 久久精品网站视频 | 特级大胆西西4444www | 91麻豆精品国产91久久久久久久久 | 91精彩在线视频 | 夜夜操天天摸 | 亚洲视频免费在线 | 国产成人a亚洲精品v | 国产一区在线精品 | 日韩av在线免费播放 | 麻花豆传媒mv在线观看网站 | 亚洲欧美成人综合 | 国产精品久久久久久久久久久久午夜 | 成人av电影免费在线播放 | 成人黄色一级视频 | 亚洲欧洲美洲av | 欧美日韩一级视频 | 成人一级视频在线观看 | 一区二区高清在线 | 亚洲日本va午夜在线电影 | 91精品久久久久久综合乱菊 | sm免费xx网站| 欧美污污视频 | 欧美日韩一区二区三区免费视频 | 欧美日韩精品电影 | 国产亚洲精品v | www.色婷婷.com| 深夜视频久久 | 婷婷色中文 | 婷婷成人在线 | 美女黄色网在线播放 | av在线亚洲天堂 | 狠狠久久伊人 | 日日干天夜夜 | 18性欧美xxxⅹ性满足 | 日韩国产欧美视频 | 欧美有色 | 四虎永久免费在线观看 | 99视频免费 | 国产在线播放不卡 | 狠狠干综合 | 欧美成人手机版 | 91九色蝌蚪国产 | 亚洲综合色站 | 久草久热 | 免费看片网址 | 欧美极品少妇xbxb性爽爽视频 | 欧美在线视频免费 | 九九色网 | 国精产品永久999 | 久久久人人人 | 国产精品热视频 | 国产精品影音先锋 | 天天伊人狠狠 | 精品国产理论 | 久久视频99 | 中文字幕在线观看第二页 | 国产精品系列在线播放 | bbb搡bbb爽爽爽 | www夜夜操| 成人久久影院 | 97综合视频 | 超碰在线中文字幕 | 国产在线精品二区 | 97免费公开视频 | a黄色片在线观看 | 久久免费精品 | 99视频在线精品免费观看2 | 国产专区精品 | 色av男人的天堂免费在线 | 91最新中文字幕 | 日日夜夜添 | 久久久网 | 亚洲欧美va | 中文字幕高清 | av一级二级 | 天天操婷婷 | 一区二区三区免费看 | 97免费中文视频在线观看 | 狠狠狠色丁香婷婷综合久久五月 | 西西4444www大胆视频 | 西西444www大胆无视频 | 一级黄色片在线播放 | 在线一区观看 | 国产女教师精品久久av | 天堂中文在线播放 | 成人小电影在线看 | 91视频免费看片 | 天天干夜夜爽 | 福利视频导航网址 | 色综合国产 | 99精品系列 | av短片在线观看 | 一区二区三区高清不卡 | 国产精品porn| 天天操天天干天天 | 欧美激情在线看 | 久久综合综合久久综合 | 国产成人精品在线观看 | 91黄在线看| 亚洲在线免费视频 | 99久久精品午夜一区二区小说 | 狠狠亚洲 | 天干啦夜天干天干在线线 | 国产 日韩 在线 亚洲 字幕 中文 | 午夜精品三区 | 一区二区亚洲精品 | 一区二区三区观看 | 日韩av中文字幕在线免费观看 | 深夜视频久久 | 亚洲一区二区天堂 | 午夜精品成人一区二区三区 | 日日射av| 久久国产精品久久精品 | 九九免费视频 | 亚洲精品免费在线视频 | 玖玖国产精品视频 | 免费大片黄在线 | 一级特黄av | 成人黄色一级视频 | 中文字幕一区在线观看视频 | 99精品免费久久久久久久久 | 国产中年夫妇高潮精品视频 | 欧美伦理一区 | av片子在线观看 | www黄色av | 久久五月天综合 | 97热视频| 日韩免费视频播放 | 日韩视频免费观看高清完整版在线 | 成人av片在线观看 | 日本一区二区三区视频在线播放 | 婷婷丁香久久五月婷婷 | 国产精品视频永久免费播放 | 中文字幕在线资源 | 在线观看911视频 | av高清网站在线观看 | www夜夜操com | 97成人在线| 成人免费亚洲 | 久久久国产影视 | 伊人宗合网 | 久久午夜精品视频 | 手机看片99| 免费观看一级特黄欧美大片 | 日韩欧美精品在线观看视频 | 日韩最新在线视频 | 99精品小视频 | 中字幕视频在线永久在线观看免费 | 国产精品一区二区三区视频免费 | 久久国产热| 成人h在线播放 | 国产五月婷 | 亚洲精品字幕 | 午夜成人免费电影 | 91av视频免费在线观看 | 中文字幕一区二区三区四区在线视频 | 久久99热国产 | 国产一区在线免费 | 91福利视频免费观看 | 91视频久久久久久 | 91久久精品日日躁夜夜躁国产 | 久久99精品国产一区二区三区 | 99精品国产免费久久 | 国产无套精品久久久久久 | 亚洲成a人片77777潘金莲 | 久久综合久久久久88 | 66av99精品福利视频在线 | 成人九九视频 | 人人干人人草 | 色网站免费在线观看 | 国产99久久久精品 | 九九日九九操 | 久久国内免费视频 | 久久激情视频网 | 91久久人澡人人添人人爽欧美 | 久草在线高清视频 | 国产大尺度视频 | 久久久久久国产精品免费 | 日韩特级黄色片 | 日韩激情在线 | 一区二区欧美激情 | 免费黄色av | 天天草av | 欧美日韩国内在线 | 久久国产精品99久久人人澡 | 久久96国产精品久久99软件 | 久久免费99| 偷拍区另类综合在线 | 97网站 | 色噜噜在线观看视频 | 国产高清无线码2021 | 伊人成人激情 | 欧美日韩在线视频一区二区 | 色就是色综合 | 一色屋精品视频在线观看 | 99热播精品 | 国产精品久久久久久麻豆一区 | 最近日韩免费视频 | 国产精品亚洲片夜色在线 | 在线观看黄污 | 超薄丝袜一二三区 | 人人爱在线视频 | 久草在线观 | 国产免费国产 | 深夜国产在线 | 国产亚洲综合在线 | 综合网天天色 | 我要色综合天天 | 久久久国产在线视频 | 久久一区91| 国产成人黄色片 | 99精品黄色片免费大全 | 摸bbb搡bbb搡bbbb | 91精品亚洲影视在线观看 | 国产精品1区 | 日本护士三级少妇三级999 | 日本99热 | 91精品视频免费看 | 五月婷婷在线观看 | 欧美一级片在线播放 | 国产精品乱码久久久久久1区2区 | 日韩免费一区二区三区 | 久久视频在线 | 国产精品一区电影 | 国产 视频 久久 | 视色网站 | av日韩中文| 亚洲视频在线视频 | 成人一级片在线观看 | 成人免费视频视频在线观看 免费 | 国产精品露脸在线 | 午夜影院在线观看18 | 色欧美88888久久久久久影院 | 日韩在线中文字幕 | 99精品免费观看 | 成人av一区二区兰花在线播放 | 国产免码va在线观看免费 | 992tv在线观看网站 | 一级a性色生活片久久毛片波多野 | 在线免费观看欧美日韩 | 国产麻豆精品一区二区 | 国产精品手机视频 | 色停停五月天 | 日本性久久 | 欧美日韩高清一区二区 国产亚洲免费看 | 精品国产乱码一区二 | 国产在线a不卡 | 亚洲a免费 | 天天操夜夜拍 | 成人sm另类专区 | 中文字幕在线观看网址 | 91看成人| 欧美日韩高清一区二区 国产亚洲免费看 | 国产精品热| 啪啪激情网| 中文字幕在线观看av | 久久男人影院 | 超碰成人av | 中文字幕在线播出 | 天天色综合1 | 97成人精品视频在线播放 | 国产精品欧美精品 | 99色在线观看视频 | 超碰在线人人97 | 日韩.com | 日韩美av在线 | 国产 日韩 欧美 自拍 | 亚洲精品一区二区三区高潮 | 亚洲欧美色婷婷 | 中文字幕在线观看91 | 狠狠色丁香 | 久久久久久久久久久免费av | 在线国产不卡 | 午夜国产福利在线 | 精品久久久久久电影 | 日韩精品免费一区二区在线观看 | 欧美日韩有码 | 久久视频精品在线 | 国产 一区二区三区 在线 | 国产一二三四在线视频 | 91精品麻豆 | 99欧美| 亚洲另类久久 | 91九色在线视频 | 久久五月激情 | 97超在线视频 | 亚洲天天干 | 91新人在线观看 | 激情六月婷婷久久 | 日韩城人在线 | 亚洲欧洲日韩在线观看 | 深爱激情婷婷网 | 97视频在线观看视频免费视频 | 五月婷婷六月丁香激情 | 天天弄天天操 | 中文字幕在线观看一区二区 | 中文字幕在线视频网站 | 免费看高清毛片 | 午夜久久久精品 | 国产小视频在线观看 | 黄色av一级 | 久草视频在线看 | 99国产在线 | 色综合久久天天 | 伊人中文字幕在线 | 欧美一区二区精品在线 | 激情综合站| 97精品国自产拍在线观看 | 亚洲国产精品视频 | 狠狠色丁香久久婷婷综合_中 | 四虎国产 | 99精品网站 | 丁香六月国产 | 天堂久色 | 色婷婷狠狠五月综合天色拍 | 六月婷婷色 | 狠狠躁天天躁综合网 | 青草视频在线看 | 亚洲精品视频网站在线观看 | av久久久久久| 亚洲精品xxxx| 成人高清在线 | 日韩精品久久久久久久电影99爱 | 婷婷综合国产 | 国产色久 | 97在线观看免费高清完整版在线观看 | 午夜av日韩 | 丁香婷婷激情啪啪 | 久久久久综合网 | 日本在线视频一区二区三区 | 亚洲国产精品va在线 | 日韩中文字幕第一页 | www.久久久.com | 精品人妖videos欧美人妖 | 五月婷婷在线观看视频 | 久久这里只有精品首页 | 日韩电影在线一区 | 成年人黄色av | 香蕉视频导航 | 青青河边草免费视频 | 亚洲一级国产 | 99久久婷婷国产综合亚洲 | 精品视频国产一区 | 婷婷久久综合网 | 色综合天天在线 | 国产精品嫩草影院9 | 青春草免费视频 | 免费看一级 | 五月激情姐姐 | 丁香六月婷婷激情 | 美女黄频免费 | av 一区二区三区四区 | 亚洲国产精品va在线看黑人 | 69精品久久久 | a视频在线观看免费 | 人人要人人澡人人爽人人dvd | 久久成人久久 | 91传媒免费在线观看 | 在线不卡视频 | 国产乱对白刺激视频不卡 | 亚洲精品国偷拍自产在线观看 | 麻豆成人在线观看 | 天天综合色 | 免费视频91 | 天天干天天拍天天操 | 国产三级精品在线 | 五月综合激情 | 日韩欧美在线国产 | 国产午夜亚洲精品 | 亚洲综合视频网 | 国产小视频在线免费观看视频 | 综合久久网站 | 黄色免费视频在线观看 | 中文字幕观看在线 | 久久这里有精品 | 欧美日韩视频在线观看免费 | 久草在线欧美 | 免费在线一区二区三区 | 91精品在线免费观看视频 | 国产精品综合在线观看 | 视频成人永久免费视频 | 亚洲美女视频在线 | 欧美日韩另类视频 | 日日碰狠狠添天天爽超碰97久久 | 国内久久| 成人精品视频久久久久 | www最近高清中文国语在线观看 | 色www精品视频在线观看 | 亚洲小视频在线观看 | 中文字幕黄色 | 亚洲国产精品成人av | 久久久国产精品视频 | 国产精品情侣视频 | 在线观看视频黄色 | 在线观看久久 | 国产精品一区二区三区四区在线观看 | 日韩视频在线不卡 | 91网页版在线观看 | 精品国产一区二区三区av性色 | 奇米影视8888在线观看大全免费 | 久久在视频 | 欧美日韩在线视频一区二区 | 国产中文字幕在线看 | 久草视频播放 | 日韩在线电影 | 日韩理论片在线 | 久久精品欧美一区二区三区麻豆 | 在线小视频你懂得 | www五月婷婷 | 在线免费av播放 | www.狠狠操.com| 国产美女搞久久 | 五月花婷婷 | 久久黄色片 | 色婷婷中文 | 九九日韩 | 国产99久久久国产精品免费二区 | 99久久精品国产亚洲 | 国产一区国产二区在线观看 | 99在线免费视频 | 中文字幕第一 | 成人免费观看视频网站 | 99视频| 国产视频中文字幕在线观看 | 丁香六月久久综合狠狠色 | 黄色成人影院 | 日韩欧美综合 | 探花视频在线版播放免费观看 | 99热精品久久 | 黄色网在线播放 | 欧美日韩高清国产 | 成年人免费电影在线观看 | 激情欧美在线观看 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 久久人人插| 99热国产在线 | 91视频亚洲 | 中文字幕在线免费看 | 国产精品麻豆三级一区视频 | 日韩va欧美va亚洲va久久 | 99视频免费在线观看 | 中文在线亚洲 | 成人av一级片 | 免费99精品国产自在在线 | 日韩欧美视频 | 国产精品久久久久久久久久久免费 | 涩涩在线 | 蜜臀91丨九色丨蝌蚪老版 | 亚洲黄色激情小说 | 久久久性 | 久草在线视频在线 | 色偷偷网站视频 | 国产69精品久久久久9999apgf | 草免费视频 | 日韩有码第一页 | 国产高清在线观看av | 成人午夜免费剧场 | 一区二区三区免费网站 | av性网站| 精品福利网| 国产网站av | 婷婷综合 | 麻豆影视在线免费观看 | 久久久久久久国产精品影院 | 欧美成人播放 | 一级片视频在线 | 久久久久麻豆 | 国产黄色片免费在线观看 | 免费成人短视频 | 狠狠插狠狠干 | 久草视频在线免费看 | 91cn国产在线| 国产成人61精品免费看片 | 天天添夜夜操 | 国产精品高清在线观看 | 午夜美女视频 | 久久精品99久久久久久2456 | 国产91欧美 | 久久乐九色婷婷综合色狠狠182 | 69国产精品视频 | 九九久久影视 | 国产精品久久久久久久午夜片 | 视频国产在线 | 国产夫妻av在线 | 国产人成在线视频 | 久草视频中文 | 久久精品视频在线观看 | 成人国产精品久久久 | 久久久久草 | 国产成人精品av | 亚洲韩国一区二区三区 | 久99久精品 | 国产成人高清 | 久国产在线播放 | 精品国产激情 | 青青色影院 | 日韩午夜三级 | 久久久久网站 | 成年性视频 | 久久神马影院 | 天天看天天干 | 午夜精品久久久久久久99热影院 | 最新高清无码专区 | 午夜精品一区二区三区四区 | 国产在线国偷精品产拍 | 国产 欧美 日韩 | 丁香花在线观看免费完整版视频 | 国内精品久久久久影院男同志 | 一区二区三区免费网站 | 国产高清一区二区 | 欧美日韩一区二区视频在线观看 | 美女网站视频色 | 天天插天天干 | 国产视频一区在线播放 | www亚洲视频 | 国产最新视频在线观看 | 99精品免费| 日韩精品久久久久久久电影99爱 | 国产成人久久久77777 | 国产亚洲精品v | 亚洲视频精选 | 91亚洲在线观看 | 亚洲九九影院 | 免费www视频| 夜夜躁日日躁 | 高清av在线 | 久久久久久久久毛片精品 | 天天操夜夜操夜夜操 | 黄色毛片在线 | 国产免费作爱视频 | 色综合天天 | 91av在线电影 | 国产精品黑丝在线观看 | 色丁香综合 | 国产精品99久久久久久久久久久久 | 久久精选视频 | 中文字幕乱码日本亚洲一区二区 | 中文字幕在线视频一区 | 久久久久女人精品毛片 | japanesexxx乱女另类 | 亚洲成人黄色在线观看 | 成 人 免费 黄 色 视频 | 岛国大片免费视频 | 日韩精品中文字幕av | 久久精品视频网站 | 国产日韩精品在线 | 97色狠狠 | 国产一区免费看 | www.狠狠操.com | 日韩av一区在线观看 | 中文字幕在线成人 | 日日躁夜夜躁aaaaxxxx | 丁香av| 国产午夜在线观看 | 在线电影a | 国产精品久久99精品毛片三a | 伊人影院99 | 久久久久国产免费免费 | 久久久久久久久久网 | 色婷婷www | 亚洲欧洲一级 | 亚洲欧美999 | 在线看岛国av | 狠狠色伊人亚洲综合网站野外 | 九九热免费在线观看 | 成年人在线免费视频观看 | a久久免费视频 | 久久精品亚洲精品国产欧美 | 欧洲性视频 | 亚洲伊人色 | 四虎在线免费视频 | 草莓视频在线观看免费观看 | 综合久久久久久久久 | 国产亚洲精品v | 亚洲精品午夜久久久 | 国内成人精品2018免费看 | 国产精品视频在线看 | 91精品国产一区二区三区 | 97精品国产一二三产区 | 日韩在线视 | 国产探花视频在线播放 | 亚洲女同videos| 美女黄色网在线播放 | 久久99热久久99精品 | 69亚洲精品| 偷拍精偷拍精品欧洲亚洲网站 | 在线黄色av电影 | 波多野结衣在线播放一区 | 99久久精品日本一区二区免费 | 999超碰 | 18久久久久 | 精品色综合 | 国产黄色美女 | 久久久色 | 又黄又爽又色无遮挡免费 | 黄色小说在线免费观看 | 99久久爱| 91 在线视频| 日韩成人中文字幕 | av不卡中文字幕 | 色综合天天视频在线观看 | 国产区在线 | 久久综合免费视频 | 玖玖视频在线 | 日韩理论片在线 | 免费在线观看污 | 91视频在线免费看 | 看黄色.com| 国产精品美女久久久久aⅴ 干干夜夜 | 国产一区二区精品久久 | 久草在线看片 | 国产精品一区电影 | 久久精品一区二区国产 | 97精品超碰一区二区三区 | 精品一二三区 | 欧美黄色特级片 | 亚洲精品天天 | 久久久久久不卡 | 国内小视频在线观看 | 探花视频在线观看免费版 | 国产精品字幕 | 国产喷水在线 | 日韩av免费在线看 | 免费视频你懂的 | 精品国产乱码一区二区三区在线 | 亚洲精品女人 | 美女视频黄在线观看 | 中文成人字幕 | 天天躁天天躁天天躁婷 | 久久久久久久久久伊人 | www五月天婷婷 | 久久久久女人精品毛片九一 | 在线视频 影院 | 日韩欧美视频免费观看 | 精品 激情 | 亚洲国产免费看 | 久久精品成人 | 成人中文字幕在线 | 精品亚洲欧美一区 | 国产一区免费观看 | av在线一级 | 国产精品一区二区久久久久 | 99免费观看视频 | 日韩精品高清视频 | 国产成人精品一区二区三区福利 | 激情开心 | 国模精品一区二区三区 | 夜夜嗨av色一区二区不卡 | 手机看国产毛片 | 亚洲一区二区三区miaa149 | 欧美午夜一区二区福利视频 | 久久久91精品国产一区二区三区 | 69精品视频 | 亚洲精品在线资源 | 999成人国产| 超碰97在线人人 | 色搞搞 | 天天操天天射天天插 | 99视频在线免费 | 久久综合射 | 五月天色婷婷丁香 | 热久久影视 | 国产成人精品国内自产拍免费看 | 国产免费av一区二区三区 | 久久久99国产精品免费 | 91丨九色丨首页 | 开心激情婷婷 | 国产视频一区在线免费观看 | 国产精品久久99 | 久草在线免 | 久久久久久久久综合 | av 在线观看 | 日韩中文三级 | www操操操| 国产一卡二卡四卡国 | 国产精品一区免费看8c0m | 久久综合中文色婷婷 | 中文字幕在线日亚洲9 | 久久精品视频一 | 免费 在线 中文 日本 | 国产精品免费观看网站 | 在线免费黄 | 国产欧美精品一区二区三区四区 | 5月丁香婷婷综合 | 天天躁天天操 | 视频国产在线观看18 | 一区二区三区免费在线播放 | 在线精品视频免费播放 | 狠狠色丁香婷婷综合久小说久 | 欧美a免费 | 精品国自产在线观看 | 丁香在线视频 | 热re99久久精品国产66热 | 日韩免费一区二区三区 | 免费高清看电视网站 | 精品国产免费人成在线观看 | 91精品办公室少妇高潮对白 | 免费三级a| 亚洲精品在线观看av | 成在人线av | 99精品免费久久久久久日本 | 麻豆精品传媒视频 | 久久国产精品精品国产色婷婷 | 久久不射网站 | 亚洲香蕉在线观看 | 国产日韩在线观看一区 | 国产精品一区二区无线 | 91精品国产综合久久久久久久 | 亚洲国产精品激情在线观看 | 丁香综合激情 | 黄网站大全| 97国产情侣爱久久免费观看 | 亚洲国产最新 | 色综合小说 | 国产一级精品绿帽视频 | 亚洲精品国产精品国产 | 久久久在线观看 | 欧美成人一区二区 | 日韩视频图片 | 国产91aaa | 婷婷天天色 | 四虎影院在线观看av | 久久中文字幕导航 | 精品一区电影 | 亚洲国产手机在线 | 国产区久久 | 国产自制av| 天天插天天操天天干 | 国产精品视频永久免费播放 | 国产精品videossex国产高清 | 一区二区不卡视频在线观看 | 在线a亚洲视频播放在线观看 | 欧美视频二区 | 摸阴视频| 日韩一级片网址 | 国产精品日韩欧美一区二区 | 特级a老妇做爰全过程 | 99在线观看免费视频精品观看 | 91免费国产在线观看 | 免费观看9x视频网站在线观看 | 97超碰在线免费 | 婷婷综合亚洲 | 69国产精品视频 | 欧美成a人片在线观看久 | 欧美日韩网站 | 999视频网站 | 日韩在线视频国产 | 国产中文字幕久久 | 精品福利视频在线观看 | 日本韩国精品一区二区在线观看 | 午夜久久精品 | 中国老女人日b | 久草视频一区 | 色丁香综合 | 精品视频中文字幕 | 欧美精品被 | 2019中文最近的2019中文在线 | 国产精品网址在线观看 | 天天综合久久综合 | 日本中文字幕网站 | 国产精品www | 亚洲精品午夜久久久久久久久久久 | 婷婷综合av | 偷拍视频一区 | 亚洲综合视频在线观看 | 天天干天天射天天插 | 成年人网站免费在线观看 | 国产视频久久 | 亚洲aⅴ久久精品 | 激情五月婷婷综合网 | 天天综合网天天 | 五月婷婷一区二区三区 | 日韩激情片在线观看 | 97国产精品免费 | av观看久久久 | 91亚洲精品久久久 | 欧美极品xxxx | 久久99国产精品久久 | 狠狠色狠狠综合久久 | 四虎影视www| 综合在线色 | 一区二区中文字幕在线观看 | 国产三级精品三级在线观看 | 成全免费观看视频 | 激情九九 | 日韩专区一区二区 | 亚洲一区二区精品视频 | 奇米影视在线99精品 | 97精品在线 | 久久女教师| 婷婷色六月天 | www日| 国产麻豆果冻传媒在线观看 | 97超碰人人看 | 国产一区久久久 | 精品久久久久久国产 | 中文字幕91视频 | 国产精品欧美久久久久天天影视 | 黄色影院在线免费观看 | 黄色在线观看免费网站 | 亚洲精品成人网 | 天天骚夜夜操 | 国产精品成人免费 | 麻豆久久精品 | 射九九 | 免费观看的av | 蜜臀av网址 | 国产精品欧美久久久久无广告 | 日韩av不卡在线播放 | 91激情 | 亚洲欧美日韩一二三区 | 国产精品久久伊人 | 亚洲另类交 | 国产精品视频全国免费观看 | 国产精品视频最多的网站 | 麻豆传媒电影在线观看 | 国产亚洲精品久久久久久网站 | 亚洲成色777777在线观看影院 | 国产不卡一区二区视频 | www.色婷婷.com| 五月天狠狠操 | 操一草| 色大片免费看 | 亚洲涩涩色 | 久草在线中文888 | 韩国一区二区三区在线观看 | 色婷婷成人 | 欧美性猛片| 色偷偷888欧美精品久久久 | 日韩国产欧美在线播放 | 色婷婷视频网 | 一二三区视频在线 | 在线黄色观看 | 久久视频二区 | 国产亚洲高清视频 | 精品黄色在线观看 | 五月花激情 | 日韩欧美精品在线 | a级黄色片视频 | 亚洲午夜精品一区 | 天天干,天天射,天天操,天天摸 | 97超碰在线久草超碰在线观看 | 欧美日韩国产一区二区三区在线观看 | 久草网首页| 久久免费精品视频 | 一级一片免费看 | 国产字幕av| 日韩中文字幕91 | 中文字幕免费高清av | 久草久草久草久草 | 亚洲一级黄色片 | 国产色视频一区二区三区qq号 | 亚洲国产精品视频 | 91系列在线 | 免费在线一区二区三区 | 五月婷婷欧美视频 | 日韩va亚洲va欧美va久久 | 欧洲一区二区在线观看 | 久草免费福利在线观看 | av怡红院 | 夜添久久精品亚洲国产精品 | 国产精品久久久久久久久久久不卡 | 国产精品久久久久久久久费观看 | 九九久久久 | 精品福利网 | 国产成人一级 | 日日夜夜婷婷 | 国产视频在线观看一区 | 四虎影视精品永久在线观看 | 不卡av在线免费观看 | www.狠狠插.com | 99久久精品免费看国产一区二区三区 | 国产精品美女久久久久久久久久久 | 狠狠色综合网站久久久久久久 | 成人av免费在线看 | 狂野欧美激情性xxxx | 日韩久久精品 | 精品99久久久久久 | 免费av观看网站 | 婷婷在线不卡 | 国产精品毛片一区二区三区 | 一级片色播影院 | 国产1区2 | 欧美日韩中文在线视频 | 亚洲色综合 | 亚洲国产97在线精品一区 | 欧美成人精品欧美一级乱黄 | 欧美激情第八页 | 天天弄天天操 | 久久久三级视频 | 国内视频在线 | 久久亚洲精品电影 | 91视频网址入口 | 日本成人中文字幕在线观看 | 欧美日韩一级久久久久久免费看 | 在线91观看 | 成人av在线一区二区 | 手机在线日韩视频 | aav在线| 在线一区观看 | a黄在线观看 | 国语自产偷拍精品视频偷 | 在线国产片 | 久久久香蕉视频 | 日韩av免费大片 | 久草99 | 国产在线国偷精品产拍免费yy | 97在线观看免费高清完整版在线观看 | 国产在线观看免 | av软件在线观看 | 日韩av片在线 | 日韩免费在线视频 | 97在线观看免费 | 99久久精品日本一区二区免费 | 国产正在播放 | 三级黄色在线观看 | 天天干天天天天 | 99精品视频网站 | 日韩中文在线视频 | 天天操人 | 四虎影视欧美 | 狠狠躁夜夜躁人人爽视频 | 日韩久久久久久 | 免费在线观看av不卡 | 狠狠躁日日躁夜夜躁av | 久久区二区 | 亚洲国产精品电影在线观看 | 91精品一区二区三区久久久久久 | 91免费版成人| 日韩免费电影一区二区 | www.天天色 | 97在线看片 | 欧美一级在线观看视频 | 性色大片在线观看 | 深夜国产在线 | 五月婷婷一区二区三区 | 亚洲日本va午夜在线电影 | 天天操天天能 | 黄色免费高清视频 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 国产综合小视频 | 久久久久久久久久久久久久免费看 | 中文字幕在线免费看线人 | 亚洲国产精品久久久久婷婷884 | 国内久久久久 | 午夜在线免费观看视频 | 国产中文字幕在线免费观看 | 日韩在线视频观看 | 最新国产一区二区三区 | 亚洲高清在线精品 | 日韩电影在线看 | 中日韩免费视频 | 91丨porny丨九色 | 婷婷播播网 | 99久久精品日本一区二区免费 | 午夜av影院 | www.天天操.com | 不卡的一区二区三区 | 日韩欧美视频免费在线观看 | 最新高清无码专区 | 色综合色综合色综合 | 97视频中文字幕 | 西西444www| 中文字幕在线有码 | 国产在线最新 | 国外av在线 | 四虎www | 日韩极品在线 | 成人黄在线 | 亚洲成人第一区 | 正在播放国产一区 | 精品视频免费播放 | 国产色视频123区 | 99成人免费视频 | 成年人黄色免费看 | 激情久久久 | 国产香蕉视频在线观看 | 黄色小说在线观看视频 | a特级毛片 | 亚洲黄在线观看 | 二区在线播放 | 日韩电影在线观看一区 | 欧美精品久久久久 | 免费久久99精品国产 |