首页 > 数据库 >【MySQL运维DBA】【SQL基础系列002篇】

【MySQL运维DBA】【SQL基础系列002篇】

时间:2024-12-06 15:30:43浏览次数:10  
标签:username salary users 运维 DBA 查询 MySQL id SELECT

文章目录


在MySQL中,DDL(数据定义语言)、DCL(数据控制语言)和DML(数据操作语言)是三种主要的SQL语言类别。然而,由于每种类别的语句数量有限,且部分语句在实际使用中可能较为罕见,因此我将为每个类别提供尽可能多且实用的语句实例,并附上相应的说明。但请注意,可能无法严格达到每个类别20个实例的要求。

DDL(数据定义语言)

DDL语句主要用于定义和管理数据库结构,包括创建、修改和删除数据库对象(如表、索引等)。

  1. 创建数据库

    CREATE DATABASE mydb;
    

    说明:创建一个名为mydb的数据库。

  2. 删除数据库

    DROP DATABASE mydb;
    

    说明:删除名为mydb的数据库。

  3. 创建表

    CREATE TABLE users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(50) NOT NULL,
        email VARCHAR(100) UNIQUE
    );
    

    说明:在mydb数据库中创建一个名为users的表,包含idusernameemail字段。

  4. 删除表

    DROP TABLE users;
    

    说明:删除名为users的表。

  5. 修改表结构 - 添加字段

    ALTER TABLE users ADD COLUMN age INT;
    

    说明:在users表中添加一个名为age的字段。

  6. 修改表结构 - 删除字段

    ALTER TABLE users DROP COLUMN age;
    

    说明:从users表中删除名为age的字段。

  7. 修改表结构 - 修改字段类型

    ALTER TABLE users MODIFY COLUMN username VARCHAR(100);
    

    说明:将users表中的username字段类型修改为VARCHAR(100)

  8. 修改表结构 - 重命名字段

    ALTER TABLE users CHANGE COLUMN email mail VARCHAR(150);
    

    说明:将users表中的email字段重命名为mail,并修改其类型为VARCHAR(150)

  9. 创建索引

    CREATE INDEX idx_username ON users(username);
    

    说明:在users表的username字段上创建索引,以提高查询性能。

  10. 删除索引

    DROP INDEX idx_username ON users;
    

    说明:删除users表上的idx_username索引。

(由于DDL语句数量有限,且部分高级用法不常用,以下仅列出部分额外实例)

  1. 创建视图

    CREATE VIEW user_view AS SELECT id, username FROM users;
    

    说明:创建一个名为user_view的视图,包含users表中的idusername字段。

  2. 删除视图

    DROP VIEW user_view;
    

    说明:删除名为user_view的视图。

  3. 创建存储过程

    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表中插入新用户。

  4. 删除存储过程

    DROP PROCEDURE AddUser;
    

    说明:删除名为AddUser的存储过程。

(以下DDL语句较为罕见或特定于某些场景,因此简要列出)

15-20. (包含分区表创建、触发器创建与删除、事件调度器创建与删除等高级用法,由于篇幅限制,此处不详细展开,但可根据MySQL官方文档或相关教程获取具体实例)

DCL(数据控制语言)

DCL语句主要用于控制数据库的访问权限和安全级别。

  1. 授予用户权限

    GRANT SELECT, INSERT ON mydb.* TO 'username'@'host' IDENTIFIED BY 'password';
    

    说明:授予用户usernamehost主机上使用密码password登录,并对mydb数据库具有SELECTINSERT权限。

  2. 撤销用户权限

    REVOKE SELECT, INSERT ON mydb.* FROM 'username'@'host';
    

    说明:撤销用户usernamehost主机上对mydb数据库的SELECTINSERT权限。

  3. 创建用户

    CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
    

    说明:在本地主机上创建一个名为newuser的用户,并设置密码为password

  4. 删除用户

    DROP USER 'newuser'@'localhost';
    

    说明:删除本地主机上的newuser用户。

  5. 查看用户权限

    SHOW GRANTS FOR 'username'@'host';
    

    说明:查看用户usernamehost主机上的权限。

  6. 修改用户密码

    SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
    

    说明:修改用户usernamehost主机上的密码为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语句主要用于对数据库中的数据进行查询、插入、更新和删除操作。

  1. 插入数据

    INSERT INTO users(username, email) VALUES('john', 'john@example.com');
    

    说明:向users表中插入一条新记录。

  2. 查询数据

    SELECT * FROM users;
    

    说明:查询users表中的所有记录。

  3. 更新数据

    UPDATE users SET email = 'john_new@example.com' WHERE username = 'john';
    

    说明:更新users表中usernamejohn的记录的email字段。

  4. 删除数据

    DELETE FROM users WHERE username = 'john';
    

    说明:删除users表中usernamejohn的记录。

  5. 条件查询

    SELECT * FROM users WHERE age > 25;
    

    说明:查询users表中年龄大于25岁的所有记录。

  6. 排序查询

    SELECT * FROM users ORDER BY username ASC;
    

    说明:按username字段升序查询users表中的所有记录。

  7. 聚合查询

    SELECT COUNT(*) FROM users;
    

    说明:查询users表中的记录总数。

  8. 分组查询

    SELECT gender, COUNT(*) FROM users GROUP BY gender;
    

    说明:按gender字段分组查询users表中的记录数。

  9. 连接查询(假设有orders表与users表关联)

    SELECT users.username, orders.order_date FROM users INNER JOIN orders ON users.id = orders.user_id;
    

    说明:通过内连接查询users表和orders表,获取用户及其订单信息。

  10. 子查询

    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

