一、数据定义语言DDL
(一)定义
数据定义语言(Data Definition Language, DDL),主要用来操作数据库和操作数据表格式。其中操作数据库主要包括创建数据库(create)、更新数据库(alter)和删除数据库(drop)。
(二)基础DDL语句
(1)对数据库的操作
1、创建数据库
SQL中使用create语句来创建数据库,具体语法为
CREATE DATABASE [IF NOT EXISTS] 数据库名;
由于数据库不可以重名,故添加[if not exists],如果已有同名数据库则不重复操作。若不声明[if not exists],当存在同名数据库时将报错。
2、删除数据库
SQL中使用drop语句来删除数据库,具体语法为
DROP DATABASE [IF EXISTS] 数据库名;
使用[if exists]时确保若不存在此数据库时也不报错,但对于打错数据库名导致没有删除正确的数据库时,添加该语句的方法并不好。
【注意】使用drop database删除数据库后,数据库中存储的所有数据表和数据都将一同被删除,并且无法恢复。
3、修改数据库编码
SQL中使用如下语句来修改编码
ALTER DATABASE 数据库名 CHARACTER SET 编码名
【注意】SQL中所有的编码名不能使用“-”,例如UTF-8要写成UTF8。
(2)对数据表的操作
1、创建表
SQL使用create语句来创建数据表,具体语法示例为
CREATE TABLE [IF NOT EXISTS] 表名(
字段名1 字段类型 [字段属性][字段约束]
字段名2 字段类型 [字段属性][字段约束]
......
)
【补充1】MySQL中常用的数据类型:主要是三种,即文本(Text)、数字(Number)和日期/时间(Date/Time)类型。
1)文本(Text)类型:
- CHAR(size):保存固定长度的字符串(可包含字母、数字及特殊字符)。在括号中指定字符串的长度,最多255个字符;
- VARCHAR(size):保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度,最多255个字符。若超过则会被转为TEXT类型;
- TINYTEXT:存放最大长度为255个字符的字符串;
- TEXT:存放最大长度为65,535个字符的字符串;
- BLOB:用于BLOBs(Binary Large Objects),存放最多65,535字节的数据;
- BOOLEAN:布尔类型,存储TRUE或FALSE值;
- MEDIUMTEXT:存放最大长度为16,777,215个字符的字符串;
- MEDIUMBLOB:用于BLOBs,存放最多16,777,215字节的数据;
- LONGTEXT:存放最大长度为4,294,967,295个字符的字符串;
- LONGBLOB:用于BLOBs,存放最多4,294,967,295字节的数据;
- ENUM(x,y,z,etc.):输入列表。可以在ENUM中列出最大65,535个值。如果不存在插入的值,则默认插入空值。且列表值的顺序是输入的顺序。例如,ENUM('X','Y','Z');
2)数字(Number)类型:
- TINYINT(size):带符号-128到127,无符号0到255。size为指定的大小;
- SMALLINT(size):带符号范围-32,768到32,767,无符号0到65,535,size默认为6;
- MEDIUMINT(size):带符号范围-8,388,608到8,388,607,无符号范围0到16,777,215,size默认为9;
- INT(size):带符号范围-2,147,483,648到2,146,483,647,无符号范围0到4,294,967,295,size默认为11;
- BIGINT(size):带符号范围-9,223,372,036,854,775,808到9,223,372,036,854,775,807,无符号范围0到18,446,744,073,709,551,615,size默认为20;
- FLOAT(size,d):带有浮动小数点的小数,参数size规定显示最大位数,参数d规定小数点右侧的最大位数;
- DOUBLE(size,d):带有浮动小数点的大数,参数size规定显示最大位数,参数d规定小数点右侧的最大位数;
- DECIMAL(size,d):以字符串形式存储的DOUBLE类型;
【注】以上所述的size代表的只是显示的数字长度,并不是存储在数据库中的具体长度。例如,int(size)无论size为多少,均在磁盘上占用4btyes的存储空间。在显示上,例如:若int值为10,则int(4)显示结果为0010,int(3)显示结果为010。
3)日期(Date)类型:
- DATE():日期类型,格式为YYYY-MM-DD;
- DATETIME():日期和时间的组合,格式为YYYY-MM-DD HH:MM:SS;
- TIMESTAMP():时间戳,使用Unix纪元('1970-01-01 00:00:00' UTC)至今的秒数来存储。格式与DATATIME()相同。但支持的范围为'1970-01-01 00:00:01'UTC到'2038-01-09 03:14:07' UTC;
- TIME():时间,格式为HH:MM:SS;
- YEAR():2位或4位格式的年。2位格式所允许的值为70到69,表示从1970到2069。4位格式所允许的值为1901到2155;
【注】虽然DATETIME和TIMESTAMP返回相同的格式,但它们的工作方式不同。在INSERT或UPDATE查询中,TIMESTAMP自动把自身设置为当前的日期和时间。TIMESTAMP也接受不同的格式,如YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD。
【补充2】字段约束:SQL中,建表时规定的约束,若在插入数据时违反则会被终止插入。
- NOT NULL:该列数据不能存储NULL值;
- UNIQUE:该列不能有重复值;
- PRIMARY KEY:主键约束。类似于not null和unique的结合。确保某列(或多列的组合)有唯一的标识,有助于更快速地找到表中的特定记录;
- FOREIGN KEY:确保表中的数据匹配另一个表中的值的参照完整性;
-- 示例 CREATE TABLE Orders( OrderID INT NOT NULL PRIMARY KEY, OrderNumber INT NOT NULL, CustomerID INT, FOREIGN KEY(CustomerID) REFERENCES Customers(CustomerID) );
- CHECK(条件):保证列中的值符合指定的条件;
- DEFAULT(默认值):没有给列赋值时的默认值;
- INDEX:用于快速访问数据库表中的数据;
-- 示例 CREATE INDEX idx_lastname ON Employees(LastName);
2、查看表结构
表结构就是数据表包含哪些字段,各字段的字段名、字段类型和大小等。对于不同的目的,可以使用不同的查询语句。
1)查询表的列信息
DESC 表名;
或者
DESCRIBE 表名;
或者
SHOW COLUMNS FROM 表名;
2)查询建表语句
SHOW CREATE TABLE 表名;
3)查询元数据
元数据是指定义数据结构的数据,如数据库名、表名、字段类型、外键约束等。
USE INFORMATION_SCHEMA
SELECT * FROM columns WHERE table_name = '表名';
3、更新表和字段结构
SQL中更新表和字段的结构主要用alter table语句,对字段结构的操作有增加字段add、更改字段类型modify、更改字段名及类型change和删除字段drop;修改表名使用rename to。
1)增加字段
SQL中用add语句添加表中的字段结构,具体语法为
ALTER TABLE 表名 ADD(
新增字段名1 数据类型 约束
新增字段名2 数据类型 约束
);
2)更改字段类型
SQL中用modify来修改字段类型,具体语法为
ALTER TABLE 表名 MODIFY 字段名 新字段属性;
3)更改字段名和类型
SQL中用change来修改字段名,具体语法为
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 字段属性;
4)删除字段
SQL中用drop来删除字段名,具体语法为
ALTER TABLE 表名 DROP 字段名;
5)修改表名
SQL中用rename to来修改表名,具体语法为
ALTER TABLE 原表名 RENAME TO 新表名;
4、删除表
SQL中删除表共有三种方法,drop、truncate和delete。
1)drop
用drop删除表会将表的内容和定义一并删除以释放空间,且该表的结构中被依赖的约束(constrain)、触发器(trigger)和索引(index)也会被删除。依赖于该表的存储过程/函数将被保留,但状态会变为invalid。具体语法为
DROP TABLE 表名;
2)truncate
用truncate删除表只会清空表的内容,释放空间但会保留表的数据结构。具体语法为
TRUNCATE TABLE 表名;
3)delete
用delete来删除表中的行。且delete语句执行删除的过程是每次从表中删除一行,该行的删除操作会作为事务记录在日志中保存,以便进行回滚操作。
delete可以用where语句选择特定条件的行进行删除(属于DML的内容)。
且delete和truncate一样,只删除内容,保留表的数据结构。具体语法为
DELETE FROM 表名 WHERE 字段名 = 某值;
二、数据操作语言DML
(一)定义
数据操作语言(Data Manipulation Language, DML),主要用来对数据库中表的数据进行增加(insert)、删除(delete)和修改(update)。
(二)基础DML语句
(1)插入数据
SQL中用insert来向表中插入数据,主要有两种方法
方法一:
INSERT INTO 表名 (列名1, 列名2, ...) VALUES (value1, value2, ...);
使用该方法可以对表中的部分选定列进行数据插入操作,且不在列名集合内的字段值为null。
方法二:
INSERT INTO 表名 VALUES (value1, value2, ...);
该方法没有制定要插入的列,故按照创建表时列的顺序插入列值,且不可以插入部分数据(存疑,需要实证一下);
【注】插入的所有字符串数据都需要用单引号('')引用。
(2)修改数据
SQL中用update来修改表中的数据,具体如下
UPDATE 表名 SET 列名1=value1, 列名2=value2, ... [WHERE 条件];
update语句可以使用where条件语句来进行条件修改操作。
(3)删除数据
此部分同DDL中的【4、删除表】部分。
三、数据控制语言DCL
(一)定义
数据控制语言(Data Control Language, DCL)用于定义用户的访问权限和安全级别,主要包括创建用户(create)、授权(grant)、撤销授权(revoke)、查看权限(show grants)、删除用户(drop)和以root身份修改用户密码(alter)。
(二)基础DCL语句
(1)创建用户
SQL使用create user语句来创建用户,具体如下
CREATE USER '用户名' @地址 IDENTIFIED BY '密码';
【注】若给所有地址的用户授权,使用@'%'。
(2)用户授权
SQL使用grant语句来给用户授权,具体如下
GRANT 权限1,权限2,... ON 数据库名.* TO '用户名'@地址;
其中,能给用户授予的权限有CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT等;
若要授予所有权限,则用
GRANT ALL ON 数据库名.* TO '用户名'@地址;
(3)撤销授权
SQL使用revoke语句来撤销给用户的授权,具体如下
REVOKE 权限1,权限2,... ON 数据库名.* FROM '用户名'@地址;
具体可以撤回的权限和撤回所有权限的方法与授权时完全相同。
(4)查看用户权限
SQL使用show grants语句来查看授权给用户的权限,具体如下
SHOW GRANTS FOR '用户名'@地址;
(5)删除用户
SQL使用drop语句来删除用户,具体如下
DROP USER '用户名'@地址;
(6)修改用户密码
SQL修改用户密码的操作必须以root身份执行,使用alter语句修改,具体如下
ALTER USER ‘用户名’@地址 IDENTIFIED BY '新密码';
三、数据查询语言DQL
(一)定义
数据查询语言(Data Query Language, DQL)。主要是对数据进行查询操作,且可以对于从数据库中查出的结果进行各种运算再最终展示。一般语法结构为
SELECT 列名 --要查询的字段名称
FROM 表名 --目标表名
WHERE 条件 --查询的行条件
GROUP BY 分组列 --对结果分组
HAVING 分组条件 --分组后的行条件(满足该条件才最终展示)
ORDER BY 排序列 --对结果进行排序(默认升序esc,降序为desc)
LIMIT 起始行,总行数 --对所查询的结果进行行数的限定选择
(二)具体查询语法
1. 基础查询
基础语法在(一)中已经阐述,可以用
SELECT * FROM 表名;
来选去表中的所有列,“*”为通配符,代表所有列;
2. 条件查询
DQL在查询时,在WHERE字句中输入查询条件,常用的查询条件有
-- 比较
=、!=、<>、<、<=、>、>=;
-- 范围选择
BETWEEN ... AND ...;
-- 集合判断
IN(所需要筛选判断的集合);
-- 判断(不)为空
IS (NOT) NULL;
-- 逻辑与
AND
-- 逻辑或
OR
-- 逻辑非
NOT
3. 模糊查询
模糊查询的一般语法为
SELECT 字段
FROM 表名
WHERE 某字段 LIKE 条件
对于like后的条件,SQL提供了两种匹配模式:
(1)%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,则需使用两个百分号(%%)表示。示例如下
-- 查询姓名以"z"开头的学生记录
SELECT * FROM stu
WHERE name LIKE 'z%';
-- 查询姓名中包含"a"的学生记录
SELECT * FROM stu
WHERE name LIKE '%a%';
(2)_:表示任意单个字符。可匹配单个任意字符,常用来限制表达式的字符长度。示例如下
-- 查询姓名由5个字母构成,且第5个字母为“i”的学生记录
SELECT * FROM stu
WHERE sname LIKE '_ _ _ _ _i';
-- 查询姓名中第2个字母为“i”的学生记录
SELECT * FROM stu
WHERE sname LIKE '_i%';
4. 字段控制查询
(1)对查询结果去重
若查询的结果中在某一列(或某几列)上有重复值,可以使用distinct语句进行去重,具体如下
SELECT DISTINCT 列名1,列名2,...
FROM 表名;
(2)字段加运算
若查询得到的某两列(或多列)均为数值型,则可以做加运算。具体如下
SELECT 列名1+列名2+... AS 别名
FROM 表名;
【注意】如果相加的某列中存在空值null,则其与任何数值相加仍然是null。为了解决这一问题,可以把null转化为数值0。具体如下
SELECT 列名1+IFNULL(列名2, 0) AS 别名
FROM 表名;
5. SQL函数大全(重要)
1)聚合函数
聚合函数是用来做纵向(列)运算的函数,常用的聚合函数及其用法如下
(1)COUNT():统计指定列不为NULL的记录行数。例如
-- 查询emp表中月薪大于2500的人数
SELECT COUNT(*)
FROM employee
WHERE sal > 2500;
(2)SUM():计算指定列的数值和,如果指定列类型不是数值类型,则会直接略过该列所在行。例如
-- 查询所有雇员月薪和id之和
SELECT SUM(sal+id) AS 别名
FROM emp;
【注】在上述代码中,若某一行的sal为null但id非null,则也不会将该行的id一起求和。
(3)AVG():计算指定列的平均值,同SUM()一样,若指定列不是数值类型,则会直接略过。例如
-- 查询所有员工的平均工资
SELECT AVG(sal)
FROM emp;
【注】假设emp有10行,其中2行为null,则AVG()会直接略过这两行,分母为8而不是10。
(4)MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算。
(5)MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算。
例如
-- 查询最高工资和最低工资
SELECT MAX(sal), MIN(sal)
FROM emp;
2)转换函数
SQL中的转换函数有两种,即CONVERT(类型(长度), 字段名, style)和CAST(字段名 AS 类型(长度))
例如:
-- 将student表中的字段stuno改为varchar(10)的类型
-- 解法1
SELECT CONVERT(varchar(10), stuno) AS stuno, stuname
FROM student;
-- 解法2
SELECT CAST(stuno AS varchar(10)) AS stuno, tsunami
FROM student;
【注】CAST和CONVERT都是用来将一种数据类型转换为另一种数据类型的函数,功能相同,语法不同。但是,在时间转换中,一般使用CONVERT,因为CONVERT多了一个可选参数style,可以将转换得到的时间/日期以不同的格式来展示。例如
SELECT CONVERT(VARCHAR(19),GETDATE());
SELECT CONVERT(VARCHAR(10),GETDATE(),10);
SELECT CONVERT(VARCHAR(10),GETDATE(),110);
SELECT CONVERT(VARCHAR(11),GETDATE(),6);
SELECT CONVERT(VARCHAR(11),GETDATE(),106);
SELECT CONVERT(VARCHAR(24),GETDATE(),113);
以上各个语句输出结果分别为:
(该例子来自菜鸟联盟)
CONVERT()中style参数的可取值和效果如下所示(来自菜鸟联盟):
3)日期和时间函数
在SQL中,不能对日期数据执行算数函数,得使用专门的日期函数。常用的日期函数有:
- CURDATE()或CURRENT_DATE():获取当前的系统日期;
- CURTIME()或CURRENT_TIME():获取当前的系统时间;
- NOW():获取当前的系统日期和时间;
- DATE_ADD(date, INTERVAL n keyword):表示在日期date上增加n*keyword,例如DATE_ADD(CURRENT_DATE(), INTERVAL 5 DAY)表示在当前日期加上5天;
- DATEDIFF(日期计数部分, date1, date2):表示date2和date1之间相差多少个日期计数部分,例如DATEDIFF(m, '2024-7-17', '2024-8-17'),返回值为1,表示这两个日期之间相差1个月;
- YEAR(date):返回date中的年份数值;
- MONTH(date):返回date中的月份数值;
- DAY(date):返回date中的天数值;
- HOUR(time):返回time的小时值;
- MINUTE(time):返回time的分钟值;
- DAYOFWEEK(date):返回date是一周中的第几天;
- DAYOFMONTH(date):返回date是一个月中的第几天;
- DAYOFYEAR(date):返回date是一年中的第几天;
- DAYNAME(date):返回date在一周中的星期名,例如DAYNAME(CURDATE())返回“星期三”;
- MONTHNAME(date):返回date的月份名,例如MONTHNAME(CURDATE())返回“七月”;
- QUARTER(date):返回date是一年中的第几个季度;
- WEEK(date):返回date是一年中的第几个周;
【注】SQL中日期的表示方法及有效范围如下所示:
日期部分 | 缩写 | 值 | 日期部分 | 缩写 | 值 |
年 | yy,yyyy | 1753-9999 | 周 | wk,ww | 1-53 |
季度 | qq,q | 1-4 | 小时 | hh | 0-23 |
月 | mm,m | 1-12 | 分钟 | mi,n | 0-59 |
一年中的天 | dy,y | 1-366 | 秒 | ss,s | 0-59 |
一月中的天 | dd,d | 1-31 | 毫秒 | ms | 0-999 |
一周中的天 | dw,w | 1-7 | 微秒 | mcs | 0-999 |
4)字符串函数
- ASCII(char):返回字符的ASCII码值;
- BIT_LENGTH(str):返回字符串的比特长度;
- CONCAT(str1, str2, ..., strn):将str1, str2, ... ,strn连接成一个字符串;
- CONCAT_WS(str1, str2, ..., strn):将str1, str2, ... ,strn连接成一个字符串,并用sep字符间隔;
- INSERT(str, x, y, instr)将字符串str从第x位置开始,y个字符长的子串替换为字符串instr;
- FIND_IN_SET(str, list)分析逗号分隔的list列表,如果发现str,返回str在list中的位置;
- LCASE(str)或LOWER(str)将str中的所有字符改为小写;
- UCASE(str)或UPPER(str)将str中的所有字符改为大写;
- LEFT(str,x)返回字符串str中最左边的x个字符;
- RIGHT(str,x)返回字符串str中最右边的x个字符;
- LENGTH(str)返回字符串str的长度;
- LTRIM(str)删除str开头的空格;
- RTRIM(str)删除str末尾的空格;
- TRIM(str)去除字符串开头和末尾的所有空格;
- POSITION(substr, str)返回子串substr在字符串str中第一次出现的位置;
- QUOTE(str)用反斜杠转义str中的单引号;
- REPEAT(str, x)返回字符串str重复x次的结果;
- REVERSE(str)返回颠倒字符串str的结果;
- STRCMP(s1, s2)比较字符串s1和s2;
- MID(str, start, length)从str中提取字符,从start位置开始(必填),length为可选项,若省略则默认返回从start位置开始的所有字符;
5)数学函数
- ABS(x)返回x的绝对值;
- BIN(x)返回x的二进制(OCT(x)返回八进制,HEX(x)返回十六进制);
- CEILING(x)返回大于x的最小整数值;
- FLOOR(x)返回小于x的最大整数值;
- EXP(x)返回e(自然对数的底)的x次方;
- GREATEST(x1,x2,...,xn)返回集合中最大的值;
- LEAST(x1,x2,...,xn)返回集合中最小的值;
- LN(x)返回x的自然对数;
- LOG(x, y)返回x的以y为底的对数;
- MOD(x, y)返回x/y的模(余数);
- PI()返回pi(圆周率)的值;
- RAND()返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值;
- ROUND(x, y)返回参数x的四舍五入的有y位小数的值,若省略y则默认返回整数;
- SIGN(x)返回代表数字x的符号的值;
- SQRT(x)返回一个数的平方根;
- TRUNCATE(x, y)返回数字x截短为y位小数的结果;
6)格式化函数
- FORMAT(column_name, format)对字段的显示按照format格式进行格式化,例如:
SELECT FORMAT(column_name, format)
FROM table_name;
-- 其中,format为规定的格式,必须指定。
-- 例:查询今年的年份
SELECT FORMAT(NOW(), 'yyyy') as YEAR
FROM table_name;
- DATE_FORMAT(date, format)对日期字段的显示按照format格式进行格式化 ;
- INET_ATON(ip)返回IP地址的数字表示;
- INET_NTOA(num)返回数字所代表的IP地址;
- TIME_FORMAT(time, format)对时间字段的显示按照format格式进行格式化;
7)条件操作函数
MySQL有5个函数可以用来进行条件操作,具体为
- 简单CASE函数,允许将表达式的值与一组不同的值进行匹配,具体语法为
CASE [表达式(可以是字段名或其他)]
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
...
WHEN 值n THEN 结果n
ELSE 结果n+1
END
- CASE搜索函数,允许执行更复杂的匹配,例如范围判断等,具体语法为
CASE
WHEN 判断条件1 THEN 值1
WHEN 判断条件2 THEN 值2
......
WHEN 判断条件n THEN 值n
ELSE 默认值
END
- IF(test, t, f)如果test为真,返回内容t,否则返回内容f;
- IFNULL(result1, result2)如果result1不是空则返回result1,否则返回result2;
- NULLIF(result1, result2)如果result1=result2则返回NULL,否则返回result1;
6. 表连接(重要)
SQL中,使用join子句(基于表之间的共同目标字段)把来自两个或多个表的行结合起来。
SQL中表连接的具体语法为
SELECT column1, column2, ...
FROM table1
INNER JOIN table2 --内连接
LEFT JOIN table2 --左连接
RIGHT JOIN table2 --右连接
FULL JOIN table2 --全连接
ON table1.key = table2.key;
(1)内连接
内连接inner join要求两个(或多个)表中至少有一个基于目标字段的匹配才能返回行。
(图源:菜鸟联盟)
(2)左连接
左连接left join(是左外链接left outer join的缩写)可以实现即使右表中没有匹配行,也从左表中返回所有的行(相应的右表中的对应字段为null)。
(图源:菜鸟联盟)
(3)右连接
右连接right join(是右外连接right outer join的缩写)可以实现即使左表中没有匹配行,也从右表中返回所有的行(相应的左表中的对应字段为null)。
(图源:菜鸟联盟)
(4)全连接
全连接full join(是全外连接full outer join的缩写)可以实现即使左右表中均没有匹配行,也返回左右表中所有的行(相应的在右表行中,左表的对应字段为null;在左表行中,右表的对应字段为null)。
(图源:菜鸟联盟)
(5)其他补充
- 在表连接中,不同表的匹配字段key不一定要是同一个字段,只要能够用于匹配即可。
- 要实现返回仅左表中存在而右表中不存在的行(如下图所示)则可以使用如下的语法来实现(图源:菜鸟联盟)
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2
ON table1.key = table2.key
WHERE table2.key IS NULL;
- 要实现返回仅右表中存在而左表中不存在的行(如下图所示)则可以使用如下的语法来实现(图源:菜鸟联盟)
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2
ON table1.key = table2.key
WHERE table1.key IS NULL;
- 要实现返回左右表不交叉的数据(如下图所示)则可以使用如下的语法来实现(图源:菜鸟联盟)
SELECT column1, column2, ...
FROM table1
FULL JOIN table2
ON table1.key = table2.key
WHERE table1.key IS NULL
OR table2.key IS NULL;
7. UNION操作符
SQL中,用于将两个或多个SELECT语句查询的结果按行进行拼接,使用该操作符时要求每个SELECT语句查询的结果要有相同数量的列。
其中,union操作符默认会去除重复的记录,如果需要保留所有重复记录,可以使用union all操作符。具体如下
SELECT column1, column2, ...
FROM table1
UNION (ALL)
SELECT column1, column2, ...
FROM table2;
8. SELECT INTO语法
SQL中,使用select into语法从一个表中选取(部分)数据并插入到另一个(新)表中。具体如下
SELECT column1, column2, ...
INTO 新表名
FROM 表名;
【注1】select into语法只是提供了一个将查询结果插入到新表中的方法,具体要查询哪些内容,可以依据DQL进行各种灵活的操作;
【注2】MySQL数据库不支持select...into语句,应改用insert into..select...语句,具体如下
INSERT INTO 新表名
SELECT column1, column2, ...
FROM 表名;
【注3】若要直接复制表的结构及数据,可以直接使用如下的简单操作
CREATE TABLE 新表名
AS
SELECT * FROM 旧表名;