多表操作

4.4 多表操作

用 JOIN 把学生表、课程表、成绩表连起来,才能算出“谁选了什么课、考了多少分”。

第4章 SQL 操作数据库SQL10 页课件3 个知识点

本讲导览

核心内容

第4节

多表操作

📄 展开课件原文(第 1–1 页,共 1 页)
第 1 页

第4节、多表操作

4-1: 表的复制

4-2:多表查询

4-1

表的复制

1、复制一个表(结构和数据)

SQL
create table 新表 select * from 旧表;

只是复制部分结构(主键和自动增长不复制)和全部数据。

2、只复制一个表的结构

SQL
create table 新表 select * from 旧表 where 1=2;

只是复制部分结构(主键和自动增长不复制)

3、只复制数据(假设2个表结构一样)

假设2个表都存在,且结构一样

SQL
Insert into 目的表 select * from 源表

将“源表”中的数据,插入到“目的表”中。

4、复制部分数据(假设2个表结构不一样)

假设2个表都存在,且结构不完全一样

Inset into 目的表(字段列表1) select 字段列表2 from 源表 where 条件

5、只拷贝结构

SQL
create table 新表 like 旧表;

只拷贝结构,包括主键。

如果要再复制数据,可以再用命令实现

6、只复制部分字段和数据

SQL
Create table 新表 (select 字段1,字段2,… from 旧表)

小结:

1、复制一个表的基本结构(不包括主键、自动增长等)和全部数据。

SQL
create table 学生表 select * from student;

2、只复制一个表的基本结构(不包括主键、自动增长等),不包括数据。

SQL
Create table 学生表2 select * from student where 1=2;

思考:此时,想把原表的数据,都插入到新表中,怎么做?

SQL
Insert into 学生表2 select * from student;

说明:这种用法要求这2个表的结构要相同。

3、完全复制一个表的结构(包括主键、自动增长等),但不包括数据。

SQL
Create table 学生表3 like student;

4、插入部分数据,来自另一个表中

语法:insert 表1(字段列表1) select 字段列表2 from 表2 where 条件;

SQL
如:insert into 学生表3(stuno,stuname) select stuno,stuname from student;

说明:

(1)字段列表1和字段列表2,个数相同、类型相同或兼容,顺序一一对应。

(2)不赋值的字段,必须允许为空

📄 展开课件原文(第 2–6 页,共 5 页)
第 2 页

4-1、表的复制

1、复制一个表(结构和数据)

create table 新表 select * from 旧表;

只是复制部分结构(主键和自动增长不复制)和全部数据。

2、只复制一个表的结构

create table 新表 select * from 旧表 where 1=2;

只是复制部分结构(主键和自动增长不复制)

第 3 页

3、只复制数据(假设2个表结构一样)

假设2个表都存在,且结构一样

Insert into 目的表 select * from 源表

将“源表”中的数据,插入到“目的表”中。

4、复制部分数据(假设2个表结构不一样)

假设2个表都存在,且结构不完全一样

Inset into 目的表(字段列表1) select 字段列表2 from 源表 where 条件

第 4 页

5、只拷贝结构

create table 新表 like 旧表;

只拷贝结构,包括主键。

如果要再复制数据,可以再用命令实现

Insert into 目的表 select * from 源表

6、只复制部分字段和数据

Create table 新表 (select 字段1,字段2,… from 旧表)

第 5 页

小结:

1、复制一个表的基本结构(不包括主键、自动增长等)和全部数据。

create table 学生表 select * from student;

2、只复制一个表的基本结构(不包括主键、自动增长等),不包括数据。

Create table 学生表2 select * from student where 1=2;

思考:此时,想把原表的数据,都插入到新表中,怎么做?

Insert into 学生表2 select * from student;

说明:这种用法要求这2个表的结构要相同。

第 6 页

3、完全复制一个表的结构(包括主键、自动增长等),但不包括数据。

Create table 学生表3 like student;

4、插入部分数据,来自另一个表中

语法:insert 表1(字段列表1) select 字段列表2 from 表2 where 条件;

如:insert into 学生表3(stuno,stuname) select stuno,stuname from student;

说明:

