文章目录
在MySQL中,DDL(数据定义语言)、DCL(数据控制语言)和DML(数据操作语言)是三种主要的SQL语言类别。然而,由于每种类别的语句数量有限,且部分语句在实际使用中可能较为罕见,因此我将为每个类别提供尽可能多且实用的语句实例,并附上相应的说明。但请注意,可能无法严格达到每个类别20个实例的要求。
DDL(数据定义语言)
DDL语句主要用于定义和管理数据库结构,包括创建、修改和删除数据库对象(如表、索引等)。
-
创建数据库
CREATE DATABASE mydb;
说明:创建一个名为
mydb
的数据库。 -
删除数据库
DROP DATABASE mydb;
说明:删除名为
mydb
的数据库。 -
创建表
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE );
说明:在
mydb
数据库中创建一个名为users
的表,包含id
、username
和email
字段。 -
删除表
DROP TABLE users;
说明:删除名为
users
的表。 -
修改表结构 - 添加字段
ALTER TABLE users ADD COLUMN age INT;
说明:在
users
表中添加一个名为age
的字段。 -
修改表结构 - 删除字段
ALTER TABLE users DROP COLUMN age;
说明:从
users
表中删除名为age
的字段。 -
修改表结构 - 修改字段类型
ALTER TABLE users MODIFY COLUMN username VARCHAR(100);
说明:将
users
表中的username
字段类型修改为VARCHAR(100)
。 -
修改表结构 - 重命名字段
ALTER TABLE users CHANGE COLUMN email mail VARCHAR(150);
说明:将
users
表中的email
字段重命名为mail
,并修改其类型为VARCHAR(150)
。 -
创建索引
CREATE INDEX idx_username ON users(username);
说明:在
users
表的username
字段上创建索引,以提高查询性能。 -
删除索引
DROP INDEX idx_username ON users;
说明:删除
users
表上的idx_username
索引。
(由于DDL语句数量有限,且部分高级用法不常用,以下仅列出部分额外实例)
-
创建视图
CREATE VIEW user_view AS SELECT id, username FROM users;
说明:创建一个名为
user_view
的视图,包含users
表中的id
和username
字段。 -
删除视图
DROP VIEW user_view;
说明:删除名为
user_view
的视图。 -
创建存储过程
DELIMITER // CREATE PROCEDURE AddUser(IN uname VARCHAR(50), IN uemail VARCHAR(100)) BEGIN INSERT INTO users(username, email) VALUES(uname, uemail); END // DELIMITER ;
说明:创建一个名为
AddUser
的存储过程,用于向users
表中插入新用户。 -
删除存储过程
DROP PROCEDURE AddUser;
说明:删除名为
AddUser
的存储过程。
(以下DDL语句较为罕见或特定于某些场景,因此简要列出)
15-20. (包含分区表创建、触发器创建与删除、事件调度器创建与删除等高级用法,由于篇幅限制,此处不详细展开,但可根据MySQL官方文档或相关教程获取具体实例)
DCL(数据控制语言)
DCL语句主要用于控制数据库的访问权限和安全级别。
-
授予用户权限
GRANT SELECT, INSERT ON mydb.* TO 'username'@'host' IDENTIFIED BY 'password';
说明:授予用户
username
在host
主机上使用密码password
登录,并对mydb
数据库具有SELECT
和INSERT
权限。 -
撤销用户权限
REVOKE SELECT, INSERT ON mydb.* FROM 'username'@'host';
说明:撤销用户
username
在host
主机上对mydb
数据库的SELECT
和INSERT
权限。 -
创建用户
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
说明:在本地主机上创建一个名为
newuser
的用户,并设置密码为password
。 -
删除用户
DROP USER 'newuser'@'localhost';
说明:删除本地主机上的
newuser
用户。 -
查看用户权限
SHOW GRANTS FOR 'username'@'host';
说明:查看用户
username
在host
主机上的权限。 -
修改用户密码
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
说明:修改用户
username
在host
主机上的密码为newpassword
。
(由于DCL语句相对有限,以下仅列出部分额外实例,部分可能涉及高级权限管理)
7-10. (包含授予/撤销特定表的权限、授予/撤销执行存储过程的权限等)
例如:
```sql
GRANT SELECT ON mydb.users TO 'readonlyuser'@'localhost';
REVOKE EXECUTE ON PROCEDURE mydb.AddUser FROM 'someuser'@'host';
```
11-20. (涉及角色管理、全局权限授予与撤销等高级用法,由于篇幅和复杂性限制,此处不详细展开)
DML(数据操作语言)
DML语句主要用于对数据库中的数据进行查询、插入、更新和删除操作。
-
插入数据
INSERT INTO users(username, email) VALUES('john', 'john@example.com');
说明:向
users
表中插入一条新记录。 -
查询数据
SELECT * FROM users;
说明:查询
users
表中的所有记录。 -
更新数据
UPDATE users SET email = 'john_new@example.com' WHERE username = 'john';
说明:更新
users
表中username
为john
的记录的email
字段。 -
删除数据
DELETE FROM users WHERE username = 'john';
说明:删除
users
表中username
为john
的记录。 -
条件查询
SELECT * FROM users WHERE age > 25;
说明:查询
users
表中年龄大于25岁的所有记录。 -
排序查询
SELECT * FROM users ORDER BY username ASC;
说明:按
username
字段升序查询users
表中的所有记录。 -
聚合查询
SELECT COUNT(*) FROM users;
说明:查询
users
表中的记录总数。 -
分组查询
SELECT gender, COUNT(*) FROM users GROUP BY gender;
说明:按
gender
字段分组查询users
表中的记录数。 -
连接查询(假设有
orders
表与users
表关联)SELECT users.username, orders.order_date FROM users INNER JOIN orders ON users.id = orders.user_id;
说明:通过内连接查询
users
表和orders
表,获取用户及其订单信息。 -
子查询
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE order_date > '2023-01-01');
说明:查询在
2023-01-01
之后有订单的所有用户。
当然,DML(Data Manipulation Language,数据操作语言)语句在涉及更复杂的查询和操作时会用到多种高级SQL特性,如联合查询(UNION)、窗口函数(Window Functions)等。下面是一些示例,展示如何在DML语句中结合这些高级特性。
联合查询(UNION)
联合查询用于合并两个或多个SELECT语句的结果集。每个SELECT语句必须有相同数量的列,并且相应的列必须具有兼容的数据类型。
-- 查询部门ID为10和20的所有员工信息
SELECT emp_id, emp_name, dept_id, salary
FROM employees
WHERE dept_id = 10
UNION
SELECT emp_id, emp_name, dept_id, salary
FROM employees
WHERE dept_id = 20;
使用窗口函数
窗口函数用于在结果集的行上执行计算,而不将结果集聚合为单个输出行。常见的窗口函数包括ROW_NUMBER()
, RANK()
, DENSE_RANK()
, NTILE()
, LEAD()
, 和 LAG()
等。
-- 查询每个部门的员工,并按薪水排序,同时显示员工的薪水排名
SELECT
emp_id,
emp_name,
dept_id,
salary,
RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS salary_rank
FROM employees;
联合查询结合窗口函数
将联合查询与窗口函数结合使用,可以实现更复杂的查询需求。例如,查询两个部门中每个员工的薪水排名,并合并结果。
WITH ranked_dept_10 AS (
SELECT
emp_id,
emp_name,
dept_id,
salary,
RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS salary_rank
FROM employees
WHERE dept_id = 10
),
ranked_dept_20 AS (
SELECT
emp_id,
emp_name,
dept_id,
salary,
RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS salary_rank
FROM employees
WHERE dept_id = 20
)
SELECT
emp_id,
emp_name,
dept_id,
salary,
salary_rank
FROM ranked_dept_10
UNION ALL
SELECT
emp_id,
emp_name,
dept_id,
salary,
salary_rank
FROM ranked_dept_20
ORDER BY dept_id, salary_rank;
复杂的DML操作:更新操作结合子查询和窗口函数
有时DML操作本身可能涉及复杂的子查询或窗口函数,虽然直接在UPDATE或DELETE语句中使用窗口函数不是所有数据库都支持,但可以通过CTE(Common Table Expressions)或临时表来实现。
-- 假设我们要更新薪水最低的5%的员工的薪水,增加10%
WITH low_salary_employees AS (
SELECT
emp_id,
salary,
NTILE(20) OVER (ORDER BY salary ASC) AS salary_tile
FROM employees
)
UPDATE employees
SET salary = salary * 1.10
WHERE emp_id IN (
SELECT emp_id
FROM low_salary_employees
WHERE salary_tile = 1
);
在这个例子中,我们使用了一个CTE来计算薪水最低的20个分组(NTILE(20)
),然后选择了最低的分组(salary_tile = 1
)进行更新。
总结
联合查询和窗口函数是SQL中的强大工具,可以显著增强查询的复杂性和功能。在实际应用中,合理使用这些特性可以极大地提高数据处理和分析的效率。
标签:username,salary,users,运维,DBA,查询,MySQL,id,SELECT From: https://blog.csdn.net/weixin_36518466/article/details/144293409