SQL基础知识

一、数据定义语言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,yyyy1753-9999wk,ww1-53
季度qq,q1-4小时hh0-23
mm,m1-12分钟mi,n0-59
一年中的天dy,y1-366ss,s0-59
一月中的天dd,d1-31毫秒ms0-999
一周中的天dw,w1-7微秒mcs0-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 旧表名;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值