本节将介绍一些其他的常用SQL,如INSERT...SELECT语句、UNION语句、TRUNCATE语句等。
使用INSERT...SELECT语句可以把一张表中的数据插入另一张表中,该语句属于DML语句。
假设创建了一张学生表的备份表“student_bak”,建表语句如下:
CREATE TABLE student_bak(no int primary key, student_name varchar(40), age int, class_no int);
可以使用下面的语句把数据备份到备份表中:
INSERT INTO student_bak SELECT * FROM student;
演示如下:
osdba=# INSERT INTO student_bak SELECT * FROM student; INSERT 0 8 osdba=# SELECT * FROM student_bak; no | student_name | age | class_no ----+--------------+-----+---------- 1 | 张三 | 14 | 1 2 | 吴二 | 15 | 1 3 | 李四 | 13 | 2 4 | 吴三 | 15 | 2 5 | 王二 | 15 | 3 6 | 李三 | 14 | 3 7 | 吴二 | 15 | 4 8 | 张四 | 14 | 4 (8 rows)
使用UNION语句可以把从两张表中查询出来的数据合在一个结果集下,示例如下:
SELECT * FROM student WHERE no = 1 UNION SELECT * FROM student_bak where no = 2;
上面的语法比较简单,把两个SQL语句用“UNION”关键字连接起来就可以了。
查询结果如下:
osdba=# SELECT * FROM student WHERE no = 1 UNION SELECT * FROM student_bak where no = 2; no | student_name | age | class_no ----+--------------+-----+---------- 1 | 张三 | 14 | 1 2 | 吴二 | 15 | 1 (2 rows)
需要特别注意的是,UNION语句可以把结果集中相同的两条记录合并成一条:
osdba=# SELECT * FROM student WHERE no = 1 UNION SELECT * FROM student_bak where no = 1; no | student_name | age | class_no ----+--------------+-----+---------- 1 | 张三 | 14 | 1 (1 row)
如果不想合并结果集中的相同记录,可以使用UNION ALL语句,示例如下:
osdba=# SELECT * FROM student WHERE no = 1 UNION ALL SELECT * FROM student_bak where no = 1; no | student_name | age | class_no ----+--------------+-----+---------- 1 | 张三 | 14 | 1 1 | 张三 | 14 | 1 (2 rows)
TRUNCATE TABLE语句的用途是清空表内容。不带WHERE条件子句的DELETE语句也表示清空表内容,从执行结果来看,两者实现了相同的功能,但两者实现的原理是不一样的。TRUNCATE TABLE语句是DDL语句,即数据定义语句,相当于用重新定义一个新表的方法把原表的内容直接丢弃了,所以TRUNCATE TABLE执行起来会很快;而DELETE语句是DML语句,我们可以认为DELETE语句是把数据一条一条地删除,所以DELETE语句删除多行数据时执行起来比较慢。
如果想把student_bak表中的数据清除,可以使用如下命令:
TRUNCATE TABLE student_bak;