1.SQL语句的分类
-
DDL语句(数据定义语句)
主要用于定义数据库对象的SQL语句
数据库对象:表(table),列(column),视图(view),索引(index)...- create: 创建
- alter: 修改
- replace: 替换
- drop: 放弃(删除)
- truncate: 截断
-
DML语句(数据操作语句)
主要用于数据的变更- insert 插入(新增数据)
- update 更新(修改数据)
- delete 删除
- merage 合并
-
TCL语句(事务控制语句)
主要用于事务控制- commit 提交事务
- rollback 回滚事务
-
DQL语句(数据查询语句)
主要用于查询和检索数据- select 查询
-
DCL语句(数据控制语句)
主要用于数据库权限管理- grant 授权
- revoke 回收
2.DML语句(数据操作语句)
2.1 新增数据(insert)
向表中增加一条记录
-
为所有的列都赋值
INSERT INTO dept VALUES(1,'开发一部','沈阳');
- 为指定的列赋值
为指定的列进行赋值,未指定的列的值默认就是null
如果某个列是not null,则它必须被赋值
INSERT INTO dept(deptno,dname) VALUES(2,'开发二部');
- 一次插入多条数据(MySQL方言)(了解)
INSERT INTO dept VALUES(3,'开发三部','沈阳'),(4,'开发四部','沈阳');
2.2 删除数据(delete)
从表中移除一些数据
- 无条件删除(全删除)
DELETE FROM dept;
- 有条件删除 (根据设定条件进行删除)
- 删除deptno的值是4的部门记录
DELETE FROM dept WHERE deptno = 4;
- 删除loc的值是"沈阳"的部门记录
DELETE FROM dept WHERE loc = '沈阳';
- 逻辑-与 AND
X AND Y必须同时满足两个条件X和Y
删除loc是“北京”同时名字是“开发一部”的记录
DELETE FROM dept WHERE dname = '开发一部' AND loc = '北京'
- 逻辑-或 OR
X OR Y必须满足X和Y其中任一条件
删除loc是“北京”或者名字是“开发一部”的记录
DELETE FROM dept WHERE dname = '开发一部' OR loc = '北京'
- 逻辑-非 NOT
表示逻辑取反 X = 12 取反 X != 12 X <> 12
X > 12 取反 X <= 12
删除学生考试分数在[80,90]区间的记录
DELETE FROM student WHERE score >= 80 and score <= 90
DELETE FROM student WHERE score between 80 and 90;
删除学生考试分数不在[80,90]区间的记录
DELETE FROM student WHERE score < 80 or score > 90
DELETE FROM student WHERE score NOT between 80 and 90;
面试题:delete,drop和truncate的区别?
delete DML语句 表示删除表中数据,这个操作是可以恢复的
drop DDL语句 表示删除整张表,包含表结构, 不可恢复
truncate DDL语句 表示截断表,不删除表结构只清空数据, 数据不可恢复,删除速度快
2.3 修改数据(update)
修改表中一些数据
- 无条件修改(全表进行更新)
将dept表中所有数据的dname更新为“开发部”,loc更新为“北京”
UPDATE dept SET dname = '开发部',loc = '北京'
将emp表中所有数据的sal增加200
UPDATE emp SET sal = sal + 200
- 有条件修改(符合条件记录进行修改)
将dept表中的dname是“开发二部”的数据的loc设置为“北京”
UPDATE dept SET loc = '北京' WHERE dname = '开发二部'
3.事务的概念
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
比如说转账的例子是事务(101账号给102账号转账100)
update 账户 set 余额 = 余额 - 100 where 账号= 101
update 账户 set 余额 = 余额 + 100 where 账号= 102
两条SQL语句必须同时执行组成了一个完整的执行单元,必须同时成功
事务的四个特性
- 原子性:组成事务的这些SQL语句是一个整体,不可能继续划分
- 一致性:这些SQL语句要么同时成功,要么同时失败。不允许只成功一部分
- 隔离性:不同事务之间不能互相干扰
- 持久性:事务执行成功后,数据有效地保存
事务控制
set AutoCommit false; -- 关闭自动提交
update 账户 set 余额 = 余额 - 100 where 账号= 101;
update 账户 set 余额 = 余额 + 100 where 账号= 102;
commit; -- 手动提交
当执行commit时会将两个语句的执行结果同时执行到数据库中
set AutoCommit false; -- 关闭自动提交
update 账户 set 余额 = 余额 - 100 where 账号= 101;
update 账户 set 余额 = 余额 + 100 where 账号= 102;
rollback; -- 手动回滚
当执行rollback时会将两个语句的执行结果同时撤销,不会对数据库产生影响
4.查询数据准备
4.1 建表
- 创建location表
CREATE TABLE location (
locid varchar(64) NOT NULL,
adress varchar(128) DEFAULT NULL,
PRIMARY KEY (locid)
)
- 创建dept表
CREATE TABLE dept (
deptno int(8) NOT NULL,
dname varchar(64) NOT NULL,
loc varchar(64) DEFAULT NULL,
PRIMARY KEY (deptno)
)
- 创建emp表
CREATE TABLE emp (
empno int(8) NOT NULL,
ename varchar(64) NOT NULL,
job varchar(64) DEFAULT NULL,
mgr int(8) DEFAULT NULL,
hiredate date DEFAULT NULL,
sal int(8) DEFAULT NULL,
comm int(8) DEFAULT NULL,
deptno int(8) DEFAULT NULL,
PRIMARY KEY (empno),
KEY `FK_EMP_DEPTNO` (deptno),
CONSTRAINT `FK_EMP_DEPTNO` FOREIGN KEY (deptno) REFERENCES dept (deptno)
)
4.2 创建数据
- location表数据
insert into location(locid,adress) values ('BOSTON','110, NO.5 Street');
insert into location(locid,adress) values ('DALLAS','No.12 Farm');
insert into location(locid,adress) values ('NEW YORK','NO 121 Queen Street ');
- dept表数据
insert into dept(deptno,dname,loc) values (10,'RESEARCH','BOSTON');
insert into dept(deptno,dname,loc) values (20,'SALES','NEW YORK');
insert into dept(deptno,dname,loc) values (30,'MANAGE','DALLAS');
insert into dept(deptno,dname,loc) values (40,'HRD','NEW YORK');
- emp表数据
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1001,'TOM','PROGRAMER',1004,'1994-12-22',3800,NULL,10);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1002,'SMITH','PROGRAMER',1004,'1994-07-05',3500,NULL,10);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1003,'JACK','CLERK',1004,'1992-02-12',2500,NULL,10);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1004,'SCOTT','ANALIST',1007,'1992-01-15',4500,NULL,10);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1005,'ALEX','CLERK',1006,'1993-05-07',2800,NULL,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1006,'FORD','MANAGER',1007,'1994-07-05',4300,NULL,NULL);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1007,'KING','PESIDENT',NULL,'1992-01-01',7000,NULL,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1008,'MOON','MANAGER',1007,'1992-01-15',5000,1200,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1009,'TED','SALESMAN',1008,'1994-07-14',2500,1500,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1010,'JUCY','SALESMAN',1008,'1998-08-07',2200,800,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1011,'LEE','SALESMAN',1008,'1999-07-12',2200,500,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1012,'AMY','CLERK',1008,'1994-08-05',2200,NULL,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1013,'EMLIY','ANALIST',1007,'1996-06-29',4500,NULL,10);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1014,'ZORO','PROGRAMER',1013,'1995-10-11',3700,NULL,10);