一、使用 DML 语句
DML(Data Manipulation Language 数据操纵语言) 可以在下列条件下执行:
- 向表中插入数据
- 修改现存数据
- 删除现存数据
事务是由完成若干项工作的DML语句组成的
二、向表中插入数据
2.1.INSERT 语句语法
使用 INSERT 语句向表中插入数据:
使用这种语法一次只能向表中插入一条数据
2.2.插入数据
- 为每一列添加一个新值
- 按列的默认顺序列出各个列的值
- 在INSERT 子句中随意列出列名和他们的值
- 字符和日期型数据应包含在单引号中
INSERT INTO departments(department_id,department_name,manager_id,location_id)
VALUES (280,'Pub',100,1700)
INSERT INTO employees(employee_id,last_name,email,hiredate,job_id)
VALUES (300,'Augus','augus@163.com',DATE_FORMAT('2023/9/11','%Y-%m-%d'),'SA_REP')
2.3.向表中插入空值
- 隐式方式: 在列名表中省略该列的值。
- 显示方式: 在VALUES子句中指定空值。
2.4.插入指定的值
NOW()函数:记录当前系统的日期和时间。
INSERT INTO employees
(employee_id,first_name,last_name,email,phone_number,hiredate,job_id,salary,commission_pct,manager_id,department_id)
VALUES (301,'Louis','Popp','qewqewqw@163.com','15512344321',NOW(),'AC_ACCOUNT',6986,NULL,205,100)
2.5.从其它表中拷贝数据
在 INSERT 语句中加入子查询。
将employees表中部门ID为90的员工信息查询出来,插入到emp2表中
INSERT INTO emp2
SELECT * FROM employees WHERE department_id = 90;
注意:
- 不必书写 VALUES 子句。
- 子查询中的值列表应与 INSERT 子句中的列名对应
2.6.同时插入多行数据
INSERT INTO employees (employee_id,first_name,last_name,email,phone_number,job_id,salary,commission_pct,manager_id,department_id,hiredate) VALUES
(302,'Steven','K_ing','SKING','515.123.4567','AD_PRES',24000.00,NULL,NULL,90,'1992-04-03 00:00:00'),
(303,'Neena','Kochhar','NKOCHHAR','515.123.4568','AD_VP',17000.00,NULL,100,90,'1992-04-03 00:00:00'),
(304,'Lex','De Haan','LDEHAAN','515.123.4569','AD_VP',17000.00,NULL,100,90,'1992-04-03 00:00:00'),
(305,'Alexander','Hunold','AHUNOLD','590.423.4567','IT_PROG',9000.00,NULL,102,60,'1992-04-03 00:00:00'),
(306,'Bruce','Ernst','BERNST','590.423.4568','IT_PROG',6000.00,NULL,103,60,'1992-04-03 00:00:00')
如果是给表中所有字段都插入数据,则字段名可以省略不写
INSERT INTO employees
VALUES
(308,'Louis','Popp','qewqewqw@163.com','15512344321','AC_ACCOUNT',6986,NULL,205,100,NOW()),
(309,'Louis','Popp','qewqewqw@163.com','15512344321','AC_ACCOUNT',6986,NULL,205,100,NOW()),
(310,'Louis','Popp','qewqewqw@163.com','15512344321','AC_ACCOUNT',6986,NULL,205,100,NOW()),
(311,'Louis','Popp','qewqewqw@163.com','15512344321','AC_ACCOUNT',6986,NULL,205,100,NOW()),
(312,'Louis','Popp','qewqewqw@163.com','15512344321','AC_ACCOUNT',6986,NULL,205,100,NOW())
三、更新表中数据
3.1.UPDATE 语句语法
使用 UPDATE 语句更新数据:
注意:
- 可以一次更新多条数据。
- 如果需要回滚数据,需要保证在DML前,进行 设置:SET AUTOCOMMIT = FALSE; 如果需要回滚则执行 ROLLBACK 命令,回滚事务即可
3.2.更新数据
使用 WHERE 子句指定需要更新的数据。
如果省略 WHERE 子句,则表中的所有数据都将被更新
3.3.更新中的数据完整性错误
UPDATE employees
SET department_id=56
WHERE department_id = 110
执行SQL会报错:
1452 - Cannot add or update a child row: a foreign key constraint fails (myemployees.employees, CONSTRAINT dept_id_fk FOREIGN KEY (department_id) REFERENCES departments (department_id))
报错的原因是因为在执行UPDATE语句时,将department_id从110改为56,但是表departments中并没有department_id为56的记录(不存在56号部门),因此违反了外键约束。外键约束要求在更新或插入数据时,被参考的外键值必
四、从表中删除数据
4.1.DELETE 语句
使用 DELETE 语句从表中删除数据
4.2.删除数据
- 使用 WHERE 子句删除指定的记录:
- 如果省略 WHERE 子句,则表中的全部数据将被删除
4.3.删除中的数据完整性错误
DELETE FROM departments
WHERE department_id = 60
执行上面的SQL会报错
报错的原因是因为在执行DELETE语句时,删除了departments表中department_id为60的记录,而employees表中仍然存在department_id为60的记录,这违反了外键约束。外键约束要求在删除或更新数据时,被参考的外键值必须在关联表中存在,否则会触发约束失败的错误。