SQL基础知识
一、数据界说语言DDL(一)界说
数据界说语言(Data Definition Language, DDL),主要用来利用数据库和利用数据表格式。此中利用数据库主要包括创建数据库(create)、更新数据库(alter)和删除数据库(drop)。
(二)基础DDL语句
(1)对数据库的利用
1、创建数据库
SQL中使用create语句来创建数据库,具体语法为
CREATE DATABASE 数据库名; 由于数据库不可以重名,故添加,如果已有同名数据库则不重复利用。若不声明,当存在同名数据库时将报错。
2、删除数据库
SQL中使用drop语句来删除数据库,具体语法为
DROP DATABASE 数据库名; 使用时确保若不存在此数据库时也不报错,但对于打错数据库名导致没有删除精确的数据库时,添加该语句的方法并不好。
【留意】使用drop database删除数据库后,数据库中存储的全部数据表和数据都将一同被删除,而且无法规复。
3、修改数据库编码
SQL中使用如下语句来修改编码
ALTER DATABASE 数据库名 CHARACTER SET 编码名 【留意】SQL中全部的编码名不能使用“-”,例如UTF-8要写成UTF8。
(2)对数据表的利用
1、创建表
SQL使用create语句来创建数据表,具体语法示例为
CREATE TABLE 表名(
字段名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, ... ; 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); 以上各个语句输出结果分别为:
https://i-blog.csdnimg.cn/direct/e6976400d4934a88a7d181d34cbfe91b.png(该例子来自菜鸟同盟)
CONVERT()中style参数的可取值和结果如下所示(来自菜鸟同盟):
https://i-blog.csdnimg.cn/direct/b8ce256178ec4581b388d83868f5fc01.png
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-9999周wk,ww1-53季度qq,q1-4小时hh0-23月mm,m1-12分钟mi,n0-59一年中的天dy,y1-366秒ss,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要求两个(或多个)表中至少有一个基于目标字段的匹配才能返回行。
https://i-blog.csdnimg.cn/direct/938a1038ee6f4b0f96e25be6ab0817aa.png(图源:菜鸟同盟)
(2)左连接
左连接left join(是左外链接left outer join的缩写)可以实现即使右表中没有匹配行,也从左表中返回全部的行(相应的右表中的对应字段为null)。
https://i-blog.csdnimg.cn/direct/6b8fb593f1e5425e8cf4732cf71b7727.png(图源:菜鸟同盟)
(3)右连接
右连接right join(是右外连接right outer join的缩写)可以实现即使左表中没有匹配行,也从右表中返回全部的行(相应的左表中的对应字段为null)。
https://i-blog.csdnimg.cn/direct/d39576e5bcd949b7b9a804558b05d66d.png(图源:菜鸟同盟)
(4)全连接
全连接full join(是全外连接full outer join的缩写)可以实现即使左右表中均没有匹配行,也返回左右表中全部的行(相应的在右表行中,左表的对应字段为null;在左表行中,右表的对应字段为null)。
https://i-blog.csdnimg.cn/direct/de863fc941e74f1095b8e3551184038a.png(图源:菜鸟同盟)
(5)其他增补
[*]在表连接中,差别表的匹配字段key不一定要是同一个字段,只要能够用于匹配即可。
[*]要实现返回仅左表中存在而右表中不存在的行(如下图所示)则可以使用如下的语法来实现https://i-blog.csdnimg.cn/direct/7341e8edc2414792a3bc2486bfc2bfef.png(图源:菜鸟同盟)
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2
ON table1.key = table2.key
WHERE table2.key IS NULL;
[*]要实现返回仅右表中存在而左表中不存在的行(如下图所示)则可以使用如下的语法来实现https://i-blog.csdnimg.cn/direct/4ee403909e6643f59e1f71be4f7539b9.png(图源:菜鸟同盟)
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2
ON table1.key = table2.key
WHERE table1.key IS NULL;
[*]要实现返回左右表不交叉的数据(如下图所示)则可以使用如下的语法来实现https://i-blog.csdnimg.cn/direct/2e03b34520f84d17ac9d3b20044ff060.png(图源:菜鸟同盟)
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 旧表名;
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]