MySQL 11 章——数据处理之增删改

news/2025/1/7 21:50:21/

一、插入数据

(1)实际问题

  1. 如果我们要想表中插入新的记录,那么解决方式:使用INSERT语句向表中插入数据

(2)方式一:VALUES的方式添加

  1. 方式一就是一条一条地添加数据
  2. 演示代码:
    CREATE TABLE IF NOT EXISTS emp1(
    id INT,
    `name` VARCHAR(15),
    hire_date DATE,
    salary DOUBLE(10,2)
    );DESC emp1;SELECT * FROM emp1;INSERT INTO emp1 
    VALUES(1,'Tom','2000-12-21',3400);INSERT INTO emp1(id,hire_date,salary,`name`)
    VALUES(2,'1999-09-09',4000,'Jerry');
  3. 如果有的字段我们没有添加数据,那么: 
  4. 同时添加多个记录: 
  5. 一个同时插入多行数据的INSERT语句等同于多个单行插入的INSERT语句,但是多行的INSERT语句在处理过程中效率更高。因为MySQL执行单条INSERT语句插入多行数据,比使用多条INSERT语句快,所以在插入多条记录时,最好选择使用单条INSERT语句的方式插入 
  6. 字符和日期型数据应包含在单引号中 

(3)方式二:将查询结果插入到表中

  1. 演示代码:
    INSERT INTO emp1(id,`name`,salary,hire_date)
    #查询语句:
    SELECT employee_id,last_name,salary,hire_date
    FROM employees
    WHERE department_id IN(60,70);
  2. 这种方式要小心:要注意两张表中字段的数据类型,确保在添加数据时可以成功!

二、更新数据(修改数据)

  1. 演示代码:
    UPDATE emp1
    SET hire_date = CURDATE()
    WHERE id = 5;
  2. UPDATE可以实现批量修改数据,WHERE是过滤条件
  3. 同时修改一条数据的多个字段: 
  4. 修改数据时,是可能存在修改不成功的情况的(可能是由于约束的影响造成的)

三、删除数据

  1. 演示代码:
    DELETE FROM emp1
    WHERE id = 1;
  2. 在删除数据时,也有可能因为约束的影响,导致删除失败
  3. 小结:DML操作默认情况下,执行完以后都会自动提交数据。如果希望执行完以后不自动提交数据,则需要使用SET autocommit = FALSE;

四、MySQL8新特性:计算列

  1. 什么叫计算列呢?简单来说就是,某一列的值是通过别的列计算得来的。例如,a列值为1,b列值为2,c列不需要手动插入,定义a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的
  2. 在MySQL8.0中,CREATE TABLE和ALTER TABLE都支持增加计算列
  3. 演示代码:
    CREATE TABLE IF NOT EXISTS test1(
    a INT,
    b INT,
    c INT GENERATED ALWAYS AS (a + b) VIRTUAL #字段c即为计算列
    );INSERT INTO test1(a,b)
    VALUES (10,20);SELECT * FROM test1;UPDATE test1
    SET a = 100;  #会发现,a一经改动,c自动调整

