欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL-多表查询&连接查询

程序员文章站 2022-05-29 17:10:25
...

【多表查询】

  • 语法格式:
    select (多个)字段名列表 from (多个)表名列表 where 条件;
    字段名用:表名.字段名,表名.字段名
    多个表名中间用逗号隔开
    条件:表名.字段名

  • 示例:

    1.显示省市详细信息:
    	如:河北省  石家庄市
    	select sheng.s_name,city.c_name from sheng,city where sheng.s_id = city.cfather_id;
    
    2.显示省市县详细信息
    	select sheng.s_name,city.c_name,xian.x_name 
    	from sheng,city,xian 
    	where sheng.s_id = city.cfather_id and city.c_id = xian.xfather_id;
    
    	+-----------+--------------+-----------+
    	| s_name    | c_name       | x_name    |
    	+-----------+--------------+-----------+
    	| 河北省    | 石家庄市     | 正定县    |
    	| 湖北省    | 武汉市       | 武昌区    |
    	+-----------+--------------+-----------+
    

   

【连接查询】

内连接

  1. 语法格式:
    select 字段名 from 表1
    inner join 表2 on 条件
    inner join 表3 on 条件

  2. 示例:

    1.显示省市详细信息
    	 select sheng.s_name,city.c_name from sheng 
    	 inner join city on sheng.s_id = city.cfather_id;
    	+-----------+--------------+
    	| s_name    | c_name       |
    	+-----------+--------------+
    	| 河北省    | 石家庄市     |
    	| 河北省    | 沧州市       |
    	| 河北省    | 廊坊市       |
    	| 陕西省    | 西安市       |
    	| 四川省    | 成都市       |
    	| 四川省    | 重庆市       |
    	| 广东省    | 广州市       |
    	| 山东省    | 济南市       |
    	| 湖北省    | 武汉市       |
    	| 河南省    | 郑州市       |
    	+-----------+--------------+
    
    2.显示省市县的详细信息
    	select sheng.s_name,city.c_name,xian.x_name from sheng 
    	inner join city on sheng.s_id = city.cfather_id 
    	inner join xian on city.c_id = xian.xfather_id;
    	+-----------+--------------+-----------+
    	| s_name    | c_name       | x_name    |
    	+-----------+--------------+-----------+
    	| 河北省    | 石家庄市     | 正定县    |
    	| 湖北省    | 武汉市       | 武昌区    |
    	+-----------+--------------+-----------+
    

外连接

  • 左连接
  1. 定义:以左表为主来显示查询结果
    (左表里面的数据会全部显示,右边匹配不到的用空值填充)

  2. 语法格式:
    select 字段名列表 from 表1
    left join 表2 on 条件
    left join 表3 on 条件;

  3. 示例:

    # 显示省市详细信息
    select sheng.s_name,city.c_name from sheng 
    left join city on sheng.s_id = city.cfather_id;
    +-----------+--------------+
    | s_name    | c_name       |
    +-----------+--------------+
    | 河北省    | 石家庄市     |
    | 河北省    | 沧州市       |
    | 河北省    | 廊坊市       |
    | 陕西省    | 西安市       |
    | 四川省    | 成都市       |
    | 四川省    | 重庆市       |
    | 广东省    | 广州市       |
    | 山东省    | 济南市       |
    | 湖北省    | 武汉市       |
    | 河南省    | 郑州市       |
    | 海南省    | NULL         |
    | 云南省    | NULL         |
    | 山西省    | NULL         |
    +-----------+--------------+
    
    
  • 右连接
  1. 定义:以右表为主来显示查询结果
    (右表里面的数据会全部显示,左边匹配不到的用空值填充)

  2. 语法格式:
    select 字段名列表 from 表1
    right join 表2 on 条件
    right join 表3 on 条件;

  • 综合示例(以市表为主显示省市县信息)

    mysql> select sheng.s_name,city.c_name,xian.x_name
    	   -> from sheng
    	    -> right join city
    	    -> on sheng.s_id = city.cfather_id   
    	    -> left join xian
    	    -> on city.c_id = xian.xfather_id;
    	+-----------+--------------+--------------+
    	| s_name    | c_name       | x_name       |
    	+-----------+--------------+--------------+
    	| 河北省    | 石家庄市     | 正定县       |
    	| NULL      | 上海市       | 浦东新区     |
    	| 湖北省    | 武汉市       | 武昌区       |
    	| NULL      | 雄安新区     | 安新县       |
    	| NULL      | 雄安新区     | 容城县       |
    	| NULL      | 雄安新区     | 雄县         |
    	| 河北省    | 沧州市       | NULL         |
    	| 河北省    | 廊坊市       | NULL         |
    	| 陕西省    | 西安市       | NULL         |
    	| 四川省    | 成都市       | NULL         |
    	| 四川省    | 重庆市       | NULL         |
    	| 广东省    | 广州市       | NULL         |
    	| 山东省    | 济南市       | NULL         |
    	| 河南省    | 郑州市       | NULL         |
    	| NULL      | 北京市       | NULL         |
    	| NULL      | 天津市       | NULL         |
    	| NULL      | 哈尔滨       | NULL         |
    	+-----------+--------------+--------------+
    	17 rows in set (0.00 sec)
    

   
(上面案例展示)三表代码如下:

create table sheng(
id int primary key auto_increment,
s_id int,
s_name varchar(15)
)default charset=utf8;

insert into sheng values
(1, 130000, '河北省'),
(2, 140000, '陕西省'),
(3, 150000, '四川省'),
(4, 160000, '广东省'),
(5, 170000, '山东省'),
(6, 180000, '湖北省'),
(7, 190000, '河南省'),
(8, 200000, '海南省'),
(9, 200001, '云南省'),
(10,200002,'山西省');

create table city(
id int primary key auto_increment,
c_id int,
c_name varchar(15),
cfather_id int
)default charset=utf8;

insert into city values
(1, 131100, '石家庄市', 130000),
(2, 131101, '沧州市', 130000),
(3, 131102, '廊坊市', 130000),
(4, 131103, '西安市', 140000),
(5, 131104, '成都市', 150000),
(6, 131105, '重庆市', 150000),
(7, 131106, '广州市', 160000),
(8, 131107, '济南市', 170000),
(9, 131108, '武汉市', 180000),
(10,131109, '郑州市', 190000),
(11,131110, '北京市', 320000),
(12,131111, '天津市', 320000),
(13,131112, '上海市', 320000),
(14,131113, '哈尔滨', 320001),
(15,131114, '雄安新区', 320002);


create table xian(
id int primary key auto_increment,
x_id int,
x_name varchar(15),
xfather_id int
)default charset=utf8;

insert into xian values
(1, 132100, '正定县', 131100),
(2, 132102, '浦东新区', 131112),
(3, 132103, '武昌区', 131108),
(4, 132104, '哈哈', 131115),
(5, 132105, '安新县', 131114),
(6, 132106, '容城县', 131114),
(7, 132107, '雄县', 131114),
(8, 132108, '嘎嘎', 131115);