(1)字段列表1和字段列表2,个数相同、类型相同或兼容,顺序一一对应。

(2)不赋值的字段,必须允许为空

4-2

多表查询

1、从2个表中查询出数据

从多个表中查询出数据,通常用等值连接查询

等值连接:

条件中,使用“表1.字段名1=表2.字段名2”的方式。

SQL
如:select classname,stuno,stuname from class,student where class.ClassNo=student.ClassNo;
或select classname,stuno,stuname from class join student on class.ClassNo=student.ClassNo;

注意:其写法不一样。

2、联合查询

从多个表中查询的结果,合并到一个结果集中。

各个表的字段列表相同或类型兼容。

SQL
select a,b from A union select c,d from B;
select classno,classname from class union select classno,stuname from student;

3:带子查询的插入

向表中插入的记录可以来自另一张表, 我们可以将一个子查询的结果集插入到一个表中,语法格式如下:

INSERT INTO 表名[{字段列表}] <子查询>

说明:

其中,当表名后的{字段列表}省略时,子查询的目标列要与表中字段的数目顺序和数据类型一致;若不省略{字段列表},子查询的目标列须和{字段列表}保持一致。

格式为:

INSERT INTO 表1(字段列表1)

SQL
select 字段列表2 from 表2 where 条件。

字段列表1和字段列表2的数据类型、个数要一一对应。

例1:

(1)将student表,只拷贝结构为表“学生”。

SQL
create table 学生 like student;

(2)向学生表中插入数据,数据来自student表中classno为‘20000001’的同学。

SQL
insert into 学生 select * from student where classno='20000001';
📄 展开课件原文(第 7–10 页,共 4 页)
第 7 页

4-2、多表查询

1、从2个表中查询出数据

从多个表中查询出数据,通常用等值连接查询

等值连接:

条件中,使用“表1.字段名1=表2.字段名2”的方式。

如:select classname,stuno,stuname from class,student where class.ClassNo=student.ClassNo;

或select classname,stuno,stuname from class join student on class.ClassNo=student.ClassNo;

注意:其写法不一样。

第 8 页

2、联合查询

从多个表中查询的结果,合并到一个结果集中。

各个表的字段列表相同或类型兼容。

select a,b from A union select c,d from B;

select classno,classname from class union select classno,stuname from student;

第 9 页

3:带子查询的插入

向表中插入的记录可以来自另一张表, 我们可以将一个子查询的结果集插入到一个表中,语法格式如下:

INSERT INTO 表名[{字段列表}] <子查询>

说明:

其中,当表名后的{字段列表}省略时,子查询的目标列要与表中字段的数目顺序和数据类型一致;若不省略{字段列表},子查询的目标列须和{字段列表}保持一致。

格式为:

INSERT INTO 表1(字段列表1)

select 字段列表2 from 表2 where 条件。

字段列表1和字段列表2的数据类型、个数要一一对应。

第 10 页

例1:

(1)将student表,只拷贝结构为表“学生”。

create table 学生 like student;

(2)向学生表中插入数据,数据来自student表中classno为‘20000001’的同学。

insert into 学生 select * from student where classno='20000001';

课件里的提醒 课件原文中的“说明 / 注意 / 出错”

  • 说明:这种用法要求这2个表的结构要相同。
  • 注意:其写法不一样。

本讲 SQL 速览 把课件里出现的语句集中起来,方便照着敲

SQL
create table 新表 select * from 旧表;
SQL
create table 新表 select * from 旧表 where 1=2;
SQL
Insert into 目的表 select * from 源表
SQL
create table 新表 like 旧表;
SQL
Create table 新表 (select 字段1,字段2,… from 旧表)
SQL
create table 学生表 select * from student;
SQL
Create table 学生表2 select * from student where 1=2;
SQL
Insert into 学生表2 select * from student;
SQL
Create table 学生表3 like student;
SQL
如:insert into 学生表3(stuno,stuname) select stuno,stuname from student;
SQL
如:select classname,stuno,stuname from class,student where class.ClassNo=student.ClassNo;
SQL
或select classname,stuno,stuname from class join student on class.ClassNo=student.ClassNo;