mysql表的连接与查询
mysql表的连接有笛卡尔积连接,内连接,外连接,子连接查询几种。
笛卡尔积连接
笛卡尔积连接又称为交叉连接。将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用。
语法:
1 | select * from 表名一,表名二 where 条件 |
内连接
介绍:(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。
关键字:inner join on
语法:
1 | select * from a_table a inner join b_table b on a.a_id=b.b_id; |
说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
非等值连接
说明:值大于于不等于之时 可以使用between语句来限制条件
1 | where 列名 BETWEEN ... AND ... |
自连接
说明:自连接就是说,在同一个表中,看做是两个表,可以看成一张表的两个副本之间的连接。在自连接中,必须为表指定两个别名,使之在逻辑上成为两个表。
例子:
左连接
关键字:left join on
语法:
1 | SELECT * FROM a_table a left join b_table b ON a.a_id = b.b_id; |
说明: left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。 左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
例子:
右连接
关键字:right join on
语法:
1 | SELECT * FROM a_table a right outer join b_table b on a.a_id = b.b_id; |
说明:right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
例子:
子连接查询
嵌套子查询
定义:一个内层查询语句(select-from-where)块可以嵌套在另外一个外层查询块的where子句中,其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询。子查询一般不使用order by子句,只能对最终查询结果进行排序。在一个SELECT 语句的WHERE 子句或HAVING 子句中嵌套另一个SELECT 语句的查询称为嵌套查询,又称子查询。
工作方式:嵌套查询的工作方式是:先处理内查询,由内向外处理,外层查询利用内层查询的结果嵌套查询不仅仅可以用于父查询select语句使用。还可以用于insert、update、delete语句或其他子查询中。
分类:
标量子查询
说明:子查询得到的结果是一行一列 是指子查询返回的是单一值的标量,如一个数字或一个字符串,也是子查询中最简单的返回形式。 可以使用 = > < >= <= <> 这些操作符对子查询的标量结果进行比较,通常子查询的位置在比较式的右侧
例子: 标题号为1的
列子查询(多行子查询)
说明:指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回。 可以使用 = > < >= <= <> 这些操作符对子查询的标量结果进行比较,通常子查询的位置在比较式的右侧 可以使用 IN、ANY、SOME 和 ALL 操作符,不能直接使用 = > < >= <= <> 这些比较标量结果的操作符。
多行操作符:
注意:any操作符可以替换为聚集函数min() all操作符可以替换为聚集函数max()
例子:语文数学都及格的
例子:使用聚集函数
这个是等同于any操作符的
行子查询
说明:子查询得到的结果是多列一行(多行多列) 用的较少 需要满足在where后面括号里的删选条件要等同于子查询语句才能使用。
例子:
Exists子查询
Exists和not exists子查询:
exists语法:
1 | select * from 表名 where exists (子查询) |
注意:
- Exists用来检测数据库对象是否存在
- Exists关键字后面的参数是任意的子查询
- 子查询有返回结果: EXISTS子查询结果为TRUE
- 子查询无返回结果: EXISTS子查询结果为FALSE, 外层查询不执行
not exists:
和exists实现相反操作
例子:查询所有选修了c01号课程的学生信息:
集合查询
说明:因为select的查询结果是元组的集合,所以可以对select的结果进行集合操作
操作符:union
注意事项:
通过union连接的SQL它们分别单独取出的列数必须相同;
不要求合并的表列名称相同时,以第一个sql 表列名为准;
被union 连接的sql 子句,单个子句中不用写order by ,因为不会有排序的效果。但可以对最终的结果集进行排序;
(select id,name from A order by id) union all (select id,name from B order by id); //没有排序效果
每个查询表达式应具有相同的数据类型,或者可以自动将他们转化为相同的数据类型
例子: