IT评测·应用市场-qidao123.com技术社区

标题: SQL基础知识 [打印本页]

作者: 莱莱    时间: 2024-10-2 00:36
标题: SQL基础知识
一、数据界说语言DDL

(一)界说

数据界说语言(Data Definition Language, DDL),主要用来利用数据库和利用数据表格式。此中利用数据库主要包括创建数据库(create)、更新数据库(alter)和删除数据库(drop)。
(二)基础DDL语句

(1)对数据库的利用

1、创建数据库

SQL中使用create语句来创建数据库,具体语法为
  1. CREATE DATABASE [IF NOT EXISTS] 数据库名;
复制代码
由于数据库不可以重名,故添加[if not exists],如果已有同名数据库则不重复利用。若不声明[if not exists],当存在同名数据库时将报错。
2、删除数据库

SQL中使用drop语句来删除数据库,具体语法为
  1. DROP DATABASE [IF EXISTS] 数据库名;
复制代码
使用[if exists]时确保若不存在此数据库时也不报错,但对于打错数据库名导致没有删除精确的数据库时,添加该语句的方法并不好。
【留意】使用drop database删除数据库后,数据库中存储的全部数据表和数据都将一同被删除,而且无法规复。
3、修改数据库编码

SQL中使用如下语句来修改编码
  1. ALTER DATABASE 数据库名 CHARACTER SET 编码名
复制代码
【留意】SQL中全部的编码名不能使用“-”,例如UTF-8要写成UTF8。
(2)对数据表的利用

1、创建表

SQL使用create语句来创建数据表,具体语法示例为
  1. CREATE TABLE [IF NOT EXISTS] 表名(
  2.    字段名1 字段类型 [字段属性][字段约束]
  3.    字段名2 字段类型 [字段属性][字段约束]
  4.    ......
复制代码
【增补1】MySQL中常用的数据类型:主要是三种,即文本(Text)、数字(Number)和日期/时间(Date/Time)类型。
1)文本(Text)类型:

2)数字(Number)类型:

【注】以上所述的size代表的只是表现的数字长度,并不是存储在数据库中的具体长度。例如,int(size)无论size为多少,均在磁盘上占用4btyes的存储空间。在表现上,例如:若int值为10,则int(4)表现结果为0010,int(3)表现结果为010。
3)日期(Date)类型:

【注】虽然DATETIME和TIMESTAMP返回相同的格式,但它们的工作方式差别。在INSERT或UPDATE查询中,TIMESTAMP主动把自身设置为当前的日期和时间。TIMESTAMP也接受差别的格式,如YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD。
【增补2】字段束缚:SQL中,建表时规定的束缚,若在插入数据时违反则会被终止插入。

2、查看表布局

表布局就是数据表包含哪些字段,各字段的字段名、字段类型和巨细等。对于差别的目标,可以使用差别的查询语句。
1)查询表的列信息

  1. DESC 表名;
  2. 或者
  3. DESCRIBE 表名;
  4. 或者
  5. SHOW COLUMNS FROM 表名;
复制代码
2)查询建表语句

  1. SHOW CREATE TABLE 表名;
复制代码
3)查询元数据

元数据是指界说数据布局的数据,如数据库名、表名、字段类型、外键束缚等。
  1. USE INFORMATION_SCHEMA
  2. SELECT * FROM columns WHERE table_name = '表名';
复制代码
3、更新表和字段布局

SQL中更新表和字段的布局主要用alter table语句,对字段布局的利用有增加字段add、更改字段类型modify、更改字段名及类型change和删除字段drop;修改表名使用rename to。
1)增加字段

SQL中用add语句添加表中的字段布局,具体语法为
  1. ALTER TABLE 表名 ADD(
  2.    新增字段名1 数据类型 约束
  3.    新增字段名2 数据类型 约束
  4. );
复制代码
2)更改字段类型

SQL中用modify来修改字段类型,具体语法为
  1. ALTER TABLE 表名 MODIFY 字段名 新字段属性;
复制代码
3)更改字段名和类型

SQL中用change来修改字段名,具体语法为
  1. ALTER TABLE 表名 CHANGE 旧字段名 新字段名 字段属性;
复制代码
4)删除字段

SQL中用drop来删除字段名,具体语法为
  1. ALTER TABLE 表名 DROP 字段名;
