MySQL多表查询总结

MySQL术语:

  • Redundacncy(冗余):存储两次或多次数据,以便实现快速查询。
  • Primary Key(主键):主键是唯一的。表中每条记录的唯一标识。
  • Foreign Key(外键):用于连接两张表。

表的连接方式

  • 内连接
  • 外连接
  • 自连接

数据准备

创建两张表:student表,college表。

student表结构;

CREATE TABLE `student` (
`studentId` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`phone` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`collegeId` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`studentId`),
KEY `collegeId` (`collegeId`)
) ENGINE = MyISAM CHARSET = utf8 COLLATE utf8_unicode_ci;

创建的表:

college表结构:

CREATE TABLE `college` (
`collegeId` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`collegeName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`collegeId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

创建的表:

内连接

内连接就是标间的主键与外键连接,只取键值一致的,可以获取双方表中的数据。语法:

SELECT 列明1,列明2......FROM 表1 INNER JOIN 表2 ON 表1.外键 = 表2.主键 WHERE 条件语句;

具体MySQL代码:SELECT student.name,college.collegeName FROM student INNER JOIN college ON student.collegeId = college.collegeId;

查询结果:

说明:通过表的内连接,实现了对两张表的数据的查询。将student表中的name字段与college表中的collegeName字段查询出来。

外连接

与取得两张表中的数据相比,外连接只能取得其中一方存在的数据,外连接又分为左连接和右连接两种情况。

左外连接

左外连接是以左表为标准,值查询在左边表中存在的数据,当然需要两个表中的键值一致。语法为:

SELECT 列明1 FROM 表1 LEFT OUTER JOIN 表2 ON 表1.外键 = 表2.主键 WHERE条件语句;

MySQL代码:SELECT student.name,collegeName FROM student LEFT OUTER JOIN college ON student.collegeId = college.collegeId;

运行结果;

可以看到,与内连接不同的是:【钱七】这个学生虽然没有学校ID,但是也被查询出来了,这就是我们所说的,左外连接会以左表中的全部数据作为基础进行查询。

右外连接

同理,右连接将会以右边的数据作为基础,进行检索。语法为:

SELECT 列名1 FROM 表2 RIGHT OUTER JOIN 表2 ON 表1.外键 = 表2.主键 WHERE 条件语句;

代码:

SELECT student.name,college.collegeName FROM student RIGHT OUTER JOIN college ON student.collegeId = college.collegeId;

运行结果:

从运行结果中可以看到,结果是根据右边的数据表college为基础进行检索的。因为表student中并没有“厦大”对应的学生,所以检索出来的结果为NULL。

总结:

  • 内连接是抽取两张表中键值一致的数据,而外连接(左连接、右连接)时,是以其中的一个表中的全部记录作为基础进行检索的。
  • 左连接与右连接只有数据基准的区别,本质上市一样的,具体使用哪种连接,根据实际情况决定。
  • 无论是内连接还是外连接,在查询时候,最好使用【表明.列明】的方式指定需要查询的列明,否则一旦两个表中出现了列明一致的数据,将会报错。
  • 表的别名。其实在我们的实际工程中,如果遇到表明复杂的情况,往往通使用表的别名来简化代码。例:SELECT a.name,b.collegeName FROM student a RIGHT OUTER JOIN college b ON a.collegeId = b.collegeId;/SELECT a.name,b.collegeName FROM student AS a RIGHT OUTER JOIN college AS b ON a.collegeId = b.collegeId;(遇上面代码运行结果一致)。这样会使得代码更加简洁。

自连接

自连接顾名思义,就是根据自己连接自己。

现在我们修改【student】表的数据如下,进行效果验证。

代码:SELECT * FROM student s,student a WHERE a.collegeId = s.collegeId AND a.name <> s.name ORDER BY a.collegeId;

可以看出我们就将【student】表,在同一个学生的学生查出来了。

语句解释:

  • 【student s】和【student a】的含义是分别给两张表起了一个别名,为了代码简洁。
  • 【a.collegeId = s.collegeId AND a.name <> a.name】的含义是找出【collegeId】相同,但是【name】不同的人。
  • 【order BY a.collegeId】将结果按顺序输出。

子查询

通常我们在查询的SQL中嵌套查询,成为子查询。子查询通常会使得复杂的查询变得简单,但是相关的子查询要对基础表中的的每一条数据都进行子查询的动作,座椅当表彰的数据量过大的时候,一定要慎重选择。基本语法如下:

SELECT 列明1 ...FROM

代码:

SELECT * FROM (SELEC

T student.name,college.collegeName FROM student INNER JOIN college ON student.collegeId = college.collegeId)b WHERE b.collegeName = ‘清华‘;

结果:

原文地址:https://www.cnblogs.com/liujianjun8181/p/10319302.html

时间: 2024-11-02 09:48:25

MySQL多表查询总结的相关文章

python3 mysql 多表查询

python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male'

MySQL多表查询回顾

----------------------siwuxie095 MySQL 多表查询回顾 以客户和联系人为例(一对多) 1.内连接 /*内连接写法一*/ select * from t_customer c,t_linkman l where c.cid=l.clid /*内连接写法二(inner 可以省略不写)*/ select * from t_customer c inner join t_linkman l on c.cid=l.clid 2.左外连接 /*左外连接(outer 可以省

mysql多表查询方法(left join(左连接),right join (右连接),inner join (内连接)的区别)

表A记录如下:  aID aNum  1 a20050111  2 a20050112  3 a20050113  4 a20050114  5 a20050115  表B记录如下:  bID bName  1 2006032401  2 2006032402  3 2006032403  4 2006032404  8 2006032408  创建这两个表SQL语句如下:  CREATE TABLE a  aID int( 1 ) AUTO_INCREMENT PRIMARY KEY ,  a

MySQL information_schema表查询导致内存暴涨

case:下面的一条sql语句,导致mysql实例内存暴涨: select * from tables where table_name not in(select table_name from partitions group by table_name having count(*)>1 ); mysql 5.5, 1w+的innodb表. 下面看下调查的结果: 1.  sql的执行情况以及内存分配:   step1: 构造information_schema.tables临时表 1.1 

MYSQL 连表查询及别名用法

MYSQL连表查询是两个表之间的查询或者更多表之间查询,通过外键的方式查询所有的数据,在查询过程中产生字段的重复,为了区分这种情况数据库设计别名,有的表很长,也可以用别名. 1,连表查询 INNER JOIN ,LEFT JOIN,RIGHT JOIN INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录.LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录.RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表

4 - MySQL:多表查询

MySQL:多表查询 一,介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备工作 #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male', age int, dep_id int

记一次mysql多表查询(left jion)优化案例

一次mysql多表查询(left jion)优化案例 在新上线的供需模块中,发现某一个查询按钮点击后,出不来结果,找到该按钮对应sql手动执行,发现需要20-30秒才能出结果,所以服务端程序判断超时,故先不显示结果 以下是对这条查询的优化记录 1 数据库配置 数据库配置:4C8G 主表数据:3W+ 2 sql语句 提取sql语句,简化如下 SELECT taba.id, taba.title, taba.type, taba.end_time, tabb.username, tabc.orgna

python开发mysql:单表查询&amp;多表查询

一 单表查询,以下是表内容 1 一 having 过滤 2 1.1 having和where 3 select * from emp where id > 15; 4 解析过程;from > where 找到数据 > 分组(没有默认一个组)> select 打印 where是出结果之前 5 select * from emp having id > 15; 6 解析过程;from > where 找到数据(没有约束条件,就是整个表)) > 分组(没有默认一个组)&

mysql联表查询,使用phpStudy自带的

一.内联结.外联结.左联结.右联结的含义及区别在SQL标准中规划的(Join)联结大致分为下面四种:1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结.2.外联结:分为外左联结和外右联结.左联结A.B表的意思就是将表A中的全部记录和表B中联结的字段与表A的联结字段符合联结条件的那些记录形成的记录集的联结,这里注意的是最后出来的记录集会包括表A的全部记录.右联结A.B表的结果和左联结B.A的结果是一样的,最后出来的记录集会包括表B的全部记录.具体如下: Select l

MYSQL多表查询事例

1.order by 排序 mysql> select * from xin order by id; +------+----------+ | id   | name     | +------+----------+ |    1 | lilie    | |    2 | tianjin  | |    3 | shanghai | +------+----------+ 2.按照升序排列 mysql> select * from xin order by id asc; +-----