五、综合案例

  1. 创建数据库test01_library
    CREATE DATABASE IF NOT EXISTS test01_library;
  2. 创建表 books,表结构如下:
    CREATE TABLE IF NOT EXISTS books(
    id INT,
    `name` VARCHAR(50),
    `authors` varchar(100),
    price FLOAT,
    pubdate DATE,
    note VARCHAR(100),
    num INT
    );
  3. 向books表中插入记录
    INSERT INTO books(id,`name`,`authors`,price,pubdate,note,num)
    VALUES
    (1,'Tal of AAA','Dickes',23,'1995','novel',11),
    (2,'EmmaT','Jane lura',35,'1993','joke',22),
    (3,'Story of Jane','Jane Tim',40,'2001','novel',0),
    (4,'Lovey Day','George Byron',20,'2005','novel',30),
    (5,'Old land','Honore Blade',30,'2010','Law',0),
    (6,'The Battle','Upton Sara',30,'1999','medicine',40),
    (7,'Rose Hood','Richard haggard',28,'2008','cartoon',28);
  4. 将小说类型(novel)的书的价格都增加5
    UPDATE books
    SET price = price + 5
    WHERE note = 'novel';
  5. 将名称为EmmaT的书的价格改为40,并将说明改为drama
    UPDATE books
    SET price = 40,note = 'drama'
    WHERE `name` = 'EmmaT';
  6. 删除库存为0的记录
    DELETE FROM books
    WHERE num = 0;
  7. 统计书名中包含a字母的书
    SELECT COUNT(*)
    FROM books
    WHERE `name` LIKE '%a%';
  8. 统计书名中包含a字母的书的数量和库存总量
    SELECT COUNT(*),SUM(num)
    FROM books
    WHERE `name` LIKE '%a%';
  9. 找出“novel”类型的书,按照价格降序排列
    SELECT *
    FROM books
    WHERE note = 'novel'
    ORDER BY price DESC;
  10. 查询图书信息,按照库存量降序排列,如果库存量相同的按照note升序排列
    SELECT *
    FROM books
    ORDER BY num DESC,note ASC;
  11. 按照note分类统计书的数量
    SELECT note,sum(num)
    FROM books
    GROUP BY note;
  12. 按照note分类统计书的库存量,显示库存量超过30本的
    SELECT note,sum(num)
    FROM books
    GROUP BY note
    HAVING sum(num) > 30;
  13. 查询所有图书,每页显示5本,显示第二页
    SELECT *
    FROM books
    LIMIT 5,5;
  14. 按照note分类统计书的库存量,显示库存量最多的
    SELECT note,sum(num)
    FROM books
    GROUP BY note
    limit 0,1;
  15. 查询书名达到10个字符的书,不包括里面的空格
    SELECT *
    FROM books
    WHERE CHAR_LENGTH(REPLACE(`name`,' ','')) >= 10;
  16. 查询书名和类型,其中note值为novel显示小说, law显示法律, medicine显示医药, cartoon显示卡通, joke显示笑话
    SELECT `name`,case note WHEN 'novel' THEN '小说'WHEN 'law' THEN '法律'WHEN 'medicine' THEN '医药'WHEN 'cartoon' THEN '卡通'WHEN 'joke' THEN '笑话'ELSE '其它' END
    FROM books;
  17. 查询书名、库存,其中num值超过30本的,显示滞销,大于0并低于10的,显示畅销,为0的显示需要无货
    SELECT `name`,CASE WHEN num > 30 THEN '滞销'WHEN num > 0 && num < 10 THEN '畅销'WHEN num = 0 THEN '无货'ELSE '正常' END "销售状态"
    FROM books;
  18. 统计每一种note的库存量,并合计总量
    SELECT IFNULL(note,'合计总量') "库存量",SUM(num)
    FROM books
    GROUP BY note 
    WITH ROLLUP;
  19. 统计每一种note的数量,并合计总量
    SELECT IFNULL(note,'合计总量') "库存量",COUNT(*)
    FROM books
    GROUP BY note
    WITH ROLLUP;
  20. 统计库存量前三名的图书
    SELECT *
    FROM books
    ORDER BY num DESC
    LIMIT 0,3;
  21. 找出最早出版的一本书
    SELECT *
    FROM books
    ORDER BY pubdate ASC
    LIMIT 0,1;
  22. 找出novel中价格最高的一本书
    SELECT *
    FROM books
    WHERE note = 'novel'
    ORDER BY price DESC
    LIMIT 0,1;
  23. 找出书名中字数最多的一本书,不含空格
    SELECT *
    FROM books
    ORDER BY CHAR_LENGTH(REPLACE(`name`,' ','')) DESC
    LIMIT 0,1;

