最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL之Join的使用詳解

 更新時(shí)間:2020年09月19日 19:46:24   作者:jim_shen  
關(guān)于sql語句中的連接(join)關(guān)鍵字,是較為常用而又不太容易理解的關(guān)鍵字,下面就為大家介紹一下相關(guān)資料,需要的朋友可以參考下

一.基本概念

關(guān)于sql語句中的連接(join)關(guān)鍵字,是較為常用而又不太容易理解的關(guān)鍵字,下面這個(gè)例子給出了一個(gè)簡(jiǎn)單的解釋 –建表user1,user2:

table1 : create table user2(id int, user_name varchar(10), over varchar(10));
insert into user1 values(1, ‘tangseng', ‘dtgdf');
insert into user1 values(2, ‘sunwukong', ‘dzsf');
insert into user1 values(1, ‘zhubajie', ‘jtsz');
insert into user1 values(1, ‘shaseng', ‘jslh');
table2 : create table user2(id int, user_name varchar(10), over varchar(10));
insert into user2 values(1, ‘sunwukong', ‘chengfo');
insert into user2 values(2, ‘niumowang', ‘chengyao');
insert into user2 values(3, ‘jiaomowang', ‘chengyao');
insert into user2 values(4, ‘pengmowang', ‘chengyao');

SQL標(biāo)準(zhǔn)中Join的類型

1. 內(nèi)連接(inner join或join)

(1).概念:內(nèi)聯(lián)接是基于連接謂詞將兩張表的列結(jié)合在一起,產(chǎn)生新的結(jié)果表

(2).內(nèi)連接維恩圖:

(3).sql語句

select a.id, a.user_name, b.over from user1 a inner join user2 b on a.user_name=b.user_name;

結(jié)果:

2. 外連接

外連接包括左向外聯(lián)接、右向外聯(lián)接或完整外部聯(lián)接

a.左外連接:left join 或 left outer join
(1)概念:左向外聯(lián)接的結(jié)果集包括 LEFT OUTER 子句中指定的左表的所有行,而不僅僅是聯(lián)接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關(guān)聯(lián)的結(jié)果集行中右表的所有選擇列表列均為空值(null)。

(2)左外連接維恩圖:

(3)sql語句:

select a.id, a.user_name, b.over from user1 a left join user2 b on a.user_name=b.user_name;

結(jié)果:

b.右外連接:right join 或 right outer join
(1)右向外聯(lián)接是左向外聯(lián)接的反向聯(lián)接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
(2)右外連接維恩圖:

(3)sql語句

select b.user_name, b.over, a.over from user1 a right join user2 b on a.user_name=b.user_name;

結(jié)果:

c.全外連接:full join 或 full outer join

(1)完整外部聯(lián)接返回左表和右表中的所有行。當(dāng)某行在另一個(gè)表中沒有匹配行時(shí),則另一個(gè)表的選擇列表列包含空值。如果表之間有匹配行,則整個(gè)結(jié)果集行包含基表的數(shù)據(jù)值。
(2)右外連接維恩圖:

(3)sql語句

select a.id, a.user_name, b.over from user1 a full join user2 b on a.user_name=b.user_name

在mysql中查詢?nèi)B接會(huì)報(bào)1064的錯(cuò)誤,mysql不支持全連接查詢,代替語句:

select a.user_name,a.over,b.over from user1 a left join user2 b on a.user_name = b.user_name union all select b.user_name,b.over ,a.over from user1 a right join user2 b on a.user_name = b.user_name;

結(jié)果:

3. 笛卡爾連接(交叉連接)

1.概念:沒有 WHERE 子句的交叉聯(lián)接將產(chǎn)生聯(lián)接所涉及的表的笛卡爾積。第一個(gè)表的行數(shù)乘以第二個(gè)表的行數(shù)等于笛卡爾積結(jié)果集的大小。(user1和user2交叉連接產(chǎn)生4*4=16條記錄)
2.交叉連接:cross join (不帶條件on)
3.sql語句:
select a.user_name,b.user_name, a.over, b.over from user1 a cross join user2 b;

二.使用技巧

