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 条件];
#多表操作
UPDATE 表 1,表 2,…… SET 表 1.字段名 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 条件];
#删除多表数据
delete 表 1,表 2,……. from 表 1,表 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;
来源:oschina
链接:https://my.oschina.net/u/4332858/blog/4497131