六、课后练习一

  1. 创建数据库dbtest11
    CREATE DATABASE IF NOT EXISTS dbtest11;
  2. 运行以下脚本创建表my_employees和users
    CREATE TABLE my_employees(
    id INT(10),
    first_name VARCHAR(10),
    last_name VARCHAR(10),
    userid VARCHAR(10),
    salary DOUBLE(10,2)
    );CREATE TABLE users(
    id INT,
    userid VARCHAR(10),
    department_id INT
    );
  3. 显示表my_employees的结构
    DESC my_employees;
  4. 向my_employees表中插入下列数据
    INSERT INTO my_employees
    VALUES
    (1, 'patel', 'Ralph', 'Rpatel', 895),
    (2, 'Dancs', 'Betty', 'Bdancs', 860),
    (3, 'Biri', 'Ben', 'Bbiri', 1100),
    (4, 'Newman', 'Chad', 'Cnewman', 750),
    (5, 'Ropeburn', 'Audrey', 'Aropebur', 1550);
  5. 向users表中插入数据
    INSERT INTO users 
    VALUES
    (1, 'Rpate', 10),
    (2, 'Bdancs', 10),
    (3, 'Bbiri', 20),
    (4, 'Cnewman', 30),
    (5, 'Aropebur', 40);
  6. 将3号员工的last_name修改为“drelxer”
    UPDATE my_employees
    SET last_name = 'drelxer'
    WHERE id = 3;
  7. 将所有工资少于900的员工的工资修改为1000
    UPDATE my_employees
    SET salary = 100
    WHERE salary < 900;
  8. 将userid为Bbiri的user表和my_employees表的记录全部删除
    DELETE FROM my_employees
    WHERE userid = 'Bbiri';
    DELETE FROM users
    WHERE userid = 'Bbiri';
  9. 删除my_employees、users表所有数据
    DELETE FROM users;
    DELETE FROM my_employees;
  10. 检查所作的修正
    SELECT * 
    FROM users;SELECT *
    FROM my_employees;
  11. 清空表my_employees
    TRUNCATE TABLE my_employees;

七、课后练习二

  1. 使用现有数据库dbtest11
    USE dbtest11;
  2. 创建表格pet
    CREATE TABLE pet(
    name VARCHAR(20),
    owner VARCHAR(20),
    species VARCHAR(20),
    sex CHAR(1),
    birth YEAR,
    death YEAR
    );
  3. 添加记录
    INSERT INTO pet 
    VALUES
    ('Fluffy','harold','Cat','f','2003','2010'),
    ('Claws','gwen','Cat','m','2004',NULL),
    ('Buffy',NULL,'Dog','f','2009',NULL),
    ('Fang','benny','Dog','m','2000',NULL),
    ('bowser','diane','Dog','m','2003','2009'),
    ('Chirpy',NULL,'Bird','f','2008',NULL);
  4. 添加字段:主人的生日owner_birth DATE类型
    ALTER TABLE pet 
    ADD owner_birth DATE;
  5. 将名称为Claws的猫的主人改为kevin
    UPDATE pet 
    SET `owner` = 'kevin'
    WHERE `name` = 'Claws' AND species = 'Cat';
  6. 将没有死的狗的主人改为duck
    UPDATE pet 
    SET `owner` = 'duck'
    WHERE death IS NULL AND species = 'Dog';
  7. 查询没有主人的宠物的名字
    SELECT `name`
    FROM pet 
    WHERE `owner` IS NULL;
  8. 查询已经死了的cat的姓名,主人,以及去世时间
    SELECT `name`,`owner`,death
    FROM pet 
    WHERE death IS NOT NULL AND species = 'Cat';
  9. 删除已经死亡的狗
    DELETE FROM pet
    WHERE death IS NOT NULL AND species = 'Dog';
  10. 查询所有宠物信息
    SELECT * 
    FROM pet;

