MySQL——DML操作(插入、修改、删除、查询数据)

落爺英雄遲暮 提交于 2020-08-20 09:03:38

MySQL——DML操作(插入、修改、删除、查询数据)

知识大纲

  • DML概念
  • 插入数据
  • 修改数据
  • 删除数据
  • 查询数据

DML[数据操纵语言]

DML [Data Manipulation Language]

DML 用于插入、修改、删除数据记录,包括如下 SQL 语句:

INSERT:添加数据到数据库中

UPDATE:修改数据库中的数据

DELETE:删除数据库中的数据


插入数据

在这里插入图片描述

语法

INSERT INTO 表名称 VALUES(1,值 2,……); -- 1:[按建表列顺序]直接插入所有列的数据
INSERT INTO 表名称 VALUES(1,值 2,……),(1,值 2,……),;  -- 2:指定列名顺序插入全部或部分数据
INSERT INTO 表名称 (字段 1,字段 2,……) VALUES(1,值 2,……); -- 3:批量插入多条数据
INSERT INTO 表名称 (字段 1,字段 2,……) VALUES(1,值 2,……),(1,值
2,……),..;  -- 4:[指定列信息]批量插入多条数据

示例

#测试表
DROP TABLE IF EXISTS emps;
CREATE TABLE emps
(
		e_id VARCHAR(12),
		e_name VARCHAR(20),
		e_sex CHAR(2) NOT NULL,
		e_age INT,
		PRIMARY KEY(e_id),
		UNIQUE KEY(e_name)
);
SELECT * FROM emps;

#语法形式-1:[按建表列顺序]直接插入所有列的数据
#INSERT INTO 表名 VALUES(列1值,列2值,...,列n值);
INSERT INTO emps VALUES('E1001','唐僧','男',48);

#语法形式-2:指定列名顺序插入全部或部分数据
#INSERT INTO 表名(列名1,列名2,...,列名n) VALUES(列1值,列2值,...,列n值);
INSERT INTO emps(e_name,e_id,e_age,e_sex) VALUES('悟空','E1002',38,'男');
INSERT INTO emps(e_id,e_name,e_sex) VALUES('E1003','八戒','男');

#语法形式-3:批量插入多条数据
INSERT INTO emps VALUES
	('E1004','沙僧','男',18),
	('E1005','白龙马','男',8),
	('E1006','小龙女','女',6);
	
#语法形式-4:[指定列信息]批量插入多条数据
INSERT INTO emps(e_id,e_sex,e_name) VALUES
	('E1007','男','菩提老祖'),
	('E1008','男','牛魔王');

说明

(1)值的顺序、个数与字段列表中字段的顺序、个数一致

a.如果个数少了就报 Column count doesn’t match value count

b.如果 VALUES 前面的()中没有列出字段,那么默认就是为表中的所有字段赋值,那么 个数与顺序与表结构中字段定义的一致

(2)关于自增长列,默认值列,允许为 NULL 列的赋值

a.如果字段列表列出了字段名,那么值列表中就要为其赋值,哪怕它是自增长列,有 默认值列,可以为 NULL 值的列。

  • InnoDB 表的自动增长列可以手动插入合适的值,但是插入的值如果是 NULL 或 者 0,则实际插入的将是自动增长后的值;
  • 如果列声明了“默认约束”那么对应的位置可以赋值具体的值,也可以使用 “DEFAULT”,表示使用默认值;
  • 如果列允许了 NULL 值,那么可以为对应的字段可以赋值为具体值也可以赋值 为 NULL
#测试表 [测试自增列]
CREATE TABLE test1
(
		id INT PRIMARY KEY AUTO_INCREMENT,
		name VARCHAR(20)
)AUTO_INCREMENT 1001;
SELECT * FROM test1;

INSERT INTO test1 VALUES(NULL,'张三');
INSERT INTO test1 VALUES(0,'李四');
INSERT INTO test1 VALUES(1010,'王五');
INSERT INTO test1 VALUES(NULL,'赵六');
INSERT INTO test1(name) VALUES('孙七');

注意

上面的代码中 从line11开始王五的id为1010 后面插入的两行数据中的id在没有设置的情况下会跟着1010走而不是从1001开始增加

(3)VALUES 也可以写成 VALUE,但是 VALUES 是标准写法

(4)可以同时插入多行

(5)如果插入从表的数据,要注意查看主表参照字段的值是否存在

(6)值的位置可以是常量值、表达式、函数

#使用表达式(列值可以为:常量值、函数、表达式) 作为值进行插入
#测试表 [插入当前时间 (current_timestamp)]
CREATE TABLE test2
(
		id INT,
		name VARCHAR(20),
		times TIMESTAMP
);
SELECT * FROM test2;

INSERT INTO test2 VALUES(1001,'张三','2020-05-08 12:23:34');
INSERT INTO test2 VALUES(1002,'李四',current_timestamp);

插入数据的小练习

在这里插入图片描述

#课堂练习 [建表 并完成 插入测试]
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 DATETIME,
		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','阿里巴巴');

#测试在自增列 插入0值 [非合适的自增值 使用自增]
INSERT INTO t_stu VALUES(0,'王五','男','123456789012345676','1987-09-09','阿里巴巴');

#测试在自增列 插入NULL值 [非合适的自增值 使用自增]
INSERT INTO t_stu VALUES(NULL,'赵六','男','123456789012345675','1987-09-09','阿里巴巴');

#插入多行数据 [插入当前时间]
INSERT INTO t_stu VALUES
	(NULL,'冰冰','女','123456789012345674',current_timestamp,'阿里巴巴'),
	(NULL,'小丽','女','123456789012345673',current_timestamp,'阿里巴巴');

