亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

SQL養(yǎng)成一個(gè)好習(xí)慣是一筆財(cái)富

系統(tǒng) 1624 0

做軟件開(kāi)發(fā)的,大部分人都離不開(kāi)跟數(shù)據(jù)庫(kù)打交道,特別是erp開(kāi)發(fā)的,跟數(shù)據(jù)庫(kù)打交道更是頻繁,存儲(chǔ)過(guò)程動(dòng)不動(dòng)就是上千行,如果數(shù)據(jù)量大,人員流動(dòng)大,那么我么還能保證下一段時(shí)間系統(tǒng)還能流暢的運(yùn)行嗎?我么還能保證下一個(gè)人能看懂我么的存儲(chǔ)過(guò)程嗎?那么我結(jié)合公司平時(shí)的培訓(xùn)和平時(shí)個(gè)人工作經(jīng)驗(yàn)和大家分享一下,希望對(duì)大家有幫助。

  要知道SQL語(yǔ)句,我想我們有必要知道SQL Server查詢(xún)分析器怎么執(zhí)行我們的SQL語(yǔ)句的,我們很多人會(huì)看執(zhí)行計(jì)劃,或者用Profiler來(lái)監(jiān)視和調(diào)優(yōu)查詢(xún)語(yǔ)句或者存儲(chǔ)過(guò)程慢的原因,但是如果我們知道查詢(xún)分析器的執(zhí)行邏輯順序,下手的時(shí)候就胸有成竹,那么下手是不是有把握點(diǎn)呢?

一、查詢(xún)的邏輯執(zhí)行順序

  (1) FROM left_table

  (3) join_type JOIN right_table (2) ON join_condition

  (4) WHERE where_condition

  (5) GROUP BY group_by_list

  (6) WITH {cube | rollup}

  (7) HAVING having_condition

  (8) SELECT (9) DISTINCT (11) top_specification select_list

  (9) ORDER BY order_by_list

  標(biāo)準(zhǔn)的 SQL 的解析順序?yàn)?

  (1) FROM 子句 組裝來(lái)自不同數(shù)據(jù)源的數(shù)據(jù)

  (2) WHERE 子句 基于指定的條件對(duì)記錄進(jìn)行篩選

  (3) GROUP BY 子句 將數(shù)據(jù)劃分為多個(gè)分組

  (4) 使用聚合函數(shù)進(jìn)行計(jì)算

  (5) 使用HAVING子句篩選分組

  (6) 計(jì)算所有的表達(dá)式

  (7) 使用ORDER BY對(duì)結(jié)果集進(jìn)行排序

二、執(zhí)行順序

  1. FROM:對(duì)FROM子句中前兩個(gè)表執(zhí)行笛卡爾積生成虛擬表vt1

  2. ON: 對(duì)vt1表應(yīng)用ON篩選器只有滿(mǎn)足 join_condition 為真的行才被插入vt2

  3. OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2,生成t3,如果from包含兩個(gè)以上表,則對(duì)上一個(gè)聯(lián)結(jié)生成的結(jié)果表和下一個(gè)表重復(fù)執(zhí)行步驟和步驟直接結(jié)束。

  4. WHERE:對(duì)vt3應(yīng)用 WHERE 篩選器只有使 where_condition 為true的行才被插入vt4

  5. GROUP BY:按GROUP BY子句中的列列表對(duì)vt4中的行分組生成vt5

  6. CUBE|ROLLUP:把超組(supergroups)插入vt6,生成vt6

  7. HAVING:對(duì)vt6應(yīng)用HAVING篩選器只有使 having_condition 為true的組才插入vt7

  8. SELECT:處理select列表產(chǎn)生vt8

  9. DISTINCT:將重復(fù)的行從vt8中去除產(chǎn)生vt9

  10. ORDER BY:將vt9的行按order by子句中的列列表排序生成一個(gè)游標(biāo)vc10

  11. TOP:從vc10的開(kāi)始處選擇指定數(shù)量或比例的行生成vt11 并返回調(diào)用者

  看到這里,那么用過(guò)Linq to SQL的語(yǔ)法有點(diǎn)相似啊?如果我們我們了解了SQL Server執(zhí)行順序,那么我們就接下來(lái)進(jìn)一步養(yǎng)成日常SQL的好習(xí)慣,也就是在實(shí)現(xiàn)功能的同時(shí)有考慮性能的思想,數(shù)據(jù)庫(kù)是能進(jìn)行集合運(yùn)算的工具,我們應(yīng)該盡量的利用這個(gè)工具,所謂集合運(yùn)算實(shí)際就是批量運(yùn)算,就是盡量減少在客戶(hù)端進(jìn)行大數(shù)據(jù)量的循環(huán)操作,而用SQL語(yǔ)句或者存儲(chǔ)過(guò)程代替。

