sql的 几种join 用法,和区别

(1)连接
select * from table1,table2
等价于
select * from table1 cross join table2

eg:mysql数据库

 CREATE TABLE Articles (
   ArticleID SMALLINT NOT NULL PRIMARY KEY,
   ArticleTitle VARCHAR(60NOT NULL,
   Copyright YEAR NOT NULL
)
ENGINE=INNODB;


INSERT INTO Articles VALUES (12786'How write a paper', 1934),
                            (13331'Publish a paper', 1919),
                            (14356'Sell a paper', 1966),
                            (15729'Buy a paper', 1932),
                            (16284'Conferences', 1996),
                            (17695'Journal', 1980),
                            (19264'Information', 1992),
                            (19354'AI', 1993);


CREATE TABLE Authors (
   AuthID SMALLINT NOT NULL PRIMARY KEY,
   AuthorFirstName VARCHAR(20),
   AuthorMiddleName VARCHAR(20),
   AuthorLastName VARCHAR(20)
)
ENGINE=INNODB;


INSERT INTO Authors VALUES (1006'Henry', 'S.', 'Thompson'),
                           (1007'Jason', 'Carol', 'Oak'),
                           (1008'James', NULL, 'Elk'),
                           (1009'Tom', 'M''Ride'),
                           (1010'Jack', 'K''Ken'),
                           (1011'Mary', 'G.', 'Lee'),
                           (1012'Annie', NULL, 'Peng'),
                           (1013'Alan', NULL, 'Wang'),
                           (1014'Nelson', NULL, 'Yin');


CREATE TABLE AuthorArticle (
   AuthID SMALLINT NOT NULL,
   ArticleID SMALLINT NOT NULL,
   PRIMARY KEY (AuthID, ArticleID),
   FOREIGN KEY (AuthIDREFERENCES Authors (AuthID),
   FOREIGN KEY (ArticleIDREFERENCES Articles (ArticleID)
)
ENGINE=INNODB;


INSERT INTO AuthorArticle VALUES (100614356)
                              (100815729)
                              (100912786)
                              (101017695),
                              (101115729)
                              (101219264)
                              (101219354)
                              (101416284);
SELECT ArticleTitle, AuthID FROM Articles CROSS JOIN AuthorArticle;  //CROSS JOIN 跟JOIN结果集一样

这句相当于SELECT ArticleTitle, AuthID FROM Articles  AuthorArticle;


(2)自连接

    SELECT p1.authid ,p1.articleid ,p2.authid,p2.articleid
      from AuthorArticle as p1 ,AuthorArticle as p2
      where p1.authid = p2.authid and p1.articleid ='19264' and p2.articleid = '19354';

--------+-----------+--------+
 authid | articleid | authid |articleid
--------+-----------+--------+
   1012 |     19264 |   1012 | 19354
--------+-----------+--------+
 row in set (0.00 sec)


(3) 内连接

select p1.authorfirstname, p1.AuthorMiddleName ,p1.AuthorLastName, p2.articleid
    from authors as p1
    inner join authorarticle as p2 on p1.authid = p2.authid;

inner join '表名' on 条件 --连接多个表
它等价于: select p1.authorfirstname, p1.AuthorMiddleName ,p1.AuthorLastName, p2.articleid
    from authors as p1 , authorarticle as p2
    where p1.authid = p2.authid;


(4)外连接:(outer join)
允许限制一张表中的行,而不限制另外一张表中的行。
注意:外连接不一定非要有外键约束
1: left outer join --不能用left out join
左表中的记录全部会出现在结果集中,匹配不上的显示NULL

mysql> SELECT ArticleTitle, Copyright, AuthID
    -> FROM Articles AS b LEFT JOIN AuthorArticle AS ab
    ->    ON b.ArticleID=ab.ArticleID
    -> ORDER BY ArticleTitle;
+-------------------+-----------+--------+
| ArticleTitle      | Copyright | AuthID |
+-------------------+-----------+--------+
| AI                |      1993 |   1012 |
| Buy a paper       |      1932 |   1008 |
| Buy a paper       |      1932 |   1011 |
| Conferences       |      1996 |   1014 |
| How write a paper |      1934 |   1009 |
| Information       |      1992 |   1012 |
| Journal           |      1980 |   1010 |
| Publish a paper   |      1919 |   NULL |  //显示b表和ab表里ID相同的记录,但还显示b里有但ab里没有的记录 right join则相反| Sell a paper      |      1966 |   1006 |
+-------------------+-----------+--------+
2: right outer join
右表中的记录全部会出现在结果集中,匹配不上的显示NULL

mysql> SELECT ArticleTitle, Copyright, CONCAT_WS(' ', AuthorFirstName, AuthorMiddleName, AuthorLastName) AS Author
    -> FROM Articles AS b RIGHT JOIN AuthorArticle AS ab ON b.ArticleID=ab.ArticleID
    ->    RIGHT JOIN Authors AS a ON ab.AuthID=a.AuthID
    -> ORDER BY ArticleTitle;
+-------------------+-----------+-------------------+
| ArticleTitle      | Copyright | Author            |
+-------------------+-----------+-------------------+
| NULL              |      NULL | Alan Wang         |
| NULL              |      NULL | Jason Carol Oak   |
| AI                |      1993 | Annie Peng        |
| Buy a paper       |      1932 | James Elk         |
| Buy a paper       |      1932 | Mary G. Lee       |
| Conferences       |      1996 | Nelson Yin        |
| How write a paper |      1934 | Tom M Ride        |
| Information       |      1992 | Annie Peng        |
| Journal           |      1980 | Jack K Ken        |
| Sell a paper      |      1966 | Henry S. Thompson |
+-------------------+-----------+-------------------+

3: full outer join|full join --不能用full out join
返回两个表中的匹配和不匹配的所有记录。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server 是一种常用的关系型数据库管理系统,为了提高其性能和效率,可以采取以下几种优化方法: 1. 索引优化:在关键字段上创建索引可以大大加快查询速度。可以根据查询的频率和表的大小来选择合适的索引类型,如聚集索引、非聚集索引、唯一索引等。同时,确保索引的统计信息是最新的,以便优化查询计划。 2. 查询优化:优化查询语句可以提高查询的效率。在写查询语句时,尽量使用简洁的语法和合适的查询条件,避免不必要的关联和排序操作。使用JOIN替代子查询、使用WHERE子句代替HAVING子句等方法可以减少查询的复杂性。 3. 数据库设计优化:合理的数据库设计可以提高数据库的性能。使用适当的数据类型、预定义默认值和规范化的数据模型可以减少数据冗余和提升数据访问速度。同时,合理地划分表和分区也可以加快查询速度。 4. 硬件优化:通过增加内存、提升磁盘性能、优化网络配置等硬件方面的优化可以改善SQL Server的性能。例如,使用RAID技术提高磁盘读写速度,增加缓存大小以减少磁盘IO等。 5. 服务器配置优化:合理的SQL Server配置也可以提高性能。例如,调整最大内存使用量以平衡内存和磁盘IO的使用,配置适当的并发连接数以避免服务器负载过高,设置合理的日志文件和数据库文件的大小以避免磁盘空间不足等。 总之,SQL Server的优化方法包括索引优化、查询优化、数据库设计优化、硬件优化以及服务器配置优化。通过综合运用这些方法,可以提高SQL Server的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值