#插入指定列 [在值部分 使用函数]
/*
STR_TO_DATE('字符串','格式')	-	按指定格式将字符串转时间
SUBSTRING(列名,x,y)	-	截取指定列中 从x开始 y个长度的子串
SUBSTRING(123456199012045672,7,8) -> 19901204
*/
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');

SELECT * FROM t_stu;

修改数据

在这里插入图片描述

语法

#单表操作
UPDATE 表名称 SET 字段名 1 =1, 字段名 2=2,…… [WHERE 条件];
#多表操作
UPDATE1,表 2,…… SET1.字段名 1 =1,1.字段名 2=2,2.字段 1=1,2.字段 2=2…… [WHERE 条件];

示例

#单表更新操作
#将所有人的性别改'女'
UPDATE emps SET e_sex='女';

#将年龄为null的员工年龄设置为18岁
UPDATE emps SET e_age=18 WHERE e_age IS NULL;

#将所有所有人的年龄全部增加10岁
UPDATE emps SET e_age=e_age+10;

#多表更新操作
#将test1表中id为1012 和 test2表中id为1001的信息进行变更
UPDATE test1,test2 SET test1.name='王八',test2.name='张三他哥哥' WHERE
	test1.id=1012 AND test2.id=1001;

说明

  • 如果不写 where 条件,会修改所有行
  • 值可以是常量值、表达式、函数
  • 可以同时更新多张表

如果两个表没有建立外键,但逻辑上有外键关系

  • 如果修改从表外键字段的数据,要注意查看主表参照字段的值是否存在
  • 如果修改主表的被参考的字段的值,要注意查看从表的外键是否有依赖该值

如果从表的外键有依赖该值

  • 如果外键是 on update RESTRICT 或 on update NO ACTION,那么要先处理从表的数据,才能修改
  • 如果外键是 on update SET NULL 或 on update CASCADE,那么直接修改,从表的外键字段会自动处理

删除数据

在这里插入图片描述

语法

#删除单表数据
delete from 表名 [where 条件];
#删除多表数据
delete1,表 2,……. from1,表 2,…… [where 条件];
#删除表内容 [删除原表 创建新表 新表结果吻合原表结果]
TRUNCATE test2;

当你不再需要该表时, 用 drop;

当你仍要保留该表,但要删除所有记录时, 用 truncate;

当你要删除部分记录时(always with a WHERE clause), 用 delete.

示例

#删除单表数据
#将test2中编号大于1001的信息移除
DELETE FROM test2 where id>1001;


INSERT INTO test2 VALUES(1011,'张三的爷爷','2020-05-08 12:23:34');
#删除多表数据
#将test1、test2两表中编号大于等于1010的信息移除
DELETE test1,test2 FROM test1,test2 where test1.id>=1010 and test2.id>=1010;


#删除表内容
DELETE FROM test2;

#删除表内容 [删除原表 创建新表 新表结果吻合原表结果]
TRUNCATE test2;

说明

(1)如果不加 where 条件,表示删除整张表的数据,表结构保留。

delete from 表名;

删除整张表的数据还可以使用 truncate 表名;

区别:

truncate 相当于删除表再重建一张同名结构的表,操作后得到一张全新表,而 delete 是在原有表中删除数据。如果决定清空一张表的数据,truncate 速度更快一些。

TRUNCATE 语句不能回滚

(2)如果删除主表的记录,要注意查看从表的外键是否有依赖该行的值,如果有

a.如果外键是 on delete RESTRICT 或 on delete NO ACTION,那么要先处理从表的数据,才能删除

b.如果外键是 on delete SET NULL 或 on delete CASCADE,那么删除时从表的对应记录也会被置空或跟着删除

(3)可以一次删除多个表的数据

例如:两个表没有建立外键,但逻辑上有外键关系,也可以通过删除多个表的数据来 实现级联删除


查询

在这里插入图片描述

语法

SELECT 查询列表
FROM 表名或视图列表
【WHERE 条件表达式】
【GROUP BY 字段名 【HAVING 条件表达式】】
【ORDER BY 字段 【ASC(升序)|DESC(降序)】】
【LIMIT m,n】;

示例

#查询所有内容
SELECT * FROM emps;

#查询年龄大于30岁的员工的姓名
SELECT e_name,e_sex FROM emps WHERE e_age>30;

#查询列表中一般放置列名 但也可以加入其他内容[常量值 表达式 函数]
SELECT e_name as '员工 姓名',e_sex 性别,current_timestamp as '当前时间' FROM emps 
	WHERE e_age>30;

别名 AS

语法:

AS 别名

示例

#为表取别名
SELECT * FROM emps where e_age>=50;
SELECT * FROM emps e where e.e_age>=50; ---省略as

INSERT INTO test2 VALUES(1001,'张三','2020-05-08 12:23:34');
INSERT INTO test2 VALUES(1002,'李四','2020-05-08 12:23:34');
INSERT INTO test2 VALUES(1003,'李四','2020-05-08 12:23:34');
SELECT * FROM test2;

说明

(1)可以给字段取别名、可以给表名取别名

(2)AS 可以省略

(3)如果给字段取别名,如果别名中包含特殊符号,例如“空格”等,建议给别名加上双引号或单引号

(4)如果是给表名取别名,那么不能加双引号或单引号,也不能有特殊符号,例如 “空格”等

(5)建议别名简短,见名知意

去重 DISTINCT

使用DISTINCT关键字 去除重复值

#查询所有同学的姓名
SELECT name from test2;
#查询所有同学的姓名 [使用DISTINCT关键字 去除重复值]
SELECT DISTINCT name from test2;
#SELECT DISTINCT * from test2;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!