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。
mysql 连接语句的更多相关文章
- MySQL连接查询(inner join,left join和right join的区别)
关系数据库由多个相关表组成,这些表使用已知为外键列的常用列链接在一起. 因此,从业务角度来看,每个表中的数据是不完整的. 例如,在示例数据库(yiibaidb)中,使用orderNumber列链接的o ...
- 安装Hive(独立模式 使用mysql连接)
安装Hive(独立模式 使用mysql连接) 1.默认安装了java+hadoop 2.下载对应hadoop版本的安装包 3.解压安装包 tar zxvf apache-hive-1.2.1-bin. ...
- MySQL的语句执行顺序
MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...
- Java Mysql连接池配置和案例分析--超时异常和处理
前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...
- mysql连接的一些问题。
最近网站出现 User 数据库名称 has already more than 'max_user_connections' active connections 的报错,网站瘫痪.有必要研究下这个问 ...
- Mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'
在远程连接mysql的时候,连接不上,出现如下报错:Lost connection to MySQL server at 'waiting for initial communication pack ...
- 最常用的MySQL命令语句
e良师益友网导读:MySQL数据库是应用最广的数据库之一,在MySQL数据库中有各种各样的命令调用语句,在平常工作中非常实用的命令,对于初学者来说,掌握文中的MySQL命令语句,是非常实用的,下面我们 ...
- 深入理解php的MySQL连接类
php的MySQL连接类. 后面几个show_databases和show_tables....等方法都用了一堆echo,好像一直不喜欢在类的方法里直接用输出语句,不过这也只是列举数据库和表名,构造 ...
- MySQL 常用语句 (汇集)
原文地址:MySql常用语句作者:wuyanle 一.mysql常用语句 创建,删除和最基本查询: 显示数据库 mysql->show databases; 创建数据库 mysql-> ...
随机推荐
- Scrapy使用心得
今天安装了大名鼎鼎的Scrapy,不过碰到了不少问题,包括"Unable to find vcvarsall.bat" 这个错误应该很常见的,用了最简单的解决方法: 安装visua ...
- Centos7 安装redis3.2.3 过程
1:安装wget: yum install wget2:安装pip: 1:sudo yum -y install epel-release 2:sudo yum -y install py ...
- Storm累计求和进群运行代码
打成jar包放在主节点上去运行. import java.util.Map; import backtype.storm.Config; import backtype.storm.StormSubm ...
- Python15-day1课后作业
功能:编写一个用户登录接口 要求:1)根据提示输入用户名.密码信息 2)输入的用户.密码正确则显示欢迎信息 3)连续三次输入错误则锁定账号 #coding=utf-8import sys,os,get ...
- 锋利的jQuery第2版学习笔记6、7章
第6章,jQuery与Ajax的应用 Ajax的优势和不足 Ajax的优势 1.不需要插件支持 2.优秀的用户体验 3.提高Web程序的性能 4.减轻服务器和带宽的负担 Ajax的不足 1.浏览器对X ...
- JavaScript--Function类型(11)
// 在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例;而且都与其他引用类型一样具有属性和方法; // 由于函数是对象,因此函数名实际上也是一个指向函数对象的 ...
- C#用反射判断一个类型是否是Nullable同时获取它的根类型(转自网络)
在我们的应用程序中我们使用类描述我们的业务对象,为我们产生一些报表之类的,那就依赖大量不同的对象,我们创建一个帮助方法来转换我们的业务对象,或是一个List的业务对象到DataTables. 由于数据 ...
- 六、Android学习笔记_JNI_c调用java代码
1.编写native方法(java2c)和非native方法(c2java): package com.example.provider; public class CallbackJava { // ...
- Objective-C设计模式——原型Prototype(对象创建)
1.原型 原型设计模式所谓原型设计模式,其实就是对象复制,这个特性在所有语言基本上都是存在的. 我们知道在OC中,对象赋值其实是对对象的引用复制,其实就是相当于C语言中的指针.创建了一个新的变量,但是 ...
- 南阳理工ACM——106背包问题
描述: 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10):如果给你一个背包它能容纳的重量为m(10<=m<=20),你 ...