三、只返回需要的數(shù)據(jù)

  返回?cái)?shù)據(jù)到客戶(hù)端至少需要數(shù)據(jù)庫(kù)提取數(shù)據(jù)、網(wǎng)絡(luò)傳輸數(shù)據(jù)、客戶(hù)端接收數(shù)據(jù)以及客戶(hù)端處理數(shù)據(jù)等環(huán)節(jié),如果返回不需要的數(shù)據(jù),就會(huì)增加服務(wù)器、網(wǎng)絡(luò)和客戶(hù)端的無(wú)效勞動(dòng),其害處是顯而易見(jiàn)的,避免這類(lèi)事件需要注意:

  A、橫向來(lái)看

  (1) 不要寫(xiě)SELECT * 的語(yǔ)句,而是選擇你需要的字段。

  (2) 當(dāng)在SQL語(yǔ)句中連接多個(gè)表時(shí), 請(qǐng)使用表的別名并把別名前綴于每個(gè)Column上。這樣一來(lái),就可以減少解析的時(shí)間并減少那些由Column歧義引起的語(yǔ)法錯(cuò)誤。

  1

  如有表table1(ID,col1)和table2(ID,col2)

  1

  Select A.ID, A.col1, B.col2

  2

  -- Select A.ID, col1, col2 –不要這么寫(xiě),不利于將來(lái)程序擴(kuò)展

  3

  from table1 A inner join table2 B on A.ID=B.ID Where …

  B、縱向來(lái)看

  (1) 合理寫(xiě)WHERE子句,不要寫(xiě)沒(méi)有WHERE的SQL語(yǔ)句。

  (2) SELECT TOP N * -- 沒(méi)有WHERE條件的用此替代。

四、盡量少做重復(fù)的工作

  A、控制同一語(yǔ)句的多次執(zhí)行,特別是一些基礎(chǔ)數(shù)據(jù)的多次執(zhí)行是很多程序員很少注意的。

  B、減少多次的數(shù)據(jù)轉(zhuǎn)換,也許需要數(shù)據(jù)轉(zhuǎn)換是設(shè)計(jì)的問(wèn)題,但是減少次數(shù)是程序員可以做到的。

  C、杜絕不必要的子查詢(xún)和連接表,子查詢(xún)?cè)趫?zhí)行計(jì)劃一般解釋成外連接,多余的連接表帶來(lái)額外的開(kāi)銷(xiāo)。

  D、合并對(duì)同一表同一條件的多次UPDATE,比如

  UPDATE EMPLOYEE SET FNAME='HAIWER'

  WHERE EMP_ID=' VPA30890F'UPDATE EMPLOYEE SET LNAME='YANG'

  WHERE EMP_ID=' VPA30890F'

  這兩個(gè)語(yǔ)句應(yīng)該合并成以下一個(gè)語(yǔ)句

  UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME='YANG'WHERE EMP_ID=' VPA30890F'

  E、UPDATE操作不要拆成DELETE操作+INSERT操作的形式,雖然功能相同,但是性能差別是很大的。

