二、数据的操作(DML语句)
SQL语句的分类
1.DDL语句:数据定义语句
create,alter,drop,truncate
2.DML语句:数据操作语句
insert,delete,update,merge(合并)
3.TPL语句:事务控制语句
commit(提交),rollback(回滚)
4.DQL语句:数据查询语句
grant(赋予),revoke(收回),
DBA:数据管理员
(1)增加insert
语法:insert into 表名 values(值1,值2,...值n);必须按照顺序为每个列进行赋值
示例:insert into locs values('BJ','人民大会堂','CN');
(2)删除delete
语法:delete from 表名 ;删除表中所有的数据
delete from 表名 where 条件 根据条件删除表的数据
--删除locs表中loc列的值为‘SY’的数据
delete from locs where loc='SY';
(3)修改/更新 update
语法:update 表名 set 列1=新值1,列2=新值2,...列n=新值n where 条件 更新表中符合条件的数据为新值
示例:update locs set country=‘CN’,adress=‘新秀街2号A9楼’ where loc=‘SY’;
笔试/面试:
delete与truncate的区别?
delete是删除语句,属于DML语句,删除全部数据也根据条件删除部分数据,被delete删除的数据数据库会记录日志,可以恢复。
truncate是截断语句,属于DDL语句,截断表中所有数据(清空表),但保留表结果,被truncate截断的数据不可恢复
delete 和 drop 的区别?
delete是删除语句,属于DML语句,删除数据,不会影响表结构。
drop是删除语句,属于DDL语句,删除表,同时删除表结构和数据。
三、数据的基本查询
语法;select * from 表名;查询表中的所有数据
关于数值运算中的null值问题
MySQL提供了ifnull(expr1,expr2) 如果expr1的计算结果不是null,使用expr1的结果,如果expr1的计算结果是null,使用expr2的结果
Oracle提供了nvl(expr1,expr2) 如果expr1的计算结果不是null,使用expr1的结果,如果expr1的计算结果是null,使用expr2的结果
为列名起别名,使用空格或者AS关键字
select empno,ename,sal,comm,(sal+ifnull(comm,0))*12 income from emp;
select empno,ename,sal,comm,(sal+ifnull(comm,0))*12 as income from emp;
重复数据的筛选 distinct关键字去掉重复
select distinct 列1,列2...列n from 表名
distinct必须在select之后,第一个列之前,对“列1,列2...列n ”组合进行去重复操作
四.数据的筛选
select... from....where 条件
-- 查询在10号部门工作的员工信息
SELECT empno,ename,sal,deptno FROM emp WHERE deptno = 10;
-- 查询员工TOM的员工信息
在MySQL数据库中
SELECT * FROM emp WHERE BINARY ename = 'TOM'; TOM在数据库中必须严格匹配,需要严格区分大小写 只能查询出数据库中是TOM的数据
SELECT * FROM emp WHERE ename = 'TOM'; TOM在数据库中非严格匹配,不区分大小写 可以查询出数据库中是TOM,tom,Tom,tOm...的数据
在Oracle数据库中
SELECT * FROM emp WHERE ename = 'TOM'; TOM在数据库中必须严格匹配,需要严格区分大小写 只能查询出数据库中是TOM的数据
在Oracle数据库中
SELECT * FROM emp WHERE hiredate >= to_date('1994-01-01','yyyy-mm-dd') AND hiredate <= to_date('1994-12-31','yyyy-mm-dd');
Oracle中文环境下
SELECT * FROM emp WHERE hiredate >= '01-1月-1994' AND hiredate <= '31-12月-1994';
Oracle英文环境下
SELECT * FROM emp WHERE hiredate >= '01-JAN-1994' AND hiredate <= '31-DEC-1994';
在SQL语句中,多个条件组成筛选条件
AND 与关系 AND左侧和右侧的条件必须都成立
OR 或关系 OR左侧和右侧的条件满足其一即可
AND和OR的优先级
AND的优先级高于OR,如果出现一个SQL语句中同时有AND和OR,可以加(),()的优先级最高
五.特殊的比较运算符
- between A and B 在[A,B]之间,A和B的数据类型必须一致,正常:A <= B, A > B语法不错,但没有结果
相当于 >= A and <= B
通常使用在数字和日期的区间筛选
- like 好像... 用于文本类型数据的模糊查询
like配合两个转义字符完成模糊查询
%: 表示此处有任意个字符 [0,n]个字符 like '李%' 姓李的人
_ : 表示此处有1个字符 like '李_' 姓李的两字人名的人
-- 查询员工姓名中包含字母T的员工
SELECT * FROM emp
WHERE BINARY ename LIKE '%T%';
-- 查询员工姓名中包含两个字母O的员工
SELECT * FROM emp
WHERE BINARY ename LIKE '%O%O%';
-- 查询员工姓名倒数第二个字母是T的员工
SELECT * FROM emp
WHERE BINARY ename LIKE '%T_';
MySQL
SELECT * FROM emp
WHERE BINARY ename LIKE '%%%';
Oracle
SELECT * FROM emp
WHERE BINARY ename LIKE '%%%' escape '';
- in(A,B,C...)相当于 =A or =B or =C...
SELECT *
FROM emp
WHERE deptno IN(10,20,30) AND job = 'CLERK';
4.is null 专门用于null值的筛选
=null 在SQL中不能查询出任何结果
如果某些场合需要筛选null值,利用is null
-- 查询没有部门的员工
SELECT *
FROM emp
WHERE deptno IS NULL;
5.not 与前4个特殊比较运算符使用
= 对应 !=或<>
> 对应 <
-- 查询月薪不在[3000,4000]之间的员工信息
SELECT *
FROM emp
WHERE sal NOT BETWEEN 3000 AND 4000;
-- 名字中没有字母T的员工
SELECT *
FROM emp
WHERE ename NOT LIKE '%T%';
-- 查询不在10号和20号部门的员工
SELECT *
FROM emp
WHERE deptno NOT IN(10,20);
-- 查询不是BOSS的所有员工
SELECT *
FROM emp
WHERE mgr IS NOT NULL
-- order by 列 asc 按照这个列的数据进行升序排序(默认升序)
-- order by 列 desc 按照这个列的数据进行降序排序
-- 数字 升序:0,1,2,3.... 降序:7,6,5...
-- 文字 升序:按照字典顺序 降序:字典倒序
-- 日期 升序:过去->未来 降序: 未来->过去
-- 书写顺序:select...from...where...order by...
-- 执行顺序:from...where...select...order by...
-- 多表关联时,连接条件是意义相同的两个列,不一定是名字相同的两个列
-- 自连接
-- 查询员工ID,姓名和他的上司的员工ID和上司的姓名
-- 表的别名只能通过空格方式命名,不允许使用as
SELECT e1.empno,e1.ename,e2.empno,e2.ename
FROM emp e1 JOIN emp e2 ON(e1.mgr = e2.empno)
-- 练习:查询比自己上司入职日期早的员工姓名,上司姓名,员工入职日期,上司的入职日期
SELECT e1.ename, e2.ename,e1.hiredate, e2.hiredate
FROM emp e1 JOIN emp e2 ON(e1.mgr = e2.empno)
WHERE e1.hiredate < e2.hiredate;
-- 外连接
-- 左外连接 A left join B 显示A中的全部数据
-- 右外连接 A right join B 显示B中的全部数据
-- 全外连接(MySQL不支持 左+右) A full join B 显示A和B中的所有数据
-- 查询员工姓名,职位,月薪,所在部门
SELECT e.ename, e.job, e.sal, d.dname
FROM emp e
LEFT JOIN dept d ON(e.deptno = d.deptno)
SELECT e.ename, e.job, e.sal, d.dname
FROM emp e
RIGHT JOIN dept d ON(e.deptno = d.deptno)
-- oracle中可以使用(+)对外连接进行补齐操作
-- 在d表添加(+)可以补齐e表中null值对应的等值连接
SELECT *
FROM emp e. dept d
WHERE e.deptno = d.deptno(+);
-- oracle支持全外连接
SELECT e.ename, e.job, e.sal, d.dname
FROM emp e
FULL JOIN dept d ON(e.deptno = d.deptno);
-- MySQL实现全外连接,通过左外连接+右外连接的并集
SELECT e.ename, e.job, e.sal, d.dname
FROM emp e
LEFT JOIN dept d ON(e.deptno = d.deptno)
UNION
SELECT e.ename, e.job, e.sal, d.dname
FROM emp e
RIGHT JOIN dept d ON(e.deptno = d.deptno)
-- 交集(Oracle中)
SELECT e.ename, e.job, e.sal, d.dname
FROM emp e
LEFT JOIN dept d ON(e.deptno = d.deptno)
intersect
SELECT e.ename, e.job, e.sal, d.dname
FROM emp e
RIGHT JOIN dept d ON(e.deptno = d.deptno);
-- 查询全部员工姓名,职位,月薪,所在部门名称,办公地点
SELECT e.ename,e.job,e.sal,d.dname,l.adress
FROM emp e
LEFT JOIN dept d ON (e.deptno = d.deptno)
LEFT JOIN locs l ON(d.loc = l.loc);