sql-多表查询基础操作

所用表以及数据:


CREATE TABLE `stu` (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(20) DEFAULT NULL,
  age int(11) DEFAULT NULL,
  score double(4,2) DEFAULT NULL,
  address_id int(11) DEFAULT NULL,
  PRIMARY KEY (id),
  CONSTRAINT `FK_stu_address` FOREIGN KEY (address_id) REFERENCES address (`id`) ON UPDATE CASCADE
) ;


create table address(
        id int primary key auto_increment, # id自增
        description varchar(20)
);
插入的数据:
insert into `address` (`id`, `description`) values('1','France');
insert into `address` (`id`, `description`) values('2','England');
insert into `address` (`id`, `description`) values('3','China');
insert into `address` (`id`, `description`) values('4','');
insert into `stu` (`id`, `name`, `age`, `score`, `address_id`) values('1','li','19','90.80',NULL);
insert into `stu` (`id`, `name`, `age`, `score`, `address_id`) values('2','wang','19','89.40','1');
insert into `stu` (`id`, `name`, `age`, `score`, `address_id`) values('3','gu','18','94.00','1');
insert into `stu` (`id`, `name`, `age`, `score`, `address_id`) values('4','luo','19','95.00','1');
insert into `stu` (`id`, `name`, `age`, `score`, `address_id`) values('5','cui','20','96.00','1');
insert into `stu` (`id`, `name`, `age`, `score`, `address_id`) values('6','zhang','21','96.00','2');
insert into `stu` (`id`, `name`, `age`, `score`, `address_id`) values('7','chen','22','97.00','2');
insert into `stu` (`id`, `name`, `age`, `score`, `address_id`) values('8','yao','23','98.00','2');

内连接查询

  • 隐式内连接查询
    创建:select 表1.列1,表1.列2,表2.列2 from 表1,表2 where 表1.列1=表2.列1
    例子:select stu.name,stu.age,address.description from stu,address where stu.address_id=address.id;
mysql> select stu.name,stu.age,address.description from stu,address where stu.address_id=address.id;
+-------+------+-------------+
| name  | age  | description |
+-------+------+-------------+
| wang  |   19 | France      |
| gu    |   18 | France      |
| luo   |   19 | France      |
| cui   |   20 | France      |
| zhang |   21 | England     |
| chen  |   22 | England     |
| yao   |   23 | England     |
+-------+------+-------------+
7 rows in set (0.00 sec)
  • 显式内连接查询
    创建:select 表1.列1,表1.列2,表2.列2 from 表1 (inner) join 表2 on 表1.列1=表2.列1;
    例子:select stu.name,stu.age,address.description from stu join address on stu.address_id=address.id;
mysql> select  stu.name,stu.age,address.description from stu join address on stu.address_id=address.id;
+-------+------+-------------+
| name  | age  | description |
+-------+------+-------------+
| wang  |   19 | France      |
| gu    |   18 | France      |
| luo   |   19 | France      |
| cui   |   20 | France      |
| zhang |   21 | England     |
| chen  |   22 | England     |
| yao   |   23 | England     |
+-------+------+-------------+
7 rows in set (0.00 sec)

外连接查询

  • 左连接查询
    创建:select * from 表1 left join 表2 on 表1.列1=表2.列1;其中表1是左表,表2是右表,显示表1中所有记录及与表2的交集部分。
    例子:select * from stu left join address on stu.address_id=address.id;
mysql> select * from stu left join address on stu.address_id=address.id;
+----+-------+------+-------+------------+------+-------------+
| id | name  | age  | score | address_id | id   | description |
+----+-------+------+-------+------------+------+-------------+
|  1 | li    |   19 | 90.80 |       NULL | NULL | NULL        |
|  2 | wang  |   19 | 89.40 |          1 |    1 | France      |
|  3 | gu    |   18 | 94.00 |          1 |    1 | France      |
|  4 | luo   |   19 | 95.00 |          1 |    1 | France      |
|  5 | cui   |   20 | 96.00 |          1 |    1 | France      |
|  6 | zhang |   21 | 96.00 |          2 |    2 | England     |
|  7 | chen  |   22 | 97.00 |          2 |    2 | England     |
|  8 | yao   |   23 | 98.00 |          2 |    2 | England     |
+----+-------+------+-------+------------+------+-------------+
8 rows in set (0.00 sec)
  • 右连接查询
    创建:select * from 表1 right join 表2 on 表1.列1=表2.列1;其中表1是左表,表2是右表,显示表2中所有记录及与表1的交集部分。
    例子:select * from stu right join address on stu.address_id=address.id;
mysql> select * from stu right join address on stu.address_id=address.id;
+------+-------+------+-------+------------+----+-------------+
| id   | name  | age  | score | address_id | id | description |
+------+-------+------+-------+------------+----+-------------+
|    2 | wang  |   19 | 89.40 |          1 |  1 | France      |
|    3 | gu    |   18 | 94.00 |          1 |  1 | France      |
|    4 | luo   |   19 | 95.00 |          1 |  1 | France      |
|    5 | cui   |   20 | 96.00 |          1 |  1 | France      |
|    6 | zhang |   21 | 96.00 |          2 |  2 | England     |
|    7 | chen  |   22 | 97.00 |          2 |  2 | England     |
|    8 | yao   |   23 | 98.00 |          2 |  2 | England     |
| NULL | NULL  | NULL |  NULL |       NULL |  3 | China       |
| NULL | NULL  | NULL |  NULL |       NULL |  4 |             |
+------+-------+------+-------+------------+----+-------------+
9 rows in set (0.00 sec)

内连接查询与外连接查询区别:
内连接查询:显示交集部分数据,为空则不显示;
外连接查询:显示左(右)表所有数据,及与右(左)表的交集部分数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值