目录
1.多表联查
1.1内连接
1.2左连接和右连接
1.3自连接
2.子查询
3.合并查询
1.多表联查
多表联查实际上就是对多张表中的数据合并在一起进行查询,具体合并多张表中的数据方式为:取笛卡尔积的方式进行合并。
但仅是以笛卡尔积的方式合并表较为单薄,且很多时候无法做更进一步操作,例如对两个较大表合并后的结果进行查询。这些情况是我们不愿意看到的,因此对于多表联合的方式,我们存在内连接,左连接和右连接,以及全连接的方式。
1.1内连接
内连接的关键字是inner join,用于返回两个表中匹配的行。只有在连接条件成立的情况下,才会返回数据;若是连接无法建立,则会直接丢弃这些数据。
我们先创建两张表格t1和t2,并向里面插入数据据内容,效果如下:
然后使用内连接将二者连接,得到结果如下:
我们会发现只有但二者id相同时,才会将其连接在一起,这也正是内连接的具体效果。
1.2左连接和右连接
左连接的关键字是left join,用于返回左表中的所有行,并返回右表中匹配的行。如果没有匹配的行,右表中的列将包含NULL值。
左表作为基表,会将左表中的内容全部包含,然后合并和右表相同的内容,若不存在则填充NULL内容。
右连接的关键字是right join,作用与左连接相反,用于返回右表中的所有行,并返回左表中匹配的行。如果没有匹配的行,左表中的列将包含NULL值。
右连接则是相反。因为左右连接具有相反的特性,所以我们将其统称为外连接。
1.3自连接
自连接是一种特殊的SQL查询技术,用于将同一张表中的不同行进行关联。自连接通常用于解决与同一表中的数据相关的查询问。自连接一般是用的连接方式是内连接,也就是使用inner join关键字将自己和自己重新连接。
具体的自连接效果如下:
自连接会将本身内容进行复用,其中需要注意的内容是:在使用自连接过程中,必须对同一张表使用as关键字起别名,这样才可以在实现自连接。因为从本质上而言,连接仍是两表及以上的操作,所以需要以起别名的方式来将一张表当作两张表来看待。
2.子查询
在MySQL当中,子查询是指select嵌套使用的情况,具体作用是一个sql语句的查询过滤条件,是基于另一条查询语句的结果进行的。
我们给出实例,查询“不想毕业”同学的同班同学,其具体的sql语句应如下:
select * from student where class_id=(select id from student where name='不想毕业');
先查询到不想毕业同学的具体学号id结果,再将其作为过滤条件,查询得到存在该id的班级同学内容。
不过,需要注意的是,当子查询语句只有一条结果的时候,可以使用=进行判定,将结果当作条件来进行使用。但如果子查询结果具有多个的时候,则需要使用in(exists)来进行集合判断,判断指定字段是否在集合中。
3.合并查询
合并查询实际上是将两条语句的查询结果合并到一起进行返回,并且要求两条语句的查询结果字段需要保持一致,才可以进行合并。
MySQL的合并查询包括UNION、UNION ALL、INTERSECT和EXCEPT(或MINUS)这四个操作符。
UNION:将两个或多个SELECT语句的结果集合并成一个结果集,去除重复的行。
例如:
SELECT name FROM customers WHERE city = 'New York'
UNION
SELECT name FROM customers WHERE city = 'Los Angeles'
这个查询将返回城市为“New York”或“Los Angeles”的客户名字列表,去除重复的行。
UNION ALL:将两个或多个SELECT语句的结果集合并成一个结果集,不去除重复的行。
例如:
SELECT name FROM customers WHERE city = 'New York'
UNION ALL
SELECT name FROM customers WHERE city = 'Los Angeles'
这个查询将返回城市为“New York”或“Los Angeles”的客户名字列表,不去除重复的行。