八、课后练习三 

  1. 使用已有的数据库dbtest11
    USE dbtest11;
  2. 创建表employee,并添加记录
    CREATE TABLE employee(
    id INT,
    NAME VARCHAR(15),
    sex CHAR(1),
    tel VARCHAR(25),
    addr VARCHAR(35),
    salary DOUBLE(10,2)
    );INSERT INTO employee 
    VALUES
    (10001,'张一一','男','13456789000','山东青岛',1001.58),
    (10002,'刘小红','女','13454319000','河北保定',1201.21),
    (10003,'李四','男','0751-1234567','广东佛山',1004.11),
    (10004,'刘小强','男','0755-5555555','广东深圳',1501.23),
    (10005,'王艳','男','020-1232133','广东广州',1405.16);
  3. 查询出薪资在1200~1300之间的员工信息
    SELECT *
    FROM employee
    WHERE salary >= 1200 AND salary <= 1300;
  4. 查询出姓“刘”的员工的工号,姓名,家庭住址
    SELECT id,`NAME`,addr
    FROM employee
    WHERE `NAME` LIKE '刘%';
  5. 将“李四”的家庭住址改为“广东韶关”
    UPDATE employee
    SET addr = '广东韶关'
    WHERE `NAME` = '李四';
  6. 查询出名字中带“小”的员工
    SELECT *
    FROM employee
    WHERE `NAME` LIKE '%小%';

http://www.ppmy.cn/news/1561380.html

相关文章

【C语言程序设计——文件】文件操作(头歌实践教学平台习题)【合集】

目录&#x1f60b; <第1关&#xff1a;文件操作1> 任务描述 相关知识 文件打开操作 文件读取操作 使用 fgetc() 函数读取单个字符&#xff1a; 使用 fgets() 函数读取一行字符&#xff1a; 文件写入操作 使用 fputc() 函数写入单个字符&#xff1a; 使用 fput…

SSH网络终端的概述及使用指南

以下是5个常用的SSH网络终端的概述、功能特点、下载地址和使用方法&#xff1a; PuTTY 概述&#xff1a;PuTTY是一款开源的SSH和Telnet客户端&#xff0c;以其轻量级和便捷性而广受欢迎。功能特点&#xff1a;支持多种协议&#xff0c;包括SSH、Telnet、rlogin和原始TCP连接。提…

排序算法的实现(插入,希尔,选择,冒泡,堆排,快排)

目录 1.选择排序 2.冒泡排序 3.堆排序 4.插入排序 5.希尔排序 6.快排 6.1快排的优化 6.2快排&#xff08;双指针法&#xff09; 6.3快排&#xff08;非递归&#xff09; 7.归并排序 7.1归并非递归 8.计数排序 1.选择排序 对n个元素进行选择排序&#xff0c;我们可以…

原型模式详解与实践

在软件开发的奇妙世界里&#xff0c;我们常常面临重复创建相似对象的任务。如果每次创建都要从头开始设置各种属性和状态&#xff0c;不仅繁琐&#xff0c;还可能降低效率。原型模式就像一位神奇的魔法师&#xff0c;为我们提供了一种通过复制现有对象来创建新对象的优雅方式。…

C语言的正则表达式

C语言中的正则表达式 引言 正则表达式是一种用于描述字符串模式的工具&#xff0c;它可以用来进行字符串匹配、查找、替换等操作。在编程中&#xff0c;正则表达式被广泛应用于数据验证、信息提取等场景。C语言虽然没有内置的正则表达式支持&#xff0c;但通过一些库我们同样…

【C++笔记】红黑树(RBTree)深度剖析和AVL树的对比分析

【C笔记】红黑树(RBTree)深度剖析和AVL树的对比分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】红黑树(RBTree)深度剖析和AVL树的对比分析前言一.红黑树的定义1.1 红黑树的概念1.2红黑树的规则1.3 红黑树对比A…

leetcode 2234. 花园的最大总美丽值

题目&#xff1a;2234. 花园的最大总美丽值 - 力扣&#xff08;LeetCode&#xff09; 1. 先对flowers进行升序排序&#xff0c;计算现有“完善花园”的数量minFull&#xff1b;如果没有&#xff0c;minFull为n。 2. 计算前缀和f[]。 3. 从i(minFull-1 to 0)枚举从第i个开始的…

《Opencv》基础操作详解(5)

接上篇&#xff1a;《Opencv》基础操作详解&#xff08;4&#xff09;-CSDN博客 目录 接上篇&#xff1a;《Opencv》基础操作详解&#xff08;4&#xff09;-CSDN博客 25、轮廓近似 简介 接口用法 参数说明 返回值 代码示例 结果展示 26、轮廓最小外接圆 简介 接口用…