五、注意臨時(shí)表和表變量的用

  在復(fù)雜系統(tǒng)中,臨時(shí)表和表變量很難避免,關(guān)于臨時(shí)表和表變量的用法,需要注意:

  A、如果語(yǔ)句很復(fù)雜,連接太多,可以考慮用臨時(shí)表和表變量分步完成。

  B、如果需要多次用到一個(gè)大表的同一部分?jǐn)?shù)據(jù),考慮用臨時(shí)表和表變量暫存這部分?jǐn)?shù)據(jù)。

  C、如果需要綜合多個(gè)表的數(shù)據(jù),形成一個(gè)結(jié)果,可以考慮用臨時(shí)表和表變量分步匯總這多個(gè)表的數(shù)據(jù)。

  D、其他情況下,應(yīng)該控制臨時(shí)表和表變量的使用。

  E、關(guān)于臨時(shí)表和表變量的選擇,很多說(shuō)法是表變量在內(nèi)存,速度快,應(yīng)該首選表變量,但是在實(shí)際使用中發(fā)現(xiàn):

  (1) 主要考慮需要放在臨時(shí)表的數(shù)據(jù)量,在數(shù)據(jù)量較多的情況下,臨時(shí)表的速度反而更快。

  (2) 執(zhí)行時(shí)間段與預(yù)計(jì)執(zhí)行時(shí)間(多長(zhǎng))

  F、關(guān)于臨時(shí)表產(chǎn)生使用SELECT INTO和CREATE TABLE + INSERT INTO的選擇,一般情況下:

  SELECT INTO會(huì)比CREATE TABLE + INSERT INTO的方法快很多,

  但是SELECT INTO會(huì)鎖定TEMPDB的系統(tǒng)表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用戶(hù)并發(fā)環(huán)境下,容易阻塞其他進(jìn)程。

  所以我的建議是,在并發(fā)系統(tǒng)中,盡量使用CREATE TABLE + INSERT INTO,而大數(shù)據(jù)量的單個(gè)語(yǔ)句使用中,使用SELECT INTO。

六、子查詢(xún)的用法

  子查詢(xún)是一個(gè) SELECT 查詢(xún),它嵌套在 SELECT、INSERT、UPDATE、DELETE 語(yǔ)句或其它子查詢(xún)中。

  任何允許使用表達(dá)式的地方都可以使用子查詢(xún),子查詢(xún)可以使我們的編程靈活多樣,可以用來(lái)實(shí)現(xiàn)一些特殊的功能。但是在性能上,往往一個(gè)不合適的子查詢(xún)用法會(huì)形成一個(gè)性能瓶頸。如果子查詢(xún)的條件中使用了其外層的表的字段,這種子查詢(xún)就叫作相關(guān)子查詢(xún)。

  相關(guān)子查詢(xún)可以用IN、NOT IN、EXISTS、NOT EXISTS引入。 關(guān)于相關(guān)子查詢(xún),應(yīng)該注意:

  (1) NOT IN、NOT EXISTS的相關(guān)子查詢(xún)可以改用LEFT JOIN代替寫(xiě)法。比如:

  SELECT PUB_NAME FROM PUBLISHERS WHERE PUB_ID NOTIN (SELECT PUB_ID FROM TITLES WHERE TYPE ='BUSINESS')

  可以改寫(xiě)成:

  SELECT A.PUB_NAME FROM PUBLISHERS A LEFTJOIN TITLES B ON B.TYPE ='BUSINESS'AND A.PUB_ID=B. PUB_ID WHERE B.PUB_ID IS NULL

  比如NOT EXISTS:

  SELECT TITLE FROM TITLES

  WHERE NOT EXISTS

  (SELECT TITLE_ID FROM SALES WHERE TITLE_ID = TITLES.TITLE_ID)

  1

  可以改寫(xiě)成:

  SELECT TITLE

  FROM TITLES LEFTJOIN SALES

  ON SALES.TITLE_ID = TITLES.TITLE_ID

  WHERE SALES.TITLE_ID ISNULL

  2)如果保證子查詢(xún)沒(méi)有重復(fù) ,IN、EXISTS的相關(guān)子查詢(xún)可以用INNER JOIN 代替。比如:

  SELECT PUB_NAME

  FROM PUBLISHERS

  WHERE PUB_ID IN

  (SELECT PUB_ID

  FROM TITLES

  WHERE TYPE ='BUSINESS')

  1

  可以改寫(xiě)成:

  SELECT A.PUB_NAME --SELECT DISTINCT A.PUB_NAME

  FROM PUBLISHERS A INNERJOIN TITLES B

  ON B.TYPE ='BUSINESS'AND

  A.PUB_ID=B. PUB_ID

  (3) IN的相關(guān)子查詢(xún)用EXISTS代替,比如:

  SELECT PUB_NAME FROM PUBLISHERS

  WHERE PUB_ID IN

  (SELECT PUB_ID FROM TITLES WHERE TYPE ='BUSINESS')

  可以用下面語(yǔ)句代替:

  SELECT PUB_NAME FROM PUBLISHERS WHERE EXISTS

  (SELECT1FROM TITLES WHERE TYPE ='BUSINESS'AND

  PUB_ID= PUBLISHERS.PUB_ID)

  4) 不要用COUNT(*)的子查詢(xún)判斷是否存在記錄,最好用LEFT JOIN或者EXISTS,比如有人寫(xiě)這樣的語(yǔ)句:

  SELECT JOB_DESC FROM JOBS

  WHERE (SELECTCOUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)=0

  應(yīng)該改成:

  SELECT JOBS.JOB_DESC FROM JOBS LEFTJOIN EMPLOYEE

  ON EMPLOYEE.JOB_ID=JOBS.JOB_ID

  WHERE EMPLOYEE.EMP_ID ISNULL

  SELECT JOB_DESC FROM JOBS

  WHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)0

  應(yīng)該改成:

  SELECT JOB_DESC FROM JOBS

  WHEREEXISTS (SELECT 1 FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)

