mysql 连接语句

当 SELECT 语句被,如果 FROM 子句引用了大多单表源或视图,可以使 JOIN
指示指定的属操作应于指定的表源或视图之间实行。

 

一致、交叉联接:CROSS JOIN

  交叉联接将执行一个叉积(迪卡尔乘积),将一个申明的各国一行同外一个表底有着执行开展匹配,生成一个虚拟表。如果一个发明来5行,另一个发明出6实行,结果生成的虚拟表一共收获
5*6=30 行。

(1) ANSI SQL-89 语法

SELECT a.ColumnA, b.ColumnA

FROM Table1 AS a , Table2 AS b

 

(2) ANSI SQL-92 语法(推荐)

SELECT a.ColumnA, b.ColumnA

FROM Table1 AS a

 CROSS JOIN Table2 AS b

 

 

亚、内部联接:[ INNER ] JOIN

  
内部联接用于返回所有匹配的行对。如果不指定其他过渡类型,则默认为中联接。

  内部联接的处理过程包括以下步骤:

a. 首先,像交叉联接一样,生成一个迪卡尔乘积。

b. 然后,再遵照谓词进行筛(放弃两单说明中无匹配的执行)。

c. 最后,返回所有匹配的实施。

 

(1) ANSI SQL-89 语法

SELECT a.ColumnA, b.ColumnA

FROM Table1 AS a , Table2 AS b

WHERE a.IDcol = b.IDcol

 

(2) ANSI SQL-92 语法(推荐)

SELECT a.ColumnA, b.ColumnA

FROM Table1 AS a

 JOIN Table2 AS b

   ON a.IDcol = b.IDcol

 

 

老三、外部联接

  外部联接的处理过程包括以下步骤:

a. 首先,像交叉联接一样,生成一个迪卡尔乘积。

b. 然后,再比如谓词进行筛(放弃两独说明中莫兼容的执行)。

c. 根据 LEFT/RIGHT/FULL 选项“添加外部行”

d. 最后,返回所有匹配的履。

 

  例如,下面是2个表。

Table1:

EmpID FirstName

001  Mark

002  Jim

003  Tom

Table2:

EmpID LastName

002  Smith

005  Johnson

 

1. 左外联接:LEFT [ OUTER ] JOIN

  指定在结果集中包括左表中享有未饱联接条件的推行,除了由于里联接返回所有的行之外,还用另外一个表底输出列设置为
NULL。

SELECT a.EmpID, a.FirstName, b.LastName

FROM Table1 AS a

 LEFT OUTER JOIN Table2 AS b

   ON a.EmpID = b.EmpID

  返回的结果也:

EmpID FirstName LastName

 

001  Mark   (NULL)

002  Jim   Smith

003  Tom   (NULL)

 

2. 右外过渡:RIGHT [OUTER] JOIN

  指定在结果集中包括右表中兼有未饱联接条件的实行,除了由于中间联接返回所有的行之外,还拿与另外一个说明对应之输出列设置也
NULL。

  返回的结果吗:

EmpID FirstName LastName

002  Jim   Smith

005  (NULL)  Johnson

 

3. 全外联接:FULL [ OUTER ] JOIN

  指定在结果集中包括左表或右表中不满足联接条件的行,并以对诺让外一个申明底出口列设为
NULL。这是指向普通由 INNER JOIN 返回的所有行的补充。

  返回的结果为:

EmpID FirstName LastName

001  Mark   (NULL)

002  Jim   Smith

003  Tom   (NULL)

005(NULL)  Johnson

 

四、自联接

1. 语法

  自联接即属同一个申明底多只实例。自联接支持交叉联接、内部联接和外部连接。例如:

SELECT a.ColumnA, b.ColumnB

FROM Table1 AS a

 JOIN Table1 AS b

   ON a.IDcol = b.IDcol

 

2. 示例

  本例首文人化作一个申明,并当表明中存储0到9底平头,然后生成自交叉联接,从而生成1到1000的平头。

(1)构建一个基本表

CREATE TABLE Table1(ColumnA int)

INSERT INTO Table1(ColumnA) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)

 

(2)构建从交叉联接

SELECT T1.ColumnA * 100 + T2.ColumnA * 10 + T3.ColumnA + 1 as MyInt

FROM Table1 AS T1

 CROSS JOIN Table1 AS T2

 CROSS JOIN Table1 AS T3

ORDER BY MyInt

 

 

五、复合联接

  当半独说明有复合关系时,可能得复合联接。例如:

SELECT a.ColumnA, b.ColumnB

FROM Table1 AS a

 JOIN Table2 AS b

   ON a.ColumnA = b.ColumnA

   AND a.ColumnB = b.ColumnB

 

 

六、多更联接

  联接运算仅操作简单个说明,可以经过多单连运算实现多再联接。

SELECT a.ColumnA, b.ColumnB, c.ColumnC

FROM Table1 AS a

 JOIN Table2 AS b

   ON a.ColumnA = b.ColumnA

 JOIN Table3 AS c

   AND a.ColumnB = c.ColumnB

 

 

SQL 基础:Select语句,各种join,union用法

    一、基本的SELECT语句

    1.
