精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

PostgreSQL用戶應掌握的高級SQL特性

數據庫 其他數據庫 PostgreSQL
PostgreSQL數據庫在SQL和NoSQL方面具有很多豐富的特性,本文將先從SQL高級特性入手來進行介紹。

PostgreSQL用戶應掌握的高級SQL特性

PostgreSQL數據庫在SQL和NoSQL方面具有很多豐富的特性,本文將先從SQL高級特性入手來進行介紹。

一、PostgreSQL的SQL高級特性

這一部分主要介紹PostgreSQL在SQL方面的高級特性,例如WITH查詢、批量插入、RETURNING返回修改的數據、UPSERT、數據抽樣、聚合函數、窗口函數等。

1、WITH查詢

WITH查詢是PostgreSQL支持的高級SQL特性之一,這一特性常稱為CTE(Common Table Expressions),WITH查詢在復雜查詢中定義一個輔助語句(可理解成在一個查詢中定義的臨時表),這一特性常用于復雜查詢或遞歸查詢應用場景。

先通過一個簡單的CTE示例了解WITH查詢,如下所示:

 

  1. WITH t as (  
  2.   SELECT generate_series(1,3)  
  3.  
  4. SELECT * FROM t; 

執行結果如下:

 

  1. generate_series  
  2. -----------------  
  3.                       1  
  4.                       2  
  5.                       3  
  6. (3 rows

這個簡單的CTE示例中,一開始定義了一條輔助語句t取數,之后在主查詢語句中查詢t,定義的輔助語句就像是定義了一張臨時表,對于復雜查詢如果不使用CTE,可以通過創建視圖方式簡化SQL。

WITH查詢的一個重要屬性是RECURSIVE,使用RECURSIVE屬性可以引用自己的輸出,從而實現遞歸,一般用于層次結構或樹狀結構的應用場景。

例如,存在一張包含如下數據的表:

 

  1. id name fatherid  
  2. 1 中國 0  
  3. 2 遼寧 1  
  4. 3 山東 1  
  5. 4 沈陽 2  
  6. 5 大連 2  
  7. 6 濟南 3  
  8. 7 和平區 4  
  9. 8 沈河區 4 

使用PostgreSQL的WITH查詢檢索ID為7以及以上的所有父節點,如下:

 

  1. WITH RECURSIVE r AS (  
  2.        SELECT * FROM test_area WHERE id = 7  
  3.      UNION   ALL  
  4.        SELECT test_area.* FROM test_area, r WHERE test_area.id = r.fatherid  
  5.      )  
  6.  SELECT * FROM r ORDER BY id; 

查詢結果如下:

 

  1. id   |  name   | fatherid  
  2. ----+--------+----------  
  3.   1  |   中國    |        0  
  4.   2  |    遼寧   |        1  
  5.   4  |    沈陽   |        2  
  6.   7  |   和平區  |        4  
  7. (4 rows

2、批量插入

批量插入是指一次性插入多條數據,主要用于提升數據插入效率,PostgreSQL有多種方法實現批量插入:

方式一:INSERT INTO..SELECT.

過表數據或函數批量插入,這種方式大部分關系數據庫都支持,語法如下:

INSERT INTO table_name SELECT …FROM source_table

方式二:INSERT INTO VALUES (),(),…()

這種批量插入方式為一條INSERT語句中通過VALUES關鍵字插入多條記錄,通過一個例子就很容易理解,如下所示:

 

  1. mydb=> CREATE TABLE tbl_batch3(id int4,info text);  
  2. CREATE TABLE  
  3.  
  4. mydb=> INSERT INTO tbl_batch3(id,info) VALUES (1,'a'),(2,'b'),(3,'c');  
  5. INSERT 0 3 

數據如下:

 

  1. mydb=> SELECT * FROM tbl_batch3;  
  2.     id  | info  
  3.   ----+------  
  4.       1 | a  
  5.       2 | b  
  6.       3 | c  
  7. (3 rows

這種批量插入方式非常獨特,一條SQL插入多行數據,相比一條SQL插入一條數據的方式能減少和數據庫的交互,減少數據庫WAL(Write-Ahead Logging)日志的生成,提升插入效率,通常很少有開發人員了解PostgreSQL的這種批量插入方式。

方式三:COPY或\COPY元命令

COPY或\COPY元命令能夠將一定格式的文件數據導入到數據庫中,相比INSERT命令插入效率更高,通常大數據量的文件導入一般在數據庫服務端主機通過PostgreSQL超級用戶使用COPY命令導入。

將文件tbl_batch4.txt的一千萬數據導入到表中,如下所示:

 

  1. mydb=# TRUNCATE TABLE pguser.tbl_batch4;  
  2. TRUNCATE TABLE 
  3.  
  4. mydb=# COPY pguser.tbl_batch4 FROM '/home/pg10/tbl_batch4.txt' 
  5. COPY 10000000 

3、RETURNING返回修改的數據

PostgreSQL的RETURNING特性可以返回DML修改的數據,具體為以下三個場景 ,INSERT語句后接RETURNING屬性返回插入的數據,UPDATE語句后接RETURNING屬性返回更新后的新值,DELETE語句后接RETURNING屬性返回刪除的數據,這個特性的優點在于不需要額外的SQL獲取這些值,能夠方便應用開發,接著通過示例演示。

RETURNING返回插入的數據

INSERT語句后接RETURNING屬性返回插入的值,以下創建測試表,并返回已插入的整行數據。

 

  1. mydb=> CREATE TABLE test_r1(id serial,flag char(1));  
  2. CREATE TABLE  
  3. mydb=> INSERT INTO test_r1(flag) VALUES ('a') RETURNING *;  
  4.    id | flag  
  5. ----+------  
  6.    1 | a  
  7. (1 row)  
  8. INSERT 0 1 

RETURNING返回更新后數據

UPDATE后接RETURNING屬性返回UPDATE語句更新后的值,如下所示:

 

  1. mydb=> SELECT * FROM test_r1 WHERE id=1;  
  2.    id | flag  
  3. ----+------  
  4.     1 | a  
  5. (1 row)  
  6.  
  7. mydb=> UPDATE test_r1 SET flag='p' WHERE id=1 RETURNING *;  
  8.    id | flag  
  9. ----+------  
  10.     1 | p  
  11. (1 row)  
  12. UPDATE 1 

RETURNING返回刪除的數據

DELETE后接RETURNING屬性返回刪除的數據,如下所示:

 

  1. mydb=> DELETE FROM test_r1 WHERE id=2 RETURNING *;  
  2.    id | flag  
  3. ----+------  
  4.     2 | b  
  5. (1 row)  
  6. DELETE 1 

4、UPSERT

PostgreSQL的UPSERT特性是指INSERT ... ON CONFLICT UPDATE,用來解決在數據插入過程中數據沖突的情況,比如違反用戶自定義約束,日志數據應用場景通常在事務中批量插入日志數據,如果其中有一條數據違反表上的約束,則整個插入事務將會回滾,PostgreSQL的UPSERT特性可解決這一問題。

接下來通過例子來理解UPSERT的功能,定義一張用戶登錄日志表并插入一條數據,如下:

 

  1. mydb=> CREATE TABLE user_logins(user_name text primary key 
  2. login_cnt int4,  
  3. last_login_time timestamp(0) without time zone);  
  4. CREATE TABLE  
  5.  
  6. mydb=> INSERT INTO user_logins(user_name,login_cnt) VALUES ('francs',1);  
  7. INSERT 0 1 

在user_logins表user_name字段上定義主鍵,批量插入數據中如有重復會報錯,如下所示:

 

  1. mydb=> INSERT INTO user_logins(user_name,login_cnt) VALUES ('matiler',1),('francs',1);  
  2. ERROR:  duplicate key value violates unique constraint "user_logins_pkey"  
  3. DETAIL:  Key (user_name)=(francs) already exists. 

上述SQL試圖插入兩條數據,其中matiler這條數據不違反主鍵沖突,而francs這條數據違反主鍵沖突,結果兩條數據都不能插入。PostgreSQL的UPSERT可以處理沖突的數據,比如當插入的數據沖突時不報錯,同時更新沖突的數據,如下所示:

 

  1. mydb=> INSERT INTO user_logins(user_name,login_cnt)VALUES ('matiler',1),('francs',1)  
  2. ON CONFLICT(user_name)      
  3. DO UPDATE SET  
  4. login_cnt=user_logins.login_cnt+EXCLUDED.login_cnt,last_login_time=now();  
  5. INSERT 0 2 

上述INSERT語句插入兩條數據,并設置規則:

當數據沖突時更新登錄次數字段login_cnt值加1,同時更新最近登錄時間last_login_time,ON CONFLICT(user_name)定義沖突類型為user_name字段,DO UPDATE SET是指沖突動作,后面定義了一個UPDATE語句,注意上述SET命令中引用了user_loins表和內置表EXCLUDED,引用原表user_loins訪問表中已存在的沖突記錄,內置表EXCLUDED引用試圖插入的值,再次查詢表user_login,如下所示:

 

  1. mydb=> SELECT * FROM user_logins ;  
  2.  user_name | login_cnt |   last_login_time    
  3.   -----------+-----------+---------------------  
  4.      matiler   |              1 |  
  5.       francs    |              2 | 2017-08-08 15:23:13  
  6.     (2 rows

一方面沖突的francs這條數據被更新了login_cnt和last_login_time字段,另一方面新的數據matiler記錄已正常插入。

5、數據抽樣

數據抽樣(TABLESAMPLE)在數據處理方面經常用到,特別是當表數據量比較大時,隨機查詢表一定數量記錄很常見,PostgreSQL早在9.5版時就已經提供了TABLESAMPLE數據抽樣功能,9.5版前通常通過ORDER BY random()方式實現數據抽樣,這種方式雖然在功能上滿足隨機返回指定行數據,但性能很低,如下:

表user_ini數據量為100萬,從100萬隨機取一條上述SQL執行時間為367ms,這種方法走了全表掃描和排序,效率非常低,當表數據量大時,性能幾乎無法接受。

9.5版本以后PostgreSQL支持TABLESAMPLE數據抽樣,語法如下:

SELECT …

FROM table_name

TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ]

sampling_method指抽樣方法,主要有兩種:SYSTEM和BERNOULLI。接下來詳細介紹這兩種抽樣方式,argument指抽樣百分比。

SYSTEM抽樣方式

SYSTEM抽樣方式為隨機抽取表上數據塊上的數據,理論上被抽樣表的每個數據塊被檢索的概率是一樣的,SYSTEM抽樣方式基于數據塊級別,后接抽樣參數,被選中的塊上的所有數據將被檢索。

創建test_sample測試表,并插入150萬數據,抽樣因子設置成0.01,意味著返回1500000*0.01%=150條記錄,執行如下SQL:

以上執行計劃主要有兩點:

  • 一方面走了Sample Scan掃描(抽樣方式為SYSTEM),執行時間為0.166毫秒,性能較好;
  • 另一方面優化器預計訪問150條記錄,實際返回107條。

BERNOULLI抽樣方式

BERNOULLI抽樣方式隨機抽取表的數據行,并返回指定百分比數據,BERNOULLI抽樣方式基于數據行級別,理論上被抽樣表的每行記錄被檢索的概率是一樣的,因此BERNOULLI抽樣方式抽取的數據相比SYSTEM抽樣方式具有更好的隨機性,但性能上相比SYSTEM抽樣方式低很多,下面演示下BERNOULLI抽樣方式,同樣基于test_sample測試表。

設置抽樣方式為BERNOULLI,抽樣因子為0.01,如下所示:

從以上執行計劃看出走了Sample Scan掃描(抽樣方式為BERNOULLI),執行計劃預計返回150條記錄,實際返回152條,從返回的記錄數來看,非常接近150條(1000000*0.01%),但執行時間卻要22.569毫秒,性能相比SYSTEM抽樣方式0.166毫秒差了136倍。

多次執行以下查詢,查看返回記錄數的變化,如下所示:

 

  1. mydb=>  SELECT count(*) FROM test_sample TABLESAMPLE BERNOULLI(0.01);  
  2.  count  
  3. -------  
  4.    151  
  5. (1 row) 
  6.  
  7.  
  8. mydb=>  SELECT count(*) FROM test_sample TABLESAMPLE BERNOULLI(0.01);  
  9.  count  
  10. -------  
  11.    147  
  12. (1 row) 

從以上看出,BERNOULLI抽樣方式返回的數據量非常接近抽樣數據的百分比,而SYSTEM抽樣方式數據返回以數據塊為單位,被抽樣的塊上的所有數據都被返回,因此SYSTEM抽樣方式的數據量返回的偏差較大。

這里演示了SYSTEM和BERNOULLI抽樣方式,SYSTEM抽樣方式基于數據塊級別,隨機抽取表數據塊上的記錄,因此這種方式抽取的記錄的隨機性不是很好,但返回的數據以數據塊為單位,抽樣性能很高,適用于抽樣效率優先的場景,例如抽樣大小為GB的日志表;而BERNOULLI抽樣方式基于數據行,相比SYSTEM抽樣方式所抽樣的數據隨機性更好,但性能相比SYSTEM差很多,適用于抽樣隨機性優先的場景,讀者可根據實際應用場景選擇抽樣方式。

6、聚合函數

聚合函數可以對結果集進行計算,常用的聚合函數有avg()、sum()、min()、max()、count()等,本節將介紹PostgreSQL兩個特殊功能的聚合函數并給出測試示例。

在介紹兩個聚合函數之前,先來看一個應用場景,假如一張表有以下數據,如下:

 

  1. country  | city  
  2. ---------+------  
  3.  中國      | 臺北  
  4.  中國      | 香港  
  5.  中國      | 上海  
  6.  日本      | 東京  
  7.  日本      | 大阪  
  8. (5 rows

要求得到如下結果集:

 

  1. 中國       臺北,香港,上海  
  2. 日本       東京,大阪 

這個SQL大家想想如何寫?

string_agg函數

首先介紹string_agg函數,此函數語法如下:

string_agg(expression, delimiter)

簡單的說string_agg函數能將結果集某個字段的所有行連接成字符串,并用指定delimiter分隔符分隔,expression表示要處理的字符類型數據;參數的類型為(text, text) 或 (bytea, bytea),函數返回的類型同輸入參數類型一致,bytea屬于二進制類型,使用情況不多,我們主要介紹text類型輸入參數,本節開頭的場景正好可以用string_agg函數處理。

將city字段連接成字符串如下:

 

  1. mydb=> SELECT string_agg(city,','FROM city;  
  2.         string_agg          
  3. --------------------------  
  4.  臺北,香港,上海,東京,大阪  
  5. (1 row) 

可見string_agg函數將輸出的結果集連接成了字符串,并用指定的逗號分隔符分隔,回到本文開頭的問題,通過以下SQL實現,如下所示:

 

  1. mydb=> SELECT country,string_agg(city,','FROM city GROUP BY country;  
  2.  country |   string_agg    
  3. ---------+----------------  
  4.    日本    | 東京,大阪  
  5.    中國    | 臺北,香港,上海 

array_agg函數

array_agg函數和string_agg函數類似,最主要的區別為返回的類型為數組,數組數據類型同輸入參數數據類型一致,array_agg函數支持兩種語法,***種如下:

  1. array_agg(expression)  --輸入參數為任何非數組類型 

輸入參數可以是任何非數組類型,返回的結果是一維數組,array_agg函數將結果集某個字段的所有行連接成數組,執行以下查詢:

 

  1. mydb=> SELECT country,array_agg(city) FROM city GROUP BY country;  
  2.  country |    array_agg       
  3. ---------+------------------  
  4.    日本    | {東京,大阪}  
  5.    中國    | {臺北,香港,上海} 

array_agg函數輸出的結果為字符類型數組,其他無明顯區別,使用array_agg函數主要優點在于可以使用數組相關函數和操作符。

7、窗口函數

PostgreSQL提供內置的窗口函數,例如row_num()、rank()、lag()等,除了內置的窗口函數外,聚合函數、自定義函數后接OVER屬性也可作為窗口函數。

窗口函數的調用語法稍復雜,如下所示:

function_name ([expression [, expression ... ]]) [ FILTER ( WHERE filter_clause ) ] OVER ( window_definition )

其中window_definition語法如下:

[ existing_window_name ]

[ PARTITION BY expression [, ...] ]

[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]

[ frame_clause ]

  • OVER表示窗口函數的關鍵字。
  • PARTITON BY屬性對查詢返回的結果集進行分組,之后窗口函數處理分組的數據。
  • ORDER BY屬性設定結果集的分組數據的排序。

row_number() 窗口函數

創建一張成績表并插入測試數據,如下所示:

 

  1. CREATE TABLE score ( id serial primary key 
  2.                      subject character varying(32),  
  3.                      stu_name character varying(32),  
  4.                      score numeric(3,0) );  
  5.  
  6. INSERT INTO score ( subject,stu_name,score ) VALUES ('Chinese','francs',70);  
  7. INSERT INTO score ( subject,stu_name,score ) VALUES ('Chinese','matiler',70);  
  8. INSERT INTO score ( subject,stu_name,score) VALUES ('Chinese','tutu',80);  
  9. INSERT INTO score ( subject,stu_name,score ) VALUES ('English','matiler',75);  
  10. INSERT INTO score ( subject,stu_name,score ) VALUES ('English','francs',90);  
  11. INSERT INTO score ( subject,stu_name,score ) VALUES ('English','tutu',60);  
  12. INSERT INTO score ( subject,stu_name,score ) VALUES ('Math','francs',80);  
  13. INSERT INTO score ( subject,stu_name,score ) VALUES ('Math','matiler',99);  
  14. INSERT INTO score ( subject,stu_name,score ) VALUES ('Math','tutu',65); 

avg() OVER()窗口函數

聚合函數后接OVER屬性的窗口函數表示在一個查詢結果集上應用聚合函數,本小節將演示avg()聚合函數后接OVER屬性的窗口函數,此窗口函數用來計算分組后數據的平均值。

查詢每名學生學習成績并且顯示課程的平均分,通常是先計算出課程的平均分,之后score表再與平均分表關聯查詢,如下所示:

使用窗口函數很容易實現以上需求,如下所示:

以上查詢前三列來源于表score,第四列表示取課程的平均分,PARTITION BY subject表示根據字段subject進行分組。

rank()窗口函數

rank()窗口函數和row_number()窗口函數相似,主要區別為當組內某行字段值相同時,行號重復并且行號產生間隙(手冊上解釋為gaps),如下:

以上示例中,Chinese課程前兩條記錄的score字段值都為70,因此前兩行的rank字段值1,而第三行的rank字段值為3,產生了間隙。

dense_rank ()窗口函數

dense_rank ()窗口函數和rank ()窗口函數相似,主要區別為當組內某行字段值相同時,雖然行號重復,但行號不產生間隙(手冊上解釋為gaps),如下:

以上示例中,Chinese課程前兩行的rank字段值1,而第三行的rank字段值為2,沒有產生間隙。

PostgreSQL還支持很多其它內置窗口函數,例如、lag()、first_values()、last_values()等,篇幅關系不再介紹。

二、總結

本篇文章主要介紹了PostgreSQL支持的一些高級SQL特性,例如WITH查詢、批量插入、RETURNING返回DML修改的數據、UPSERT、數據抽樣、聚合函數、窗口函數等,了解這些功能能夠簡化SQL代碼,提升開發效率,并且實現普通查詢不容易實現的功能,希望通過閱讀本章,大家能夠在實際工作中應用SQL高級特性,同時挖掘PostgreSQL的其它高級SQL特性。

 

PostgreSQL不僅是關系型數據庫,同時支持NoSQL特性,關于PostgreSQL的NoSQL特性我們將在下一篇文章中介紹。 

責任編輯:龐桂玉 來源: DBAplus社群
相關推薦

2012-12-25 09:39:40

2014-02-17 10:54:13

PostgreSQL數據庫

2018-09-28 14:37:25

數據庫PostgreSQNoSQL

2019-01-17 09:04:01

PostgreSQL復制Redo

2013-10-08 10:42:27

前端開發開發

2013-08-08 10:26:08

前端開發Web

2023-03-28 23:27:36

C#編程

2023-12-02 08:55:18

Paru 2.0

2014-09-05 09:31:09

2015-07-06 15:15:50

移動OA

2024-01-19 21:07:22

C++20Concepts函數

2009-06-30 16:57:21

Criteria查詢

2009-12-11 17:25:00

Grub突破root

2023-10-06 00:04:02

2017-10-13 15:06:18

數據庫PostgreSQL特性

2024-04-24 10:31:20

PostgreSQL數據庫

2024-04-12 08:28:38

優化查詢語句PostgreSQL索引

2009-09-07 17:46:18

LINQ高級特性

2019-07-26 13:49:49

用戶組Linux

2021-10-12 07:15:03

C++20特性
點贊
收藏

51CTO技術棧公眾號

久久嫩草精品久久久久| 在线成人黄色| 91麻豆精品国产91久久久久久| 国产精品免费久久久| 久久福利免费视频| 麻豆一区二区| 欧美在线不卡视频| 69sex久久精品国产麻豆| 国产一级二级三级在线观看| 国产在线精品一区在线观看麻豆| 一区二区欧美日韩视频| 国产一级片中文字幕| 悠悠资源网亚洲青| 一区二区在线观看视频在线观看| 国产精品女人久久久久久| 黑鬼狂亚洲人videos| 久久资源综合| 制服丝袜亚洲网站| 国产日韩一区二区在线观看| av网址在线| 国产欧美精品在线观看| 国产一区二区精品在线| 国产乱叫456在线| 日韩成人dvd| 97av在线播放| 久久久久久久久久一区二区三区 | 日韩欧美影院| 欧美精品1区2区| 中文字幕欧美人妻精品一区| gogo高清午夜人体在线| 亚洲视频一区二区在线| 欧美激情国产日韩| 午夜视频www| 国产99一区视频免费| 91久久在线播放| 曰批又黄又爽免费视频| 日日夜夜免费精品视频| 欧美在线一级视频| 97久久久久久久| 一本久道综合久久精品| 欧美精品videofree1080p| 国产wwwwxxxx| 97精品97| 久久久国产精彩视频美女艺术照福利| 精产国品一二三区| 99国内精品久久久久| 91国在线观看| 一区二区三区韩国| 电影一区二区| 欧美视频自拍偷拍| 91制片厂毛片| 国产成人午夜性a一级毛片| 欧洲色大大久久| 免费黄色一级网站| 成人一区视频| 91麻豆精品国产| 国内av免费观看| 88久久精品| 亚洲大胆人体在线| 国产精品无码毛片| 九九亚洲视频| 在线国产精品视频| 亚洲精品一区二区三区在线播放| 极品尤物一区| 亚洲精品久久久一区二区三区| 性欧美极品xxxx欧美一区二区| 大地资源网3页在线观看| 亚洲色欲色欲www| 在线视频精品一区| 色a资源在线| 欧美性生交大片免费| 免费裸体美女网站| 日韩成人在线一区| 91精品福利在线一区二区三区 | www.av欧美| 国产一区二区三区四区五区传媒| 欧美日韩综合色| 中文字幕在线中文字幕日亚韩一区| 天堂av电影在线观看| 国产亚洲女人久久久久毛片| 亚洲一区bb| 国产99re66在线视频| 色香蕉成人二区免费| 日本在线观看免费视频| 美女日韩一区| 亚洲免费中文字幕| 日韩在线一卡二卡| 一区二区三区四区五区在线| 国产精品入口夜色视频大尺度 | 欧美草逼视频| 欧美午夜女人视频在线| 国产精品嫩草影院8vv8| 中文字幕一区日韩精品 | 欧美在线免费观看| 五月婷婷丁香在线| 成人久久视频在线观看| 茄子视频成人在线观看 | 日韩在线高清视频| 久久精品国产亚洲av麻豆色欲| 91精品电影| 欧美自拍视频在线| 国产精品国产三级国产aⅴ| av在线综合网| 波多野结衣三级在线| 美女高潮视频在线看| 制服丝袜日韩国产| 亚洲黄色免费视频| 亚洲欧洲午夜| 亚洲最大av在线| av在线电影观看| 午夜亚洲福利老司机| 午夜啪啪小视频| 国产精品嫩模av在线| 久久久久久有精品国产| 91亚洲国产成人久久精品麻豆| 日本视频一区二区三区| 好吊色欧美一区二区三区视频 | 成人日韩av| 日韩精品免费在线| 91麻豆精品成人一区二区| 免费在线亚洲欧美| 九九九九精品| 欧美激情成人动漫| 日韩一区二区精品在线观看| 色撸撸在线视频| 久久国产高清| 六月婷婷久久| 在线最新版中文在线| 精品88久久久久88久久久| 欧美日韩在线国产| 国产综合色产在线精品| 亚洲欧洲免费无码| 日韩一区精品| 亚洲天堂av在线播放| 99久在线精品99re8热| 国产suv精品一区二区883| 老汉色影院首页| 中文字幕综合| 九九九久久久久久| 午夜老司机福利| 一区二区三区日本| av在线天堂网| 亚洲三级毛片| 精品一区二区国产| 制服丝袜专区在线| 亚洲人a成www在线影院| www.日韩一区| 国产精品私人自拍| wwwwwxxxx日本| 中文字幕一区二区三区欧美日韩| 2024亚洲男人天堂| 天堂网av在线播放| 狠狠躁夜夜躁人人爽天天天天97| av免费一区二区| 国产精品7m凸凹视频分类| 91亚洲国产成人久久精品网站| 成人午夜免费在线观看| 亚洲va国产天堂va久久en| 久久久久无码国产精品一区李宗瑞 | 欧美喷水视频| 国产高清在线一区二区| 国内精彩免费自拍视频在线观看网址| 欧美三级欧美一级| 成人性生活毛片| 成人一区二区三区中文字幕| 日本十八禁视频无遮挡| 久久99国产成人小视频| 国产成人精品综合久久久| 成人在线二区| 日韩一二三四区| 91九色丨porny丨肉丝| 久久久亚洲午夜电影| 色播五月综合网| 午夜久久tv| 欧美黄色直播| avtt久久| 97香蕉久久超级碰碰高清版 | 精品无码人妻一区二区三| av中文一区二区三区| 青青青国产在线视频| 五月开心六月丁香综合色啪| 国产精品视频免费一区| 欧美人体一区二区三区| 久久久999精品视频| 午夜国产在线视频| 欧美人xxxx| 国产成人无码精品久在线观看| 国产福利一区在线观看| 日韩在线综合网| 成人aaaa| 国产精品一区免费观看| 久久亚洲精品中文字幕| 91精品国产乱码久久久久久久久| 二区三区在线视频| 在线亚洲一区二区| 国产系列精品av| 国产精品国产自产拍高清av王其| 波多野结衣天堂| 欧美激情四色| 色一情一乱一伦一区二区三区 | 日韩欧美中文免费| 九九精品视频免费| 91视频观看视频| 国产精品久久久久久久99| 丝袜诱惑制服诱惑色一区在线观看| 免费电影一区| 视频精品一区| 国产精品国产自产拍高清av水多| jizz在线观看视频| 亚洲国产欧美日韩精品| 国产毛片久久久久| 欧美专区亚洲专区| 国产一级片毛片| 亚洲精品v日韩精品| 大胸美女被爆操| 久久人人爽人人爽| 欧美xxxxx精品| 国产成人亚洲精品狼色在线| 亚洲成人福利在线| 久久一二三四| 国产成人在线免费看| 欧美日韩理论| 中国一级大黄大黄大色毛片| 不卡日本视频| 亚洲成人网上| av在线不卡免费观看| 久久久久一区二区| 免费萌白酱国产一区二区三区| 国产99久久精品一区二区永久免费| 免费看男男www网站入口在线| 欧美亚洲高清一区| 国产精品一区二区三区四| 午夜精品爽啪视频| 国产网址在线观看| 亚洲一区二区三区中文字幕在线| 一区二区视频观看| www.欧美日韩| 鲁大师私人影院在线观看| 成人午夜精品在线| 午夜不卡久久精品无码免费| 国产成人午夜精品5599| 国产大学生av| 丁香激情综合国产| 波多野结衣三级视频| 国产成人av福利| 日本少妇xxxx软件| 成人av网站在线| 美女黄色一级视频| 99久久99久久久精品齐齐| 在线精品视频播放| 91网站黄www| 亚洲精品国产熟女久久久| 日本一区二区免费在线| 女人裸体性做爰全过| 亚洲欧美国产77777| 国语对白在线播放| 亚洲午夜在线电影| 好吊妞视频一区二区三区| 欧美日韩综合视频网址| 亚洲欧美精品一区二区三区| 色香色香欲天天天影视综合网| 免费一级a毛片夜夜看| 亚洲午夜电影网| 五月激情六月丁香| 91国在线观看| 国产免费av电影| 亚洲精品在线网站| 欧美新色视频| 日韩在线小视频| 国产精品偷拍| 国产精品爱啪在线线免费观看| 黄色美女视频在线观看| 欧美在线观看网站| 小明成人免费视频一区| 91久久中文字幕| 女同一区二区三区| 亚洲一区二区三区精品在线观看| 亚洲最好看的视频| 一区二区在线不卡| 红桃视频国产精品| 天堂社区在线视频| 成人免费黄色大片| 永久免费av无码网站性色av| 亚洲人成网站在线| 中国一级免费毛片| 69堂国产成人免费视频| 完全免费av在线播放| 永久域名在线精品| 亚洲东热激情| 国产欧美一区二| 99久久国产综合精品女不卡| 国产精品综合激情| 精品国产福利视频| 国产又粗又猛又黄| 日韩av在线天堂网| av网站导航在线观看免费| 91精品久久久| 欧美亚洲禁片免费| 亚洲欧美激情另类| 在线看日韩欧美| 国产天堂在线播放视频| 国产精品第七影院| 岛国av一区| 一个色的综合| 午夜在线一区二区| 伊人久久久久久久久| 欧美国产视频在线| 中日韩黄色大片| 日韩免费电影网站| 97在线观看免费观看高清| 2019中文字幕在线| 中文字幕亚洲在线观看| 一区二区三区我不卡| 亚洲毛片视频| 白丝校花扒腿让我c| 中国av一区二区三区| 国产综合精品视频| 精品国产一区二区三区不卡 | 青青草原亚洲| 国产一区清纯| 99re精彩视频| 久久久噜噜噜久久中文字幕色伊伊| 久久人人爽人人爽人人片| 91女人视频在线观看| 久久久久久久极品内射| 4438成人网| 国产在线超碰| 国产97在线视频| 美日韩中文字幕| 日本精品免费在线观看| 岛国一区二区在线观看| 无码黑人精品一区二区| 欧美日韩久久一区| 高清av电影在线观看| 热久久这里只有精品| 欧美一区二区三区红桃小说| 国产aaa免费视频| 国产精品99久久久久| 欧美做爰爽爽爽爽爽爽| 在线综合视频播放| 91网址在线观看| 99re6在线| 欧美日韩18| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 亚洲精品日韩专区silk| 97超视频在线观看| 久久精品视频中文字幕| 91嫩草国产线观看亚洲一区二区| 99久久自偷自偷国产精品不卡| 欧美人妖在线观看| 丁香六月激情网| 成人国产亚洲欧美成人综合网| x88av在线| 欧美吞精做爰啪啪高潮| 3d成人动漫在线| 91亚洲精品在线| 欧美国产高清| 一级特黄a大片免费| 欧美日韩国产色| 欧美套图亚洲一区| 国产精品免费视频久久久| 日韩国产在线| 自拍一级黄色片| 欧美日韩国产区| 成人免费黄色网页| 91在线播放国产| 伊人久久成人| 91视频免费观看网站| 欧美挠脚心视频网站| 国产高清一区二区三区视频| 成人永久免费| 丝袜亚洲另类欧美| 天天做夜夜爱爱爱| 亚洲成人精品久久| 欧美美女日韩| 日本高清xxxx| 91在线视频观看| 亚洲天堂网在线视频| 久久久亚洲天堂| 成人3d动漫在线观看| 欧美熟妇精品一区二区| 色综合咪咪久久| caoporn97在线视频| 久久成人资源| 久久99久久久欧美国产| 日本在线观看视频网站| 亚洲丝袜在线视频| 日韩影片在线观看| 午夜精品久久久内射近拍高清| av不卡在线播放| 亚洲精品久久久久久久蜜桃| 久久伊人色综合| 免费成人网www| 国产精品欧美性爱| 欧美在线免费视屏| 多野结衣av一区| 国产成人精品免费看在线播放| 国产一区三区三区| 久久久国产高清| 久久国产精品影片|