数据操DML的增删改查数据记录 增删改查数据流图
connygpt 2024-10-25 11:35 8 浏览
DML
数据操纵语言(DML)DML用于插入、修改、删除数据记录,包括如下SQL语句:
INSERT:添加数据到数据库中
UPDATE:修改数据库中的数据
DELETE:删除数据库中的数据
一、插入数据
1、语法
INSERT INTO 表名称 VALUES(值1,值2,......); |
INSERT INTO 表名称 VALUES(值1,值2,......),(值1,值2,......),...; |
INSERT INTO 表名称 (字段1,字段2,......) VALUES(值1,值2,......); |
INSERT INTO 表名称 (字段1,字段2,......) VALUES(值1,值2,......),(值1,值2,......),.....; |
2、说明
1、值得顺序、个数与字段列表中字段的顺序、个数一致
(1)如果个数少了就报Column count doesn’t match value count
(2)如果VALUES前面的()中没有列出字段,那么默认就是为表中的所有字段赋值,那么个数与顺序与表结构中字段定义的一致
2、关于自增长列,默认值列,允许为NULL列的赋值
(1)如果字段列表列出了字段名,那么值列表中就要为其赋值,哪怕它是自增长列,有默认值列,可以为NULL值的列。
InnoDB表的自动增长列可以手动插入合适的值,但是插入的值如果是NULL或者0,则实际插入的将是自动增长后的值;
如果列声明了“默认约束”那么对应的位置可以赋值具体的值,也可以使用“DEFAULT”,表示使用默认值;
如果列允许了NULL值,那么可以为对应的字段可以赋值为具体值也可以赋值为NULL
(2)对于没有列出的字段,像自增列就自动赋值,像默认值列就自动赋默认值,像允许NULL的列就自动赋NULL值
3、VALUES也可以写成VALUE,但是VALUES是标准写法
4、可以同时插入多行
5、如果插入从表的数据,要注意查看主表参照字段的值是否存在
6、值的位置可以是常量值、表达式、函数
3、示例
练习(一)
CREATE TABLE t_stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(100) NOT NULL,
gender CHAR NOT NULL DEFAULT '男',
card_id CHAR(18) NOT NULL UNIQUE,
birthday DATE,
address VARCHAR(200)
);
INSERT INTO t_stu VALUES(1,'张三',DEFAULT,'123456789012345678','1989-09-09',NULL);
INSERT INTO t_stu VALUES(2,'李四','女','123456789012345677','1988-09-09','尚硅谷');
INSERT INTO t_stu VALUES(0,'王五','男','123456789012345676','1987-09-09','尚硅谷');
INSERT INTO t_stu VALUES(NULL,'赵六','男','123456789012345675','1987-09-09','尚硅谷');
INSERT INTO t_stu VALUES
(NULL,'冰冰','女','123456789012345674','1988-09-09','尚硅谷'),
(NULL,'小丽','女','123456789012345673','1988-09-09','尚硅谷');
INSERT INTO t_stu (sname,card_id,birthday)
VALUES('小薇','123456199012045672',STR_TO_DATE(SUBSTRING(card_id,7,8),'%Y%m%d'));
INSERT INTO t_stu (sname,card_id,birthday)VALUES
('小红','123456789012345671','1990-09-09'),
('小紫','123456789012345670','1990-09-09');
练习(二)
CREATE TABLE t_department(
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(100) NOT NULL,
description VARCHAR(200),
manager_id INT
);
INSERT INTO t_department(dname,description)
VALUES('教学部','技术培训'),
('咨询部','课程咨询服务');
CREATE TABLE `t_job` (
`job_id` INT(11) PRIMARY KEY AUTO_INCREMENT,
`job_name` VARCHAR(100) DEFAULT NULL,
`description` VARCHAR(200) DEFAULT NULL
);
INSERT INTO t_job VALUES
(NULL,'JavaSE讲师','Java基础'),
(NULL,'Web讲师','Web基础'),
(NULL,'JavaEE框架','框架讲解'),
(NULL,'课程顾问','课程咨询');
CREATE TABLE t_employee(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(100) NOT NULL,
gender CHAR NOT NULL DEFAULT '男',
card_id CHAR(18) UNIQUE,
tel CHAR(11),
job_id INT,
`mid` INT,
birthday DATE,
hiredate DATE,
address VARCHAR(100),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES t_department(did),
FOREIGN KEY (job_id) REFERENCES t_job(job_id)
);
INSERT INTO `t_employee`(`eid`,`ename`,`gender`,`card_id`,`tel`,`job_id`,`mid`,`birthday`,`hiredate`,`address`,`dept_id`)
VALUES (1,'孙红雷','男','123456789012345678','12345678901',1,NULL,'1990-01-01','2015-01-01','白庙',1),
(2,'张亮','男','123456789012345677','12345678902',2,NULL,'1990-01-02','2015-01-02','天通苑北',1),
(3,'鹿晗','男','123456789012345676','12345678903',3,NULL,'1990-01-03','2015-01-03','北苑',1),
(4,'邓超','男','123456789012345675','12345678904',2,NULL,'1990-01-04','2015-01-04','和谐家园',1),
(5,'孙俪','女','123456789012345674','12345678905',3,NULL,'1990-01-05','2015-01-05','霍营',1),
(6,'Angelababy','女','123456789012345673','12345678906',4,NULL,'1990-01-06','2015-01-06','回龙观',2);
CREATE TABLE t_salary(
eid INT PRIMARY KEY,
basic_salary DECIMAL(10,2),
performance_salary DECIMAL(10,2),
commission_pct DECIMAL(10,2),
deduct_wages DECIMAL(10,2),
FOREIGN KEY (eid) REFERENCES t_employee(eid)
);
INSERT INTO `t_salary`(`eid`,`basic_salary`,`performance_salary`,`commission_pct`,`deduct_wages`)
VALUES (1,'12000.00','6000.00','0.40','0.00'),
(2,'9000.00','5000.00','0.20',NULL),
(3,'11000.00','8000.00',NULL,NULL),
(4,'13000.00','5000.00',NULL,NULL),
(5,'8000.00','8000.00','0.30',NULL),
(6,'15000.00','6000.00',NULL,NULL);
二、修改数据
1、语法
UPDATE 表名称 SET 字段名1 = 值1, 字段名2=值2,...... 【WHERE 条件】;
UPDATE 表1,表2,...... SET 表1.字段名1 = 值1, 表1.字段名2=值2,表2.字段1 = 值1, 表2.字段2=值2...... 【WHERE 条件】;
2、说明
1、如果不写where条件,会修改所有行
2、值可以是常量值、表达式、函数
3、可以同时更新多张表
如果两个表没有建立外键,但逻辑上有外键关系
4、如果修改从表外键字段的数据,要注意查看主表参照字段的值是否存在
5、如果修改主表的被参考的字段的值,要注意查看从表的外键是否有依赖该值,如果有
(1)如果外键是on update RESTRICT或on update NO ACTION,那么要先处理从表的数据,才能修改
(2)如果外键是on update SET NULL 或 on update CASCADE,那么直接修改,从表的外键字段会自动处理
3、示例
#修改所有人的基本工资,涨薪5%
UPDATE t_salary
SET basic_salary = basic_salary * 1.05;
#修改"孙俪"的手机号码为"13709098765",生日为"1982-09-26"
UPDATE t_employee SET tel = '13709098765',birthday = '1982-09-26'
WHERE ename = '孙俪';
#修改"邓超"的入职日期为今天
UPDATE t_employee SET hiredate = CURDATE() WHERE ename ='邓超';
#修改"咨询部"的主管id为6
UPDATE t_department SET manager_id =6 WHERE did = 2;
#修改"教学部"的主管id为1
UPDATE t_department SET manager_id =1 WHERE did = 1;
#修改"教学部"的主管id为"孙红雷"的编号
UPDATE t_department,t_employee
SET t_department.manager_id =t_employee.eid
WHERE t_department.`dname` = '教学部'
AND t_department.`did` = t_employee.`dept_id`
AND t_employee.ename = '孙红雷';
#修改所有员工的领导编号为该员工所在部门的主管编号
UPDATE t_employee,t_department
SET t_employee.mid = t_department.manager_id
WHERE t_employee.dept_id = t_department.did;
#修改教学部的主管编号,以及该部门所有员工的领导编号为"邓超"的编号
UPDATE t_department,t_employee
SET t_department.manager_id =t_employee.eid
WHERE t_department.`dname` = '教学部'
AND t_department.`did` = t_employee.`dept_id`
AND t_employee.ename = '邓超';
UPDATE t_employee,t_department
SET t_employee.mid = t_department.manager_id
WHERE t_employee.dept_id = t_department.did
AND t_department.`dname` = '教学部';
三、删除数据
1、语法
delete from 表名 【where 条件】;
delete 表1,表2,....... from 表1,表2,...... 【where 条件】;
2、说明
1、如果不加where条件,表示删除整张表的数据,表结构保留。
delete from 表名;
删除整张表的数据还可以使用truncate 表名;
区别:
truncate相当于删除表再重建一张同名结构的表,操作后得到一张全新表,而delete是在原有表中删除数据。如果决定清空一张表的数据,truncate速度更快一些。
TRUNCATE语句不能回滚
2、如果删除主表的记录,要注意查看从表的外键是否有依赖该行的值,如果有
(1)如果外键是on delete RESTRICT或on delete NO ACTION,那么要先处理从表的数据,才能删除
(2)如果外键是on delete SET NULL 或 on delete CASCADE,那么删除时从表的对应记录也会被置空或跟着删除
3、可以一次删除多个表的数据
例如:两个表没有建立外键,但逻辑上有外键关系,也可以通过删除多个表的数据来实现级联删除
3、示例
#删除学号为9的学生信息
DELETE FROM t_stu WHERE sid = 9;
#注意:前提是没有外键或外键是on delete cascade
#删除所有“教学部”的员工信息和薪资信息和“教学部”部门信息
DELETE t_employee,t_department,t_salary
FROM t_employee,t_department,t_salary
WHERE t_department.`dname` ='教学部'
AND t_employee.`dept_id`=t_department.`did`
AND t_employee.`eid` = t_salary.eid;
四、查询
1、语法
SELECT 查询列表
FROM 表名或视图列表
【WHERE 条件表达式】
【GROUP BY 字段名 【HAVING 条件表达式】】
【ORDER BY 字段 【ASC|DESC】】
【LIMIT m,n】;
例如:
#查询表中的所有行所有列
#使用*表示,查询所有字段,即查询所有行
select * from t_stu;
#查询部分字段,查询部分列
select sname,major from t_stu;
#查询所有列,部分行
select * from t_stu where major = 'JavaEE';
#查询部分行,部分列
select sname,major from t_stu where major = 'JavaEE';
说明:
(1)如果SELECT后面是*,那么表示查询所有字段
(2)SELECT后面的查询列表,可以是表中的字段,常量值,表达式,函数
(3)查询的结果是一个虚拟的表
(4)select语句,可以包含5种子句:依次是where、 group by、having、 order by、limit必须照这个顺序。
2、别名AS
语法:AS 别名
说明:
(1)可以给字段取别名、可以给表名取别名
(2)AS 可以省略
(3)如果给字段取别名,如果别名中包含特殊符号,例如“空格”等,建议给别名加上双引号或单引号
(4)如果是给表名取别名,那么不能加双引号或单引号,也不能有特殊符号,例如“空格”等
(5)建议别名简短,见名知意
示例:
UPDATE t_department AS d,t_employee AS e
SET d.manager_id =e.eid
WHERE d.dname = '教学部'
AND d.did = e.`dept_id`
AND e.ename = '孙红雷';
#查询员工姓名以及手机号码
SELECT ename AS '员工姓名',tel AS '手机号码'
FROM t_employee;
3、去重DISTINCT
#查询员工表的部门编号
SELECT DISTINCT dept_id FROM t_employee;
#统计员工表中员工有几个部门
SELECT COUNT(DISTINCT dept_id) FROM t_employee;
4、`着重号`
例如:select `name` from t_stu;
可以给字段或表名加着重号
如果字段名或表名与关键字一样更要加着重号了
相关阅读:
相关推荐
- 3分钟让你的项目支持AI问答模块,完全开源!
-
hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...
- 干货|程序员的副业挂,12个平台分享
-
1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...
- Github标星超200K,这10个可视化面板你知道几个
-
在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...
- 开箱即用的炫酷中后台前端开源框架第二篇
-
#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...
- 搭建React+AntDeign的开发环境和框架
-
搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...
- 基于.NET 5实现的开源通用权限管理平台
-
??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...
- StreamPark - 大数据流计算引擎
-
使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...
- 教你使用UmiJS框架开发React
-
1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...
- 简单在线流程图工具在用例设计中的运用
-
敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...
- 【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单
-
这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...
- 聊聊规则引擎的调研及实现全过程
-
摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...
- 【开源推荐】Diboot 2.0.5 发布,自动化开发助理
-
一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...
- 微软推出Copilot Actions,使用人工智能自动执行重复性任务
-
IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...
- Electron 使用Selenium和WebDriver
-
本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...
- Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具
-
一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...
- 一周热门
- 最近发表
- 标签列表
-
- kubectlsetimage (56)
- mysqlinsertoverwrite (53)
- addcolumn (54)
- helmpackage (54)
- varchar最长多少 (61)
- 类型断言 (53)
- protoc安装 (56)
- jdk20安装教程 (60)
- rpm2cpio (52)
- 控制台打印 (63)
- 401unauthorized (51)
- vuexstore (68)
- druiddatasource (60)
- 企业微信开发文档 (51)
- rendertexture (51)
- speedphp (52)
- gitcommit-am (68)
- bashecho (64)
- str_to_date函数 (58)
- yum下载包及依赖到本地 (72)
- jstree中文api文档 (59)
- mvnw文件 (58)
- rancher安装 (63)
- nginx开机自启 (53)
- .netcore教程 (53)