复制代码
5)修改表名

SQL中用rename to来修改表名,具体语法为
  1. ALTER TABLE 原表名 RENAME TO 新表名;
复制代码
4、删除表

SQL中删除表共有三种方法,drop、truncate和delete。
1)drop

用drop删除表会将表的内容和界说一并删除以释放空间,且该表的布局中被依靠的束缚(constrain)、触发器(trigger)和索引(index)也会被删除。依靠于该表的存储过程/函数将被保留,但状态会变为invalid。具体语法为
  1. DROP TABLE 表名;
复制代码
2)truncate

用truncate删除表只会清空表的内容,释放空间但会保留表的数据布局。具体语法为
  1. TRUNCATE TABLE 表名;
复制代码
3)delete

用delete来删除表中的行。且delete语句执行删除的过程是每次从表中删除一行,该行的删除利用会作为事务记载在日志中保存,以便进行回滚利用。
delete可以用where语句选择特定条件的行进行删除(属于DML的内容)。
且delete和truncate一样,只删除内容,保留表的数据布局。具体语法为
  1. DELETE FROM 表名 WHERE 字段名 = 某值;
复制代码
二、数据利用语言DML

(一)界说

数据利用语言(Data Manipulation Language, DML),主要用来对数据库中表的数据进行增加(insert)、删除(delete)和修改(update)。
(二)基础DML语句

(1)插入数据

SQL中用insert来向表中插入数据,主要有两种方法
方法一:
  1. INSERT INTO 表名 (列名1, 列名2, ...) VALUES (value1, value2, ...);
复制代码
使用该方法可以对表中的部门选定列进行数据插入利用,且不在列名集合内的字段值为null。
方法二:
  1. INSERT INTO 表名 VALUES (value1, value2, ...);
复制代码
该方法没有订定要插入的列,故按照创建表时列的序次插入列值,且不可以插入部门数据(存疑,必要实证一下);
【注】插入的全部字符串数据都必要用单引号('')引用。
(2)修改数据

SQL中用update来修改表中的数据,具体如下
  1. 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语句来创建用户,具体如下
  1. CREATE USER '用户名' @地址 IDENTIFIED BY '密码';
复制代码
【注】若给全部地址的用户授权,使用@'%'。
(2)用户授权

SQL使用grant语句来给用户授权,具体如下
  1. GRANT 权限1,权限2,... ON 数据库名.* TO '用户名'@地址;
  2. 其中,能给用户授予的权限有CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT等;
  3. 若要授予所有权限,则用
  4. GRANT ALL ON 数据库名.* TO '用户名'@地址;
复制代码
(3)撤销授权

SQL使用revoke语句来撤销给用户的授权,具体如下
  1. REVOKE 权限1,权限2,... ON 数据库名.* FROM '用户名'@地址;
复制代码
具体可以撤回的权限和撤回全部权限的方法与授权时完全相同。
(4)查看用户权限

SQL使用show grants语句来查看授权给用户的权限,具体如下
  1. SHOW GRANTS FOR '用户名'@地址;
复制代码
(5)删除用户

SQL使用drop语句来删除用户,具体如下
  1. DROP USER '用户名'@地址;
复制代码
(6)修改用户密码

SQL修改用户密码的利用必须以root身份执行,使用alter语句修改,具体如下
  1. ALTER USER ‘用户名’@地址 IDENTIFIED BY '新密码';
复制代码
三、数据查询语言DQL

(一)界说

数据查询语言(Data Query Language, DQL)。主要是对数据进行查询利用,且可以对于从数据库中查出的结果进行各种运算再最终展示。一般语法布局为
  1. SELECT 列名           --要查询的字段名称
  2. FROM 表名             --目标表名
  3. WHERE 条件            --查询的行条件
  4. GROUP BY 分组列        --对结果分组
  5. HAVING 分组条件        --分组后的行条件(满足该条件才最终展示)
  6. ORDER BY 排序列       --对结果进行排序(默认升序esc,降序为desc)
  7. LIMIT 起始行,总行数    --对所查询的结果进行行数的限定选择
复制代码
(二)具体查询语法

1. 基础查询

基础语法在(一)中已经论述,可以用
  1. SELECT * FROM 表名;
