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。

时间: 2024-11-05 16:26:59

mysql 连接语句的相关文章

Mysql常用语句总结

对MySql经常使用语句的详细总结 下面总结的知识点全是经常用的,全都是干货,好好收藏吧./* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */ mysqld --skip-grant-tables -- 修改root密码 密码加密函数password() update mysql.user set password=password('root'); SHOW

查看mysql连接状态各类参数

命令: show processlist; 如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接. show processlist;只列出前100条,如果想全列出请使用show full processlist; mysql> show processlist; 命令: show status; 命令:show status like '%下面变量%'; Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量. Aborted

MySQL 查询语句使用进阶

MySQL 查询语句使用进阶 =============================================================================== 概述: =============================================================================== 练习: 练习1  首先导入hellodb.sql的脚本文件,查询其数据库和表如下: [[email protected] ~]# mysql 

MySQL的语句执行顺序

MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回.如果没有在语句中指定某一个子句,那么将会跳过相应的步骤. 下面我们来具体分析一下查询处理的每一个阶段 FORM: 对FROM的左边的表和右边的表计算笛卡尔积.产生虚表VT1 ON: 对虚表VT1进行ON筛选,只有那些符合<join-condit

mysql sql语句大全

1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack 4.说明:创建新表 cr

mysql查询语句

mysql查询语句常用SELECT命令打印当前的日期和时间select now();打印当前的日期select curdate();打印当前时间select curtime();查看当前版本select version();打印当前用户select user();查看当前数据库实例select database();查看系统中可用的变量show variables;查看系统中全局变量show global variables;一般查询系统可用变量或是全局变量都是通过like的方式来进行查询的,因

PHP MySQL 预处理语句

PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预处理:创建 SQL 语句模板并发送到数据库.预留的值使用参数 "?" 标记 .例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?) 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出 执行:最

CentOS下安装MySQL,Windows下使用Navicat for MySql连接

安装 查看有没有安装过:          yum list installed mysql*          rpm -qa | grep mysql* 查看有没有安装包:          yum list mysql* 安装mysqlclient:          yum install mysql 安装mysql server端:          yum install mysql-server          yum install mysql-devel 启动&&停止

安装Hive(独立模式 使用mysql连接)

安装Hive(独立模式 使用mysql连接) 1.默认安装了java+hadoop 2.下载对应hadoop版本的安装包 3.解压安装包 tar zxvf apache-hive-1.2.1-bin.tar.gz 4.安装mysql yum -y install mysql-server mysql mysqldev //需要以root身份运行 另外可能需要配置yum源 mysql常用命令: service mysqld start/stop chkconfig mysqld on //加入开机