相关文章

  • 【MySQL运维DBA】【SQL基础系列001篇】
    文章目录一、SQL简介二、(My)SQL使用入门(一)SQL分类(二)DDL语句(四)DCL语句三、帮助的使用(一)按照层次看帮助(二)快速查阅帮助(三)常用的网络资源四、查询元数据信息五、小结一、SQL简介SQL(StructuredQueryLanguage)即结构化查询语言,是一种用于管理关系型数据库的标......
  • Mysql8.0修改配置参数lower_case_table_names
    现象今天在配置一个环境的数据库,所使用的系统要求该数据库lower_case_table_names=1(对数据库表明、列名大小写不敏感)我看了一下,在Windows上,默认值为1。在macOS上,默认值是2。在Linux上,不支持值2;服务器会将该值设置为0。那0是不符合我们需求的,于是我打开my.cnf进......
  • 计算机毕业设计php购物商城在线购物网站奶茶商城饮品商城在线购物系统电子商务系统电
     一.功能介绍用户前台功能:前台主要包括网站首页、今日特卖、限时打折、商品中心、常见问题、我的购物车、登录、注册、商品详情,联系卖家,加入购物车、结算、个人中心等功能模块。今日特卖、限时打折、商品中心模块,用户可以查看全部商品信息,选择商品进行添加购物车等操作;购......
  • 第62篇 MySql常用命令集合
    1.分类2.数据库相关3.MySql服务及配置4.终端操作5.SQL基础6.修改密码及允许远程登录7.表相关8.SQL基础9.MySQL-Shell10.Select子句11.WHERE12.ANDORNOT13.DISTINCT14.IN15.BETWEEN16.LIKE17.REGEXP18.GROUPBY19.LIMIT20.UNION21.INT......
  • Python中的网络运维工具:从Ping到端口扫描
    《PythonOpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门!解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界网络运维是现代IT管理中至关重要的部分,它包括了对网络连接状态的监控、故障诊断和性能优化等多项工作。在日常网络运维中,Ping、端口扫描和流量......
  • 虚拟机centos7安装mysql8
    虚拟机centos7安装mysql8.x#删除系统仓库[root@localhost~]#rm-rf/etc/yum.repos.d/*#CentOS7更换阿里云软件仓库[root@localhost~]#wget-O/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com/repo/Centos-7.repo#下载mysql源安装包[root@localhos......
  • 虚拟机centos7安装mysql8
    虚拟机centos7安装mysql8.x#删除系统仓库[root@localhost~]#rm-rf/etc/yum.repos.d/*#CentOS7更换阿里云软件仓库[root@localhost~]#wget-O/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com/repo/Centos-7.repo#下载mysql源安装包[root@localhos......
  • 【MySQL 保姆级教学】事务的隔离级别(详细)--下(14)
    事务的隔离级别1.如何理解事务的隔离性2.事务隔离级别的分类3.查看和设置事务隔离级别3.1全局和会话隔离级别3.2查看和设置隔离级别4.事务隔离级别的演示4.1读未提交(ReadUncommitted)4.2读已提交(ReadCommitted)4.3可重复读(RepeatableRead)4.3.1为什么要有可......
  • PHPstudy中使用自带MySQL数据库的连接方法和配置环境(超详细实用分享)
    目录一.连接方法1.使用MySQL命令行进行连接2.使用MySQL-front连接?二,配置环境?1.目的2.配置操作?如果觉得本文对你有帮助的话,请点上一个免费的赞吧,之后还会继续分享更多干货?一.连接方法1.使用MySQL命令行进行连接首先启动phpstudy然后点击其他选项菜单—>网站......
  • Mysql中去除重复行
    有一张表,没有主键约束、唯一约束,有100条重复的数据,所有字段都相同。要求:不用临时表,不能删除该表,不创建新表,1条sql语句实现需求:我只要留下一条数据,其他的都删除,sql怎么写方式一:WITHRankedDataAS(SELECT*,ROW_NUMBER()OVER(PARTITIONBY字段1,字段2......