七:盡量使用索引

  建立索引后,并不是每個(gè)查詢(xún)都會(huì)使用索引,在使用索引的情況下,索引的使用效率也會(huì)有很大的差別。只要我們?cè)诓樵?xún)語(yǔ)句中沒(méi)有強(qiáng)制指定索引,索引的選擇和使用方法是SQLSERVER的優(yōu)化器自動(dòng)作的選擇,而它選擇的根據(jù)是查詢(xún)語(yǔ)句的條件以及相關(guān)表的統(tǒng)計(jì)信息,這就要求我們?cè)趯?xiě)SQL語(yǔ)句的時(shí)候盡量使得優(yōu)化器可以使用索引。為了使得優(yōu)化器能高效使用索引,寫(xiě)語(yǔ)句的時(shí)候應(yīng)該注意:

  (1)不要對(duì)索引字段進(jìn)行運(yùn)算,而要想辦法做變換,比如:

  SELECT ID FROM T WHERE NUM/2=100

  應(yīng)改為:

  SELECT ID FROM T WHERE NUM=100*2

  SELECT ID FROM T WHERE NUM/2=NUM1

  如果NUM有索引應(yīng)改為:

  SELECT ID FROM T WHERE NUM=NUM1*2

  如果NUM1有索引則不應(yīng)該改。

  (2)發(fā)現(xiàn)過(guò)這樣的語(yǔ)句:

  SELECT 年,月,金額 FROM 結(jié)余表 WHERE100*年+月=2010*100+10

  1

  應(yīng)該改為:

  SELECT 年,月,金額 FROM 結(jié)余表 WHERE 年=2010 AND 月=10

  (3)不要對(duì)索引字段進(jìn)行格式轉(zhuǎn)換

  日期字段的例子:

  WHERECONVERT(VARCHAR(10), 日期字段,120)='2010-07-15'

  應(yīng)該改為

  WHERE日期字段〉='2010-07-15'AND 日期字段'2010-07-16'

  ISNULL轉(zhuǎn)換的例子:

  WHEREISNULL(字段,'')''應(yīng)改為:WHERE字段''

  WHEREISNULL(字段,'')=''不應(yīng)修改

  WHEREISNULL(字段,'F') ='T'應(yīng)改為: WHERE字段='T'

  WHEREISNULL(字段,'F')'T'不應(yīng)修改

  (4) 不要對(duì)索引字段進(jìn)行格式轉(zhuǎn)換

  WHERELEFT(NAME, 3)='ABC' 或者WHERE SUBSTRING(NAME,1, 3)='ABC'

  應(yīng)改為: WHERE NAME LIKE'ABC%'

  日期查詢(xún)的例子:

  WHEREDATEDIFF(DAY, 日期,'2010-06-30')=0

  應(yīng)改為:WHERE 日期='2010-06-30' AND 日期 '2010-07-01'

  WHEREDATEDIFF(DAY, 日期,'2010-06-30')0

  應(yīng)改為:WHERE 日期 '2010-06-30'

  WHEREDATEDIFF(DAY, 日期,'2010-06-30')=0

  應(yīng)改為:WHERE 日期 '2010-07-01'

  WHEREDATEDIFF(DAY, 日期,'2010-06-30')0

  應(yīng)改為:WHERE 日期='2010-07-01'

  WHEREDATEDIFF(DAY, 日期,'2010-06-30')=0

  應(yīng)改為:WHERE 日期='2010-06-30'

  (5)不要對(duì)索引字段使用函數(shù)

  WHERE LEFT(NAME, 3)='ABC' 或者WHERE SUBSTRING(NAME,1, 3)='ABC'

  應(yīng)改為: WHERE NAME LIKE 'ABC%'

  日期查詢(xún)的例子:

  WHEREDATEDIFF(DAY, 日期,'2010-06-30')=0

  應(yīng)改為:WHERE 日期='2010-06-30'AND 日期 '2010-07-01'

  WHEREDATEDIFF(DAY, 日期,'2010-06-30')0

  應(yīng)改為:WHERE 日期 '2010-06-30'

  WHEREDATEDIFF(DAY, 日期,'2010-06-30')=0

  應(yīng)改為:WHERE 日期 '2010-07-01'

  WHEREDATEDIFF(DAY, 日期,'2010-06-30')0

  應(yīng)改為:WHERE 日期='2010-07-01'

  WHEREDATEDIFF(DAY, 日期,'2010-06-30')=0

  應(yīng)改為:WHERE 日期='2010-06-30'

  (6)不要對(duì)索引字段進(jìn)行多字段連接

  比如:

  WHERE FAME+'. '+LNAME='HAIWEI.YANG'

  應(yīng)改為:

  WHERE FNAME='HAIWEI' AND LNAME='YANG'