1. 使用join更新表
我們使用下面語句將user1表中同時(shí)存在user1表和user2表中記錄的over字段更新為 ‘qtda'。

update user1 set over='qtds'where user1.user_name in (select b.user_name from user1 a inner join user2 b on a.user_name = b.user_name);

這條語句在sql server, oracle中都可以正確執(zhí)行,在mysql卻報(bào)錯(cuò),mysql不支持更新子查詢的表,那么我們使用下面語句可以在做到。

update user1 a join (select b.user_name from user1 a join user2 b on a.user_name = b.user_name) b on a.user_name = b.user_name set a.over = ‘qtds'

2. 使用join優(yōu)化子查詢

子查詢效率比較低效,使用下面語句進(jìn)行查詢
select a.user_name, a.over,(select over from user2 b where a.user_name=b.user_name) as over2 from user1 a;
使用join優(yōu)化子查詢,可以實(shí)現(xiàn)同樣的效果
select a.user_name, a.over, b.over as over2 from user1 a left join user2
b on a.user_name = b.user_name;

3. 使用join優(yōu)化聚合子查詢

引入一張新表:user_kills
create table user_kills(user_id int, timestr varchar(20), kills int(10));
insert into user_kills values(2, ‘2015-5-12', 20);
insert into user_kills values(2, ‘2015-5-15', 18);
insert into user_kills values(3, ‘2015-5-11', 16);
insert into user_kills values(3, ‘2015-5-14', 13);
insert into user_kills values(3, ‘2015-5-16', 17);
insert into user_kills values(4, ‘2015-5-12', 16);
insert into user_kills values(4, ‘2015-5-10', 13);

查詢user1中每人對(duì)應(yīng)user_kills表中kills最大的日期,使用聚合子查詢語句:

select a.user_name,b.timestr, b.kills from user1 a join user_kills b on a
.id = b.user_id where b.kills = (select MAX(c.kills) from user_kills c where c.user_id = b.user_id);

使用join優(yōu)化聚合子查詢(避免子查詢)

select a.user_name, b.timestr, b.kills from user1 a join user_kills b on
a.id = b.user_id join user_kills c on c.user_id = b.user_id group by a.user_name, b.timestr, b.kills having b.kills = max(c.kills);

結(jié)果:

4. 實(shí)現(xiàn)分組選擇數(shù)據(jù)

要求查詢出user1中每個(gè)人kills對(duì)多的前兩天。
首先,我們可以通過下面語句查詢出某個(gè)人kills最多的兩天;

select a.user_name, b.timestr, b.kills from user1 a join user_kills b on
a.id = b.user_id where a.user_name ='sunwukong' order by b.kills desc limit 2;

那么如何通過一個(gè)語句查詢出所有人kills最多的兩天的呢?看下面的語句:

WITH tmp AS (select a.user_name, b.timestr, b.kills, ROW_NUMBER() over(partition by a.user_name order by b.kills) cnt from user1 a join user_kills b on a.id = b.user_id) select * from tmp where cnt <= 2;

上面的語句在sql server和oracle都是支持的,但是mysql不支持分組排序函數(shù)ROW_NUMBER(),下面提供一種替代方法:

select d.user_name,c.timestr, kills from (select user_id, timestr, kills, (select count(*) from user_kills b where b.user_id = a.user_id and a.kills <= b.kills) as cnt from user_kills a group by user_id, timestr, kills) c join user1 d on c.user_id = d.id where cnt <= 2;

結(jié)果:

到此這篇關(guān)于SQL之Join的使用詳解的文章就介紹到這了,更多相關(guān)SQL之Join內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解SQLite中的數(shù)據(jù)類型

    詳解SQLite中的數(shù)據(jù)類型

    這篇文章主要介紹了詳解SQLite中的數(shù)據(jù)類型,針對(duì)版本為SQLite3,講解非常詳細(xì),超推薦!需要的朋友可以參考下
    2015-07-07
  • mssql 區(qū)分大小寫的詳細(xì)說明

    mssql 區(qū)分大小寫的詳細(xì)說明

    mssql區(qū)分大小寫,沒想到mysql也區(qū)分大小寫。相關(guān)的文章稍后奉獻(xiàn)給大家
    2008-03-03
  • SQLite與MySQL區(qū)別及優(yōu)缺點(diǎn)介紹

    SQLite與MySQL區(qū)別及優(yōu)缺點(diǎn)介紹

    這篇文章介紹了SQLite與MySQL的區(qū)別及優(yōu)缺點(diǎn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • DataGrip 連接 HiveServer2 報(bào)錯(cuò)的問題

    DataGrip 連接 HiveServer2 報(bào)錯(cuò)的問題

    這篇文章主要介紹了DataGrip 連接 HiveServer2 報(bào)錯(cuò)的問題,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • DBeaver數(shù)據(jù)庫轉(zhuǎn)儲(chǔ)、備份、遷移圖文教程

    DBeaver數(shù)據(jù)庫轉(zhuǎn)儲(chǔ)、備份、遷移圖文教程

    DBeaver是一款強(qiáng)大的開源數(shù)據(jù)庫管理工具,適用于多種數(shù)據(jù)庫系統(tǒng),包括但不限于MySQL、PostgreSQL、Oracle、SQL Server等,下面這篇文章主要給大家介紹了關(guān)于DBeaver數(shù)據(jù)庫轉(zhuǎn)儲(chǔ)、備份、遷移的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • 數(shù)據(jù)庫設(shè)計(jì)的折衷方法

    數(shù)據(jù)庫設(shè)計(jì)的折衷方法

    這篇文章主要介紹了數(shù)據(jù)庫設(shè)計(jì)的折衷方法,需要的朋友可以參考下
    2007-03-03
  • mssql注入躲避IDS的方法

    mssql注入躲避IDS的方法

    可能這個(gè)技巧早有人已經(jīng)會(huì)了,就是利用openrowset發(fā)送本地命令。通常我們的用法是(包括MSDN的列子)
    2008-06-06
  • 分布式緩存Redis與Memcached的優(yōu)缺點(diǎn)區(qū)別比較

    分布式緩存Redis與Memcached的優(yōu)缺點(diǎn)區(qū)別比較

    Redis和Memcached都是基于內(nèi)存key-value的數(shù)據(jù)存儲(chǔ)系統(tǒng)。兩者都可以通過緩存數(shù)據(jù)結(jié)果,HTML片段或其他可能產(chǎn)生成本很高的內(nèi)容來幫助加快應(yīng)用程序的速度。與memcached相比,Redis功能更強(qiáng)大,更受歡迎并且得到更好的支持。
    2022-12-12
  • ACCESS轉(zhuǎn)SQLSERVER數(shù)據(jù)庫的注意事項(xiàng)

    ACCESS轉(zhuǎn)SQLSERVER數(shù)據(jù)庫的注意事項(xiàng)

    Access承重量太低,當(dāng)你考慮升級(jí)到SQL Server時(shí),并不只是個(gè)連接字符串需要改變,需要改變的還有很多
    2007-01-01
  • Navicat premium連接數(shù)據(jù)庫出現(xiàn):2003 Can''t connect to MySQL server on''localhost''(10061)

    Navicat premium連接數(shù)據(jù)庫出現(xiàn):2003 Can''t connect to MySQL server o

    這篇文章主要介紹了Navicat premium連接數(shù)據(jù)庫出現(xiàn):2003 - Can't connect to MySQL server on 'localhost' (10061 "Unknown error")的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論

左贡县| 江门市| 安康市| 于田县| 湖南省| 抚松县| 贡嘎县| 波密县| 土默特右旗| 平定县| 菏泽市| 冷水江市| 类乌齐县| 广河县| 耿马| 福海县| 城市| 运城市| 灵璧县| 梅河口市| 久治县| 余江县| 罗定市| 周至县| 辽源市| 建平县| 成武县| 林口县| 大厂| 柳江县| 聊城市| 安徽省| 霍林郭勒市| 新邵县| 巴彦县| 略阳县| 贞丰县| 日土县| 衡阳县| 邮箱| 大田县|