“*”的注意事项:在SELECT语句被,用*来选择所有的排列,这是一个应有抵制的惯。

   
虽然节省了输入列名的时刻,但是呢象征获得的数据较真正需要的数量多之差不多。相应的,也会见降应用程序的特性及网络性。

    良好的平整是仅选择所急需。

 

    2. join子句

    join是用来概念如何从多独说明中精选数据并整合成一个结出集。

 
  join必需大凡坐(1)我们所而抱之保有消息并无还在一个表中,或者(2)所要回去的消息还以一个表中,但是其上设置的基准信息可以其它一个表中。

 
  join的共同点大凡透过记录的连接列,把同长达记下同一长长的或者多长条任何记录进行匹配,从而产生有是这些记录之特等的记录。

        2.1 INNER JOIN

    INNER JOIN光回进行交接的字段上配合的记录。INNER
JOIN是当开扫除。

    自援是为了某种原因把一个表联接回其自己。

    INNER JOIN是默认的连结方式。

        2.2 OUTER JOIN

    OUTER JOIN有左右对接的分,而INNER JOIN没有左右过渡的分。

    RIGHT(LEFT) OUTER
JOIN是既然如此想只要含有右侧表中的保有执行,以及左手表中出配合记录的推行

        2.3 FULL JOIN

    FULL JOIN联接,就是要含在联接两侧的表中所有的执行

        2.4 CROSS JOIN

    CROSS
JOIN没有ON联接符,并且将join一侧表中的各个一样长达记下与外一侧的表中所有的笔录联接起来。即联接表中的笛卡尔积

    CROSS JOIN可用以供样本数量及是数据

 

    3. WHERE子句

    一些常用且不顶熟悉的操作符:

    BETWEEN: <列> BETWEEN num1 AND num2

    LIKE: LIKE “ANY%”
%代表0个或基本上单随机字符。_表示单个任意字符。[]意味着括号中含的人身自由单个字符。^排除下一个。

    EXISTS: EXISTS 查询语句。

 

    4. ORDER BY

   
卿了解吗?查询的归结果通常是坐字母或数字顺序方式被起,这是偶然的。

   
以何种措施吃出,在尚未点名的场面下,通常在SQLServer认为哪一样栽汇集数据的计出最小。因此,返回的结果通常是依据表中数的大体顺序或者SQLServer用来找寻数据所动的某某索引。

    默认是升序ASC,降序是DESC。

    如果对一一来求,建议以SQL语句被显式标明。

    ORDER BY
子句可以根据查询中应用的其余表中的其余字段来展开排序,无论该列是否带有在SELECT列表中。

 

    5. 行使GROUP BY 子句子聚集数据

    一旦在查询语句被应用了GROUP BY,SELECT列表中之各一样列要么包含在GROUP
BY列表中,要无含在聚集中。

    当聚集不与GROUP
BY一起用时,聚集只能和另外聚集并在SELECT列表中,而休克和列名搭配出现在SELECT列表中。

    除了COUNT(*) 之外,任何聚众函数都见面忽视NULL值。

 

    6. HAVING子句

    在 SQL 中加进 HAVING 子句原因是,WHERE
关键字无法与协商函数一起利用。

    仅当查询语句被发生GROUP BY子句时以HAVING子句。

    WHERE子句以到形成组的诸一行上,HAVING子句应用到组的集聚上。

    7. DISTINCT子句

    DISTINCT消除再数据。如果值是同样之,则该值出现一样不成。

    DISTINCT出现在列表的始处于,或者出现在COUNT中。

    二、基本的INSERT语句

    1. 中心构造

    INSERT [INTO] table_name [table_column_list] VALUES
(data_value_list)

    INTO是可简简单单的

   
table_column_list建议还显式给来,一凡增进可读性,二是后来就是是发明底构造产生变动,也无见面具有影响。

    2. INSERT INTO … SELECT语句

    批量插数据。

    INSERT [INTO] <表名> [<列表名>] <SELECT 语句>

 

    三、UPDATE语句更改现有数据

    UPDATE<表名>

    SET <列> = <值> [, <列> = <值>]

    [FROM <一个或者基本上独表>]

    [WHERE <约束原则>]

    UPDATE 可以由一个表中生成数据,但是单影响一个申明。

 

    四、DELETE语句

    DELETE

    [FROM] <表名>

    [FROM] <表的列表/JOIN联接>

    WHERE <搜索条件>

    有关DELETE的一个微例子:

    films表                                                          
actors表

    filmId   |   filmname   |   yearmade                    filmId   |  
firstname   |   lastname

    1               ‘host’           1984                            1  
             ‘li’               ‘si’

    2               ‘shit’            1999                            2
              ‘wang’          ‘wu’

                                                                       
   3               ‘liu’               ‘li’

    从actors表中去除在films表中莫匹配的执行:

    DELETE FROM actors

    FROM actors a

    LEFT JOIN films f on a.filmId = f.filmId

    WHERE f.filmname is null;

    MySQL 语法:delete a.* from actors a left join films f  on
a.yearmade = f.yearmade where f. yearmade is null

    MySQL不支持双FROM

 

    五、UNION

    UNION可以为有限个或重新多单查询有单个结果集。

    JOIN水平的汇合数据,而UNION垂直的联合数据。

    UNION的几只中心:

    1. 如果拓展UNION的SELECT 列表中列的数量是同样的。

    2. 联合之结果集返回的标头仅取得第一个查询。

    3. 数据类型必须一致或者隐式兼容。

    4. 返回默认是DISTINCT而非ALL。

网站地图xml地图