复制代码
来选去表中的全部列,“*”为通配符,代表全部列;
2. 条件查询

DQL在查询时,在WHERE字句中输入查询条件,常用的查询条件有
  1. -- 比较
  2. =、!=、<>、<、<=、>、>=;
  3. -- 范围选择
  4. BETWEEN ... AND ...;
  5. -- 集合判断
  6. IN(所需要筛选判断的集合);
  7. -- 判断(不)为空
  8. IS (NOT) NULL;
  9. -- 逻辑与
  10. AND
  11. -- 逻辑或
  12. OR
  13. -- 逻辑非
  14. NOT
复制代码
3. 模糊查询

模糊查询的一般语法为
  1. SELECT 字段
  2. FROM 表名
  3. WHERE 某字段 LIKE 条件
复制代码
对于like后的条件,SQL提供了两种匹配模式:
(1)%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,则需使用两个百分号(%%)表示。示例如下
  1. -- 查询姓名以"z"开头的学生记录
  2. SELECT * FROM stu
  3. WHERE name LIKE 'z%';
  4. -- 查询姓名中包含"a"的学生记录
  5. SELECT * FROM stu
  6. WHERE name LIKE '%a%';
复制代码
(2)_:表示任意单个字符。可匹配单个任意字符,常用来限制表达式的字符长度。示例如下
  1. -- 查询姓名由5个字母构成,且第5个字母为“i”的学生记录
  2. SELECT * FROM stu
  3. WHERE sname LIKE '_ _ _ _ _i';
  4. -- 查询姓名中第2个字母为“i”的学生记录
  5. SELECT * FROM stu
  6. WHERE sname LIKE '_i%';
复制代码
4. 字段控制查询

(1)对查询结果去重
若查询的结果中在某一列(或某几列)上有重复值,可以使用distinct语句进行去重,具体如下
  1. SELECT DISTINCT 列名1,列名2,...
  2. FROM 表名;
复制代码
(2)字段加运算
若查询得到的某两列(或多列)均为数值型,则可以做加运算。具体如下
  1. SELECT 列名1+列名2+... AS 别名
  2. FROM 表名;
复制代码
【留意】如果相加的某列中存在空值null,则其与任何数值相加仍然是null。为了解决这一题目,可以把null转化为数值0。具体如下
  1. SELECT 列名1+IFNULL(列名2, 0) AS 别名
  2. FROM 表名;
复制代码
5. SQL函数大全(紧张)

1)聚合函数

聚合函数是用来做纵向(列)运算的函数,常用的聚合函数及其用法如下
(1)COUNT():统计指定列不为NULL的记载行数。例如
  1. -- 查询emp表中月薪大于2500的人数
  2. SELECT COUNT(*)
  3. FROM employee
  4. WHERE sal > 2500;
复制代码
(2)SUM():盘算指定列的数值和,如果指定列类型不是数值类型,则会直接略过该列地点行。例如
  1. -- 查询所有雇员月薪和id之和
  2. SELECT SUM(sal+id) AS 别名
  3. FROM emp;
复制代码
【注】在上述代码中,若某一行的sal为null但id非null,则也不会将该行的id一起求和。
(3)AVG():盘算指定列的平均值,同SUM()一样,若指定列不是数值类型,则会直接略过。例如
  1. -- 查询所有员工的平均工资
  2. SELECT AVG(sal)
  3. FROM emp;
复制代码
【注】假设emp有10行,此中2活动null,则AVG()会直接略过这两行,分母为8而不是10。
(4)MAX():盘算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算。
(5)MIN():盘算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算。
例如
  1. -- 查询最高工资和最低工资
  2. SELECT MAX(sal), MIN(sal)
  3. FROM emp;
复制代码
2)转换函数

SQL中的转换函数有两种,即CONVERT(类型(长度), 字段名, style)和CAST(字段名 AS 类型(长度))
例如:
  1. -- 将student表中的字段stuno改为varchar(10)的类型
  2. -- 解法1
  3. SELECT CONVERT(varchar(10), stuno) AS stuno, stuname
  4. FROM student;
  5. -- 解法2
  6. SELECT CAST(stuno AS varchar(10)) AS stuno, tsunami
  7. FROM student;