八:多表連接的連接條件對(duì)索引的選擇有著重要的意義,所以我們?cè)趯?xiě)連接條件條件的時(shí)候需要特別注意。

  A、多表連接的時(shí)候,連接條件必須寫(xiě)全,寧可重復(fù),不要缺漏。

  B、連接條件盡量使用聚集索引

  C、注意ON、WHERE和HAVING部分條件的區(qū)別

  ON是最先執(zhí)行, WHERE次之,HAVING最后,因?yàn)镺N是先把不符合條件的記錄過(guò)濾后才進(jìn)行統(tǒng)計(jì),它就可以減少中間運(yùn)算要處理的數(shù)據(jù),按理說(shuō)應(yīng)該速度是最快的,WHERE也應(yīng)該比HAVING快點(diǎn)的,因?yàn)樗^(guò)濾數(shù)據(jù)后才進(jìn)行SUM,在兩個(gè)表聯(lián)接時(shí)才用ON的,所以在一個(gè)表的時(shí)候,就剩下WHERE跟HAVING比較了。

  1

  考慮聯(lián)接優(yōu)先順序:

  2

  (1) INNER JOIN

  3

  (2) LEFT JOIN (注:RIGHT JOIN 用 LEFT JOIN 替代)

  4

  (3) CROSS JOIN

  其它注意和了解的地方有:

  A、在IN后面值的列表中,將出現(xiàn)最頻繁的值放在最前面,出現(xiàn)得最少的放在最后面,減少判斷的次數(shù)。

  B、注意UNION和UNION ALL的區(qū)別。-- 允許重復(fù)數(shù)據(jù)用UNION ALL好

  C、注意使用DISTINCT,在沒(méi)有必要時(shí)不要用。

  D、TRUNCATE TABLE 與 DELETE 區(qū)別。

  E、減少訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的次數(shù)。

  還有就是我們寫(xiě)存儲(chǔ)過(guò)程,如果比較長(zhǎng)的話(huà),最后用標(biāo)記符標(biāo)開(kāi),因?yàn)檫@樣可讀性很好,即使語(yǔ)句寫(xiě)的不怎么樣,但是語(yǔ)句工整,C# 有region,SQL我比較喜歡用的就是:

  --startof 查詢(xún)?cè)诼毴藬?shù)

  SQL語(yǔ)句

  --end of

  正式機(jī)器上我們一般不能隨便調(diào)試程序,但是很多時(shí)候程序在我們本機(jī)上沒(méi)問(wèn)題,但是進(jìn)正式系統(tǒng)就有問(wèn)題,但是我們又不能隨便在正式機(jī)器上操作,那么怎么辦呢?我們可以用回滾來(lái)調(diào)試我們的存儲(chǔ)過(guò)程或者是SQL語(yǔ)句,從而排錯(cuò)。

  BEGINTRAN

  UPDATE a SET 字段=''

  ROLLBACK

  作業(yè)存儲(chǔ)過(guò)程我一般會(huì)加上下面這段,這樣檢查錯(cuò)誤可以放在存儲(chǔ)過(guò)程,如果執(zhí)行錯(cuò)誤回滾操作,但是如果程序里面已經(jīng)有了事務(wù)回滾,那么存儲(chǔ)過(guò)程就不要寫(xiě)事務(wù)了,這樣會(huì)導(dǎo)致事務(wù)回滾嵌套降低執(zhí)行效率,但是我們很多時(shí)候可以把檢查放在存儲(chǔ)過(guò)程里,這樣有利于我們解讀這個(gè)存儲(chǔ)過(guò)程,和排錯(cuò)。

  BEGINTRANSACTION

