• 【必会篇】日常测试工作中,有哪些必须知道的 SQL 语句?


    SQL简介

    • SQL(Structured Query Language,结构化查询语言)是一套用于管理关系数据库管理系统(RDBMS),基于ANSI(American National Standards
      Institute 美国国家标准化组织)标准的计算机语言,比较重要的版本是SQL92
    • 除了支持标准的SQL,各数据库产品厂商都有基于自己产品特性的SQL语言扩展,扩展部分相互之间并不兼容
    • 标准的SQL将针对数据进行操作的语句进行了分类,包括 数据定义语言(DDL,Data Definition Language) 数据操作语言(DML,Data Manipulation Language) 数据查询语言(DQL: Data Query Language) 数据控制语言(DCL,Data Control Language) 事务控制语言(TCL,Transaction Control Language) 指针控制语言(CCL,Cursor Control Language)

    通过上述的语言,基本可以完成一个关系型数据库的基本操作,大部分需要掌握

    数据定义语言(DDL)

    • 主要负责数据库、数据表、视图、键、索引等结构化的操作
    • 常用的语句有:CREATE DATABASE、CREATE TABLE、ALTER TABLE等
    • 字段的常用约束有:PRIMARY KEY、FOREIGN KEY、NOT NULL、UNIQUE、AUTO_INCREMENT、DEFAULT
    • 常用的数据定义语言示例如下
    1. -- 【1、数据库操作】
    2. -- 创建数据库
    3. -- 字符集:字符串存储方式;DEFAULT CHARACTER SET定义字符集,mb4就是most bytes 4的意思,兼容Emoji
    4. -- 校对规则:字符串比较方式;COLLATE定义校对规则,general表示遗留的校对规则,不可扩展,但效率高,ci(case insensitive)表示大小写不敏感
    5. -- 字符集和校对规则都有4个级别的设置:服务器级、数据库级、数据表级、字段级
    6. CREATE DATABASE IF NOT EXISTS db_demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    7. -- 删除数据库
    8. DROP DATABASE db_demo;
    9. -- 切换当前数据库
    10. USE db_demo;
    11. -- 【2、数据表操作】可以对数据表中的字段加上相应约束,常用的约束有:PRIMARY KEY、FOREIGN KEY、NOT NULL、UNIQUE、AUTO_INCREMENT、DEFAULT
    12. -- 示例操作产品表
    13. DROP TABLE IF EXISTS tb_product;
    14. CREATE TABLE tb_product
    15. (
    16. id INT NOT NULL AUTO_INCREMENT, -- 设置id列为非空、自增
    17. product_code CHAR(200) NOT NULL UNIQUE DEFAULT 'Normal', -- 设置编码列为非空、唯一、默认值为Normal
    18. product_name VARCHAR(50) NOT NULL,
    19. quantity INT(3) DEFAULT 0,
    20. price DECIMAL(6,2),
    21. address VARCHAR(50),
    22. remark VARCHAR(500),
    23. PRIMARY KEY (id), -- 指定主键列
    24. INDEX idx_product_name (product_name) -- 定义索引
    25. );
    26. -- 示例操作产品表
    27. DROP TABLE IF EXISTS tb_order;
    28. CREATE TABLE tb_order
    29. (
    30. id INT(10) NOT NULL AUTO_INCREMENT, -- 设置id列为非空、自增
    31. order_price DECIMAL(6,2),
    32. city VARCHAR(50),
    33. remark VARCHAR(500),
    34. product_id INT(10),
    35. PRIMARY KEY (id), -- 指定主键列
    36. FOREIGN KEY (product_id) REFERENCES tb_product(id) -- 指定外键id
    37. );
    38. -- 修改数据表
    39. ALTER TABLE tb_product
    40. ADD COLUMN description VARCHAR(2000), -- 添加列
    41. MODIFY COLUMN product_name VARCHAR(200) NULL, -- 修改列
    42. DROP COLUMN remark, -- 删除列
    43. CHANGE address city VARCHAR(20), -- 重命名字段
    44. ADD INDEX idx_product_code (product_code), -- 添加索引
    45. DROP INDEX idx_product_name; -- 移除索引
    46. -- 删除数据表
    47. DROP TABLE tb_product;
    48. DROP TABLE tb_order;
    49. -- 【3、视图操作】广泛应用于报表操作
    50. -- 创建视图
    51. CREATE VIEW v_product AS
    52. SELECT tb_product.id,tb_product.product_code,tb_product.product_name,tb_order.id as order_id,tb_order.order_price
    53. FROM tb_product LEFT JOIN tb_order ON tb_order.product_id = tb_product.id
    54. -- 修改视图
    55. ALTER VIEW v_product AS
    56. SELECT tb_product.id,tb_product.product_code,tb_product.product_name,tb_order.order_price
    57. FROM tb_product LEFT JOIN tb_order ON tb_order.product_id = tb_product.id
    58. -- 删除视图
    59. DROP VIEW v_product

    数据操作语言(DML)

    • 主要负责数据表数据的新增、修改、删除操作
    • 常用的语句有:INSERT INTO、UPDATE、DELETE等
    • 注意:修改和删除操作时注意添加WHERE条件
    • 常用的数据操作语言示例如下
    1. -- 新增数据,字段顺序、数据顺序一定要一致;非空列一定要有;类型也要匹配
    2. INSERT INTO tb_product(product_code,product_name,quantity,price,city,description)
    3. VALUES('tv','电视机',150,43.27,'长沙','这是一台计算机。');
    4. INSERT INTO tb_product(product_code,product_name,quantity,price,city,description)
    5. VALUES('iPhone','苹果手机',100,8999,'北京','这是一台苹果手机。');
    6. INSERT INTO tb_product(product_code,product_name,quantity,price,city,description)
    7. VALUES('xiaomi','小米手机',13,2999,'上海','这是一台小米手机。');
    8. INSERT INTO tb_product(product_code,product_name,quantity,price,city,description)
    9. VALUES('oppo','欧泊手机',70,2499,'广州','这是一台欧泊手机。');
    10. INSERT INTO tb_product(product_code,product_name,quantity,price,city,description)
    11. VALUES('vivo','维沃手机',98,2199,'深圳','这是一台维沃手机。');
    12. INSERT INTO tb_product(product_code,product_name,quantity,price,city,description)
    13. VALUES('tt','锤子手机',NULL,NULL,'上海','这是一台锤子手机。');
    14. INSERT INTO tb_order(order_price,city,remark,product_id) VALUES(7999,'天津','一次愉快的购买。',1);
    15. INSERT INTO tb_order(order_price,city,remark,product_id) VALUES(1555,'长沙','一次愉快的购买。',2);
    16. INSERT INTO tb_order(order_price,city,remark,product_id) VALUES(2800,'重庆','一次不愉快的购买。',4);
    17. INSERT INTO tb_order(order_price,city,remark,product_id) VALUES(1200,'杭州','重复购买。',4);
    18. INSERT INTO tb_order(order_price,city,remark,product_id) VALUES(1200,'武汉','下次再买。',5);
    19. select * from tb_product;
    20. select *
    21. -- 修改数据
    22. UPDATE tb_product SET description = CONCAT(description,'特价甩卖...');
    23. UPDATE tb_product SET description = CONCAT(description,'低到1块...') WHERE product_code='xiaomi';
    24. -- 删除数据
    25. DELETE FROM tb_product WHERE product_code='xiaomi';
    26. -- 删除全表数据
    27. DELETE FROM tb_order;
    28. DELETE FROM tb_product;
    29. TRUNCATE TABLE tb_product;

    数据查询语言(DQL)

    • 主要负责数据表数据的查询操作
    • 常用的语句有:SELECT,查询操作在SQL中使用非常多,还有一些复杂的如排序、多表查询、分组等处理
    • 常用的数据查询语言示例如下
    1. -- 【1、查询系统参数】
    2. -- 端口、目录、数据存放目录、服务器id
    3. SELECT @@port,@@basedir,@@datadir,@@server_id;
    4. -- 【2、查询常用函数】
    5. SELECT NOW(),USER(),CONCAT('同志们,','大家好!','欢迎光临。') AS welcome;
    6. -- 【3、查询条件】
    7. -- 查询所有
    8. SELECT * FROM tb_product;
    9. -- 按条件查询,可以使用运算符进行操作
    10. SELECT * FROM tb_product WHERE product_code ='iPhone';
    11. SELECT * FROM tb_product WHERE product_code like '%i%';
    12. SELECT * FROM tb_product WHERE quantity BETWEEN 50 AND 100;
    13. SELECT * FROM tb_product WHERE quantity IS NOT NULL;
    14. SELECT * FROM tb_product WHERE product_code in ('tt','xiaomi');
    15. -- 【4、排序】
    16. SELECT * FROM tb_product ORDER BY price DESC;
    17. SELECT * FROM tb_product ORDER BY product_code DESC;
    18. -- 【5、多表联合查询】
    19. -- 左连接
    20. SELECT * FROM tb_product LEFT JOIN tb_order ON tb_order.product_id = tb_product.id;
    21. -- 右连接
    22. SELECT * FROM tb_product RIGHT JOIN tb_order ON tb_order.product_id = tb_product.id;
    23. -- 完全连接
    24. SELECT * FROM tb_product JOIN tb_order ON tb_order.product_id = tb_product.id;
    25. -- 笛卡尔积连接
    26. SELECT * FROM tb_product,tb_order;
    27. -- 【6、分组】
    28. SELECT tb_order.product_id,tb_product.product_code,COUNT(1),SUM(tb_order.order_price),AVG(tb_order.order_price)
    29. FROM tb_order LEFT JOIN tb_product on tb_product.id = tb_order.product_id
    30. GROUP BY tb_order.product_id,tb_product.product_code
    31. HAVING COUNT(1)>1
    32. -- 【7、分页】
    33. SELECT * FROM tb_product;
    34. SELECT * FROM tb_product LIMIT 2,2; -- 起始、条数
    35. SELECT * FROM tb_product ORDER BY product_code LIMIT 3 OFFSET 2 ; -- 条数、偏移量
    36. -- 【8、UNION】
    37. -- UNION,会去重
    38. SELECT city FROM tb_product
    39. UNION
    40. SELECT city FROM tb_order;
    41. -- UNION ALL,不会去重
    42. SELECT city FROM tb_product
    43. UNION ALL
    44. SELECT city FROM tb_order;

    数据控制语言(DCL)

    • 主要负责用户创建、授权、权限回收操作,一般主要由DBA来操作
    • 常用的语句有:CREATE USER、GRANT、REVOKE等
    • 常用的数据控制语言示例如下
    1. -- 创建用户,localhost:只允许从本地ip访问;%:允许从所有的ip访问
    2. CREATE USER 'a1'@'%' IDENTIFIED BY 'Password^';
    3. -- 用户授权,权限可以包括、insert、update、delete、references、create、alter、drop、create view、execute等,多个用逗号分隔
    4. -- 尾部添加WITH GRANT OPTION,可让被授权者也能将这个权限授予其他人
    5. GRANT ALL PRIVILEGES ON db_demo.* TO 'a1'@'%' IDENTIFIED BY 'Password^'; -- 所有权限
    6. -- GRANT SELECT ON db_demo.* TO 'a1'@'%' IDENTIFIED BY 'Password^'; -- 只有查询权限
    7. -- 回收权限
    8. REVOKE INSERT ON db_demo.* from 'a1'@'%'; -- 回收新增权限
    9. -- 删除用户
    10. DROP USER 'a1'@'%';
    11. -- 刷新权限,配置完后都要刷新
    12. FLUSH PRIVILEGES;
    13. -- 查询表中数据
    14. select * from mysql.user
    15. -- 查看用户权限
    16. SHOW GRANTS FOR 'a1'@'%'

    事务控制语言(TCL)

    • 主要负责用多条语句形成原子性的事务操作
    • 常用的语句有:SET AUTOCOMMIT、ROLLBACK、COMMIT、SAVEPOINT等
    • 常用的事务控制语言示例如下
    1. -- 【方式1】
    2. -- 开启显式事务
    3. SET AUTOCOMMIT = 0;
    4. -- 查看数据
    5. SELECT * FROM tb_product;
    6. -- 插入一条数据
    7. INSERT INTO tb_product(product_code,product_name,quantity,price,description)
    8. VALUES('c10','n10',50,1523.58,'d10');
    9. -- DDL,会默认提交事务
    10. -- create table tb_demo
    11. -- (
    12. -- id INT,
    13. -- name VARCHAR(20)
    14. -- );
    15. -- 查看数据
    16. SELECT * FROM tb_product;
    17. -- 回滚显示事务
    18. ROLLBACK;
    19. -- 提交事务
    20. COMMIT;
    21. -- 查看数据
    22. SELECT * FROM tb_product;
    23. -- 关闭显式事务
    24. SET AUTOCOMMIT = 1;
    25. -- 【方式2】
    26. -- 开启事务
    27. START TRANSACTION;
    28. -- 查看数据
    29. SELECT * FROM tb_product;
    30. -- 插入一条数据
    31. INSERT INTO tb_product(product_code,product_name,quantity,price,description)
    32. VALUES('z1','z1',40,1223.58,'z1');
    33. -- 查看数据
    34. SELECT * FROM tb_product;
    35. -- 设置回滚点
    36. SAVEPOINT my_point;
    37. -- 插入另一条数据
    38. INSERT INTO tb_product(product_code,product_name,quantity,price,description)
    39. VALUES('z9','z9',40,1223.58,'z9');
    40. -- 查看数据
    41. SELECT * FROM tb_product;
    42. -- 回滚全部
    43. -- ROLLBACK;
    44. -- 回滚到回滚点
    45. ROLLBACK TO my_point;
    46. -- 查看数据
    47. SELECT * FROM tb_product;
    48. -- 提交结束事务
    49. COMMIT;

    指针控制语言(CCL)

    • 主要负责用于数据遍历的操作
    • 常用的语句有:DECLARE…CURSOR…、OPEN、FETCH…INTO…、CLOSE等
    • 常用的指针控制语言示例如下
    1. -- 创建存储过程
    2. -- 业务逻辑:取给定最小价格以上的产品总数
    3. CREATE PROCEDURE my_proc(IN min_price DECIMAL(7,2),OUT quantity_total INT)
    4. BEGIN
    5. -- 设置游标变量
    6. DECLARE _id INT;
    7. DECLARE _product_code VARCHAR(100);
    8. DECLARE _product_name VARCHAR(200);
    9. DECLARE _quantity INT;
    10. DECLARE _price DECIMAL(7,2);
    11. DECLARE _description VARCHAR(2000);
    12. -- 设置汇总数量
    13. DECLARE total INT DEFAULT 0;
    14. -- 标记默认为0
    15. DECLARE done INT DEFAULT 0;
    16. -- 【1、定义游标】
    17. DECLARE cursor_product CURSOR FOR SELECT id,product_code,product_name,quantity,price,description FROM tb_product WHERE price > min_price;
    18. -- #游标取完后的标志变量设置为1
    19. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1 ;
    20. -- 【2、打开游标】
    21. OPEN cursor_product;
    22. -- 【3、读取游标】取下一行
    23. FETCH cursor_product INTO _id,_product_code,_product_name,_quantity,_price,_description;
    24. -- 循环
    25. WHILE done !=1 DO
    26. SET total = total + _quantity;
    27. -- 【3、读取游标】取下一行
    28. FETCH cursor_product INTO _id,_product_code,_product_name,_quantity,_price,_description;
    29. END WHILE;
    30. -- 输出汇总
    31. -- SELECT total;
    32. SET quantity_total = total;
    33. -- 【4、关闭游标】
    34. CLOSE cursor_product;
    35. END;
    36. -- 调用
    37. CALL my_proc(35,@total);
    38. select @total;

    总结

    • SQL语言标准中,定义了很多的语句、关键字、函数等
    • 在日常的测试工作中,并不会都使用,掌握常用的基础语句即可,慢慢再扩展一些组合查询等复杂查询语句
    • 在上述的6种SQL语句分类中,一般只要熟悉并控制数据定义语言(DDL)数据操作语言(DML)数据查询语言(DQL)
    • 你会哪些呢?欢迎评论区讨论


     

  • 相关阅读:
    选择图像区域矩形框控件【原创】
    JavaScript实现在HTML中的粒子文字特效
    手写节流和防抖
    Matlab 中@ 的用法
    系列六、Nginx配置实例之反向代理2
    深入浅出RPC原理
    判断两个数a,b,输出较大数的平方值。所谓平方值就是两个相同的数相乘的积。
    springboot整合websocket上传文件
    高级数据结构——海量数据(位图,布隆过滤器)
    mybatis与spring集成
  • 原文地址:https://blog.csdn.net/a448335587/article/details/126713129