复制代码
【注】CAST和CONVERT都是用来将一种数据类型转换为另一种数据类型的函数,功能相同,语法差别。但是,在时间转换中,一般使用CONVERT,由于CONVERT多了一个可选参数style,可以将转换得到的时间/日期以差别的格式来展示。例如
  1. SELECT CONVERT(VARCHAR(19),GETDATE());
  2. SELECT CONVERT(VARCHAR(10),GETDATE(),10);
  3. SELECT CONVERT(VARCHAR(10),GETDATE(),110);
  4. SELECT CONVERT(VARCHAR(11),GETDATE(),6);
  5. SELECT CONVERT(VARCHAR(11),GETDATE(),106);
  6. SELECT CONVERT(VARCHAR(24),GETDATE(),113);
复制代码
以上各个语句输出结果分别为:
(该例子来自菜鸟同盟)
CONVERT()中style参数的可取值和结果如下所示(来自菜鸟同盟):

3)日期和时间函数

在SQL中,不能对日期数据执行算数函数,得使用专门的日期函数。常用的日期函数有:

【注】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)字符串函数


5)数学函数


6)格式化函数


  1. SELECT FORMAT(column_name, format)
  2. FROM table_name;
  3. -- 其中,format为规定的格式,必须指定。
  4. -- 例:查询今年的年份
  5. SELECT FORMAT(NOW(), 'yyyy') as YEAR
  6. FROM table_name;
复制代码

7)条件利用函数

MySQL有5个函数可以用来进行条件利用,具体为

  1. CASE [表达式(可以是字段名或其他)]
  2. WHEN 值1 THEN 结果1
  3. WHEN 值2 THEN 结果2
  4. ...
  5. WHEN 值n THEN 结果n
  6. ELSE 结果n+1
  7. END
复制代码

  1. CASE
  2. WHEN 判断条件1 THEN 值1
  3. WHEN 判断条件2 THEN 值2
  4. ......
  5. WHEN 判断条件n THEN 值n
  6. ELSE 默认值
  7. END
复制代码

6. 表连接(紧张)

SQL中,使用join子句(基于表之间的共同目标字段)把来自两个或多个表的行结合起来。
SQL中表连接的具体语法为
  1. SELECT column1, column2, ...
  2. FROM table1
  3. INNER JOIN table2 --内连接
  4. LEFT JOIN table2  --左连接
  5. RIGHT JOIN table2 --右连接
  6. FULL JOIN table2  --全连接
  7. 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)其他增补

  1. SELECT column1, column2, ...
  2. FROM table1
  3. LEFT JOIN table2
  4. ON table1.key = table2.key
  5. WHERE table2.key IS NULL;
复制代码

  1. SELECT column1, column2, ...
  2. FROM table1
  3. RIGHT JOIN table2
  4. ON table1.key = table2.key
  5. WHERE table1.key IS NULL;
复制代码

  1. SELECT column1, column2, ...
  2. FROM table1
  3. FULL JOIN table2
  4. ON table1.key = table2.key
  5. WHERE table1.key IS NULL
  6. OR table2.key IS NULL;
复制代码
7. UNION利用符

SQL中,用于将两个或多个SELECT语句查询的结果按行进行拼接,使用该利用符时要求每个SELECT语句查询的结果要有相同数目的列。
此中,union利用符默认会去除重复的记载,如果必要保留全部重复记载,可以使用union all利用符。具体如下
  1. SELECT column1, column2, ...
  2. FROM table1
  3. UNION (ALL)
  4. SELECT column1, column2, ...
  5. FROM table2;
复制代码
8. SELECT INTO语法

SQL中,使用select into语法从一个表中选取(部门)数据并插入到另一个(新)表中。具体如下
  1. SELECT column1, column2, ...
  2. INTO 新表名
  3. FROM 表名;
复制代码
【注1】select into语法只是提供了一个将查询结果插入到新表中的方法,具体要查询哪些内容,可以依据DQL进行各种灵活的利用;
【注2】MySQL数据库不支持select...into语句,应改用insert into..select...语句,具体如下
  1. INSERT INTO 新表名
  2. SELECT column1, column2, ...
  3. FROM 表名;
复制代码
【注3】若要直接复制表的布局及数据,可以直接使用如下的简单利用
  1. CREATE TABLE 新表名
  2. AS
  3. SELECT * FROM 旧表名;
复制代码





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4