1. DDL
-
定义
Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段()。 -
数据库操作
-
查询所有数据库
sqlshow databases ; -
查询当前数据库
sqlselect database() ; -
创建数据库
sqlcreate database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序 规则 ] ;-
创建一个itcast数据库, 使用数据库默认的字符集。
sqlcreate database itcast;注意: 在同一个数据库服务器中,不能创建两个名称相同的数据库,否则将会报错。 可以通过if not exists 参数来解决这个问题,数据库不存在 , 则创建该数据库,如果存在,则不 创建。
sqlcreate database if not extists itcast;- 创建一个 itheima 数据库,并且指定字符集
sqlcreate database itheima default charset utf8mb4;
-
-
删除数据库
sqldrop database [ if exists ] 数据库名 ; -
切换数据库
sqluse 数据库名 ;
-
-
表操作
-
查询创建
-
查询当前数据库所有表
sqlshow tables; -
查询指定表结构
sqldesc 表名; -
查询指定表的建表语句
sqlshow create table 表名 -
创建表结构
sqlCREATE TABLE 表名( 字段1 字段1类型 [ COMMENT 字段1注释 ], 字段2 字段2类型 [COMMENT 字段2注释 ], 字段3 字段3类型 [COMMENT 字段3注释 ], ...... 字段n 字段n类型 [COMMENT 字段n注释 ] ) [ COMMENT 表注释 ] ;
-
-
数据类型
-
数值类型
类型 大小 有符号(SIGNED)范围 无符号(UNSIGNED)范围 描述 TINYINT 1 byte (-128, 127) (0, 255) 小整数值 SMALLINT 2 bytes (-32768, 32767) (0, 65535) 大整数值 MEDIUMINT 3 bytes (-8388608, 8388607) (0, 16777215) 大整数值 INT/INTEGER 4 bytes (-2147483648, 2147483647) (0, 4294967295) 大整数值 BIGINT 8 bytes (-2^63, 2^63-1) (0, 2^64-1) 极大整数值 FLOAT 4 bytes (-3.402823466 E+38, 3.402823466351 E+38) 0 和 (1.175494351 E-38, 3.402823466 E+38) 单精度浮点数值 DOUBLE 8 bytes (-1.7976931348623157 E+308, 1.7976931348623157 E+308) 0 和 (2.2250738585072014 E-308, 1.7976931348623157 E+308) 双精度浮点数值 DECIMAL 依赖于M(精度)和D(标度)的值 依赖于M(精度)和D(标度)的值 依赖于M(精度)和D(标度)的值 小数值(精确定点数) -
字符串类型
| 类型 | 大小 | 描述 |
| CHAR | 0-255 bytes | 定长字符串(需要指定长度) |
| VARCHAR | 0-65535 bytes | 变长字符串(需要指定长度) |
| TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
| TINYTEXT | 0-255 bytes | 短文本字符串 |
| BLOB | 0-65,535 bytes | 二进制形式的长文本数据 |
| TEXT | 0-65,535 bytes | 长文本数据 |
| MEDIUMBLOB | 0-16,777,215 bytes | 二进制形式的中等长度文本数据 |
| MEDIUMTEXT | 0-16,777,215 bytes | 中等长度文本数据 |
| LONGBLOB | 0-4,294,967,295 bytes | 二进制形式的极大文本数据 |LONGTEXT 0-4,294,967,295 bytes 极大文本数据 -
日期时间类型
-
-
修改
-
添加字段
为emp表增加一个新的字段"昵称"为nickname,类型为varchar(20)
sqlALTER TABLE emp ADD nickname varchar(20) COMMENT '昵称'; -
修改数据类型
sqlALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度); -
修改字段名和字段类型
将emp表的nickname字段修改为username,类型为varchar(30)sqlALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '昵称'; -
删除字段
将emp表的字段username删除sqlALTER TABLE emp DROP username; -
修改表名
将 emp 表的表名修改为 employeesqlALTER TABLE emp RENAME TO employee;
-
-
删除
-
删除表
如果tb_user表存在,则删除tb_user表sqlDROP TABLE IF EXISTS tb_user; -
删除指定表,并重新创建表
sqlTRUNCATE TABLE 表名;
-
-
2. DML
定义: DML(Data Manipulation Language)是数据库管理系统中用于操作数据的语言,属于SQL语言的子集。其主要功能是对数据库中的数据进行增、删、改、查操作。以下是DML的核心操作及示例:
-
数据查询(SELECT)
从表中检索数据:
sqlSELECT * FROM 员工表 WHERE 部门='研发部'; -
数据插入(INSERT)
向表中添加新记录:
sqlINSERT INTO 员工表 (姓名, 工号, 部门) VALUES ('张三', 'E1001', '研发部'); -
数据更新(UPDATE)
修改现有记录:
sqlUPDATE 员工表 SET 薪资=薪资*1.1 WHERE 绩效评级='A'; -
数据删除(DELETE)
移除记录:
sqlDELETE FROM 员工表 WHERE 离职状态=1;
注意:
- DML操作对象是数据本身(如记录内容),而非表结构
- 通常需要事务控制(如
COMMIT/ROLLBACK)保证数据一致性 - 与DDL(数据定义语言)的区别:
- DDL操作表结构(如
CREATE TABLE) - DML操作表内容(如
INSERT数据)
- DDL操作表结构(如
注:不同数据库系统(如MySQL、Oracle)的DML语法存在细节差异,但核心功能一致。
3. DQL
定义: DQL(Data Query Language)是 SQL 的核心组成部分,专门用于从数据库中检索数据,不涉及数据修改或结构变更。其核心是通过 SELECT 语句实现查询操作。以下是对您提到的内容进行补充,结构清晰、逐步展开。
- 基本语法
SELECT 语句的基本语法结构如下:
sql
SELECT 列名1, 列名2, ...
FROM 表名;
- SELECT :指定要检索的列名,使用
*表示所有列。 - FROM:指定要查询的表名。
- 示例:
SELECT name, age FROM users;检索用户表中的姓名和年龄。
- 条件查询
条件查询使用 WHERE 子句来过滤数据,基于指定条件返回结果。
sql
SELECT 列名
FROM 表名
WHERE 条件;
- 条件 :可以是比较表达式(如
age > 18)、逻辑运算符(如AND,OR)或模糊查询(如LIKE '%张%')。 - 示例:
SELECT * FROM orders WHERE amount > 100 AND status = 'paid';检索金额大于100且状态为已支付的订单。
- 聚合查询
聚合查询使用聚合函数对数据进行汇总计算,如求和、平均值等。
sql
SELECT 聚合函数(列名)
FROM 表名;
- 常用聚合函数 :
COUNT():统计行数,例如COUNT(*)。SUM():计算总和,例如SUM(amount)。AVG():计算平均值,例如AVG(score)。MAX()和MIN():获取最大值和最小值。
- 示例:
SELECT AVG(salary) FROM employees;计算员工平均工资。
- 分组查询
分组查询使用 GROUP BY 子句将数据按指定列分组,常与聚合函数结合。
sql
SELECT 列名, 聚合函数(列名)
FROM 表名
GROUP BY 列名;
- 说明 :
GROUP BY后跟分组列,SELECT 中的列必须是分组列或聚合函数。 - HAVING 子句 :用于对分组后的结果进行过滤,类似于
WHERE,但作用于分组。 - 示例:
SELECT department, COUNT(*) FROM employees GROUP BY department HAVING COUNT(*) > 5;按部门分组,统计每个部门的员工数,并筛选员工数大于5的部门。
- 排序查询
排序查询使用 ORDER BY 子句对结果集按指定列排序。
sql
SELECT 列名
FROM 表名
ORDER BY 列名 [ASC|DESC];
- ASC :升序(默认),DESC:降序。
- 可以按多列排序,用逗号分隔。
- 示例:
SELECT name, score FROM students ORDER BY score DESC;按分数降序检索学生姓名和分数。
- 分页查询
分页查询用于限制返回结果的数量,实现数据分页显示。不同数据库语法略有差异,常见使用 LIMIT 和 OFFSET。
sql
SELECT 列名
FROM 表名
LIMIT 行数 OFFSET 起始位置;
- LIMIT:指定返回的行数。
- OFFSET:指定跳过的行数(起始索引)。
- 在 SQL Server 中,使用
TOP和ROW_NUMBER();在 Oracle 中,使用ROWNUM。 - 示例:
SELECT * FROM products LIMIT 10 OFFSET 20;检索产品表第21到30行的数据(每页10条)。
- 案例
以下是一个综合案例,展示完整的 DQL 查询,包括条件、聚合、分组、排序和分页。
sql
SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY avg_salary DESC
LIMIT 5;
- 解释:查询2020年后入职的员工,按部门分组计算平均工资,筛选平均工资大于5000的部门,按平均工资降序排序,返回前5个结果。
- 执行顺序
SQL 查询的逻辑执行顺序不是按语句顺序,而是按以下步骤处理:
- FROM:首先确定查询的表。
- WHERE:应用条件过滤行。
- GROUP BY:将数据分组。
- HAVING:过滤分组后的结果。
- SELECT:选择列并计算表达式(包括聚合)。
- ORDER BY:对结果排序。
- LIMIT/OFFSET:应用分页限制。
- 注意 :实际执行可能因数据库优化而异,但逻辑顺序固定。例如,在
SELECT AVG(salary) FROM employees WHERE age > 30 GROUP BY department;中,先过滤年龄大于30的员工,再按部门分组计算平均工资。
4. DCL
定义:DCL(Data Control Language)是 SQL 语言的一个子集,主要用于定义和管理数据库用户的访问权限,确保数据库的安全性和数据的完整性。其主要功能包括:
-
授予权限 (
GRANT):-
用于向用户或角色授予对数据库对象(如表、视图、存储过程)的特定操作权限。
-
语法:
sqlGRANT <权限列表> ON <对象名称> TO <用户或角色列表> [WITH GRANT OPTION]; -
示例:
sql-- 授予用户 user1 对表 employees 的 SELECT 权限 GRANT SELECT ON employees TO user1; -- 授予角色 manager 对表 sales 的 SELECT, INSERT, UPDATE 权限,并允许该角色将权限授予他人 GRANT SELECT, INSERT, UPDATE ON sales TO manager WITH GRANT OPTION;
-
-
撤销权限 (
REVOKE):-
用于移除之前授予用户或角色的权限。
-
语法:
sqlREVOKE [GRANT OPTION FOR] <权限列表> ON <对象名称> FROM <用户或角色列表> [CASCADE | RESTRICT]; -
示例:
sql-- 撤销用户 user1 对表 employees 的 SELECT 权限 REVOKE SELECT ON employees FROM user1; -- 撤销角色 manager 对表 sales 的 INSERT 权限,并级联撤销由该角色授予的其他用户的 INSERT 权限 REVOKE INSERT ON sales FROM manager CASCADE;
-
权限查询
要查看当前用户或被管理用户的权限,通常需要查询数据库的系统视图(如 INFORMATION_SCHEMA 中的表,或特定数据库的系统表如 pg_catalog.pg_roles, sys.database_permissions 等)。通用性较高的方法是:
-
查看当前用户权限:
-
使用
SHOW GRANTS命令(具体语法和支持程度因数据库而异)。 -
示例 (MySQL/MariaDB 风格):
sqlSHOW GRANTS FOR CURRENT_USER; -
查询系统视图(更通用):
sql-- 示例:查询当前用户对某表的所有权限 (概念性查询,实际表名需替换) SELECT table_name, privilege_type FROM information_schema.table_privileges WHERE grantee = CURRENT_USER;
-
-
查看其他用户/角色的权限:
-
同样通过查询系统视图实现,通常需要管理员权限。
-
示例 (PostgreSQL 风格):
sql-- 查看角色 manager 的权限 SELECT * FROM pg_catalog.pg_roles WHERE rolname = 'manager'; -- 查看角色 manager 在表 sales 上的具体权限 SELECT * FROM information_schema.role_table_grants WHERE grantee = 'manager' AND table_name = 'sales';
-
关键概念
- 权限类型 : 常见的包括
SELECT(查询),INSERT(插入),UPDATE(更新),DELETE(删除),REFERENCES(引用约束),EXECUTE(执行存储过程),ALL PRIVILEGES(所有权限)。 - 对象级别: 权限可以授予在数据库、模式、表、视图、列、存储过程等不同级别的对象上。
WITH GRANT OPTION: 允许被授权者将获得的权限再授予其他用户/角色。撤销此类权限时需注意CASCADE选项的影响。- 角色 (
ROLE): 用于权限分组和管理。将权限授予角色,再将角色授予用户,简化权限管理。
注意事项:
- 权限管理是数据库安全的核心,需谨慎操作。
- 遵循最小权限原则,只授予必要的权限。
- 撤销权限时,
CASCADE选项会级联撤销所有依赖该权限的权限,可能影响范围较大,需特别注意。RESTRICT(默认) 则在有依赖时阻止撤销。