--事務(wù)回滾開(kāi)始

  --檢查報(bào)錯(cuò)

  IF ( @@ERROR0 )

  BEGIN

--回滾操作

  ROLLBACKTRANSACTION

  RAISERROR('刪除工作報(bào)告錯(cuò)誤', 16, 3)

  RETURN

  END

--結(jié)束事務(wù)

  COMMITTRANSACTION

來(lái)源: http://www.cnblogs.com/xiaofengfeng/archive/2011/10/14/2211239.html#2256833

SQL養(yǎng)成一個(gè)好習(xí)慣是一筆財(cái)富


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲久久在线观看 | 天天干天天干天天干天天 | 一区二区精品久久 | 亚洲欧美日韩在线一区二区三区 | 最新男同志freevideos | 精品毛片视频 | 国产免费成人在线视频 | 在线国产福利 | 九九精彩视频在线观看视频 | 一级毛片老太婆交性欧美 | 久久综合99re88久久爱 | 中文字幕视频一区 | 国产99青草全福视在线 | 久久天天躁日日躁狠狠躁 | 99热久久国产精品这里 | 亚洲精品成人网久久久久久 | www.夜夜操 | 奇米网久久 | 亚洲综合色播 | 欧美韩国日本在线 | 亚洲天天做夜夜做天天欢 | 久久精品视频网 | 久久久99精品久久久久久 | 久热中文字幕在线精品免费 | 福利在线看片 | 九九99靖品| 四虎国产成人永久精品免费 | 成人在线第一页 | 国内自拍一二三四2021 | 国产精品亚洲欧美 | 97视频久久 | 四虎免费看 | 亚洲国产精品欧美综合 | 国产精品免费精品自在线观看 | 免费人成黄页网站在线观看 | 黄色影院视频 | 日本aa在线观看 | 日韩欧美国产亚洲 | 欧美成人性做爰网站免费 | 色噜噜狠狠色综合久 | 真实国产乱子伦精品免费 |