目录
3、在 system下查询 Scott 的 dept 表,登录的用户的权限要比被查的用户的权限大
一、SQL 简介
SQL 结构化查询语言
二、SQL 语言的分类
1、数据查询语言 (DQL)
select
2、数据操作/操纵 (DML)
insert、update、delete
3、数据定义语言 (DDL)
create、alter、drop、truncate(截断删除,删除表然后建立一个空表结构)
4、数据控制语言 (DCL)
grant(授予权力)、revoke(回收权力)
5、事物控制语言 (TCL)
commit(提交)、rollback(回)
三、数据查询语言
语法;select * |[distinct]列名 | 表达式 as 重命名/别名 from 表名 [where 条件];
1、查询全部
SELECT * FROM dept;
2、查询指定列
SELECT deptno,dname,loc FROM dept;
3、在 system下查询 Scott 的 dept 表,登录的用户的权限要比被查的用户的权限大
SELECT * FROM scott.dept;
4、带有条件的查询,具体数据用单引号
SELECT * FROM dept where deptno=30;
SELECT * FROM dept where deptno=30 and dname='SALES';
SELECT * FROM dept where deptno=40 or dname='SALES';
5、查询中的别名 特殊字符别名
--即中文要用双引号包裹
注: as 可以省略
SELECT deptno AS dno,dname "部门名称" FROM dept;
6、在查询中使用算数运算符
sal*12--表达式
SELECT ename "员工姓名",sal*12 "年薪" FROM emp;
7、使用 distinct 去重
SELECT job FROM emp; -- 有重复
SELECT distinct job FROM emp;
8、在查询中使用连接运算符(||)
即: ename || '是一个' || job---表达式
SELECT ename || '是一个' || job FROM emp;
四、单行函数
1、字符型单行函数
(1)lower (列\表达式)
作用:把字符串转换为小写 dual伪表,虚假的表为了满足语句需要,只能写这个
SELECT lower('ABCD') FROM dual;--表达式
SELECT lower(ename) FROM emp;--列
(2)upper(列\表达式)
作用:把字符串转换为大写
SELECT upper('aaasd') FROM dual; --表达式
SELECT upper(ename) FROM emp;--列
(3)concat(列1\表达式,列2\表达式)
作用:把两个字符串连接成一个
SELECT concat('abc','def') FROM dual;--表达式
SELECT concat(ename,job) FROM emp;--列
SELECT concat(ename,'123jjj') FROM emp;--表达式和列
(4)substr(列\表达式,m[,n])
作用:截取字符串
m代表截取的开始位置 ,n 代表截取的长度 下标从1开始
SELECT substr('abcdefg',4) FROM dual;--不指定长度
SELECT substr('abcdefg',4,2) FROM dual;--指定长度
(5)length(列\表达式)
作用:计算字符串中的字符个数,空格也算 ,返回个数
SELECT length('srdfghj') FROM dual;--表达式
SELECT length(ename) FROM emp;--列名
(6)instr(列\表达式,'字符串',m[,n])
作用:查找指定字符串的位置
SELECT instr('abcdefgh','de') FROM dual;
(7)replace(原字符串,被替换字符串,替换字符串)
作用:把一个字符串中的某部分替换掉
SELECT replace('abcdefg','cd','dc') FROM dual;
2、数字型单行函数
(1)round(num,i)
作用:可以用来指定小数位数,会四舍五入
SELECT round(5.16,1) FROM dual; --5.2
SELECT round(5.14,-1) FROM dual; --10 将5四舍五入
SELECT round(4.14,-1) FROM dual;--0 将4舍去为0
(2)trunc(num,i)
作用:用来指定位数不会四舍五入
SELECT trunc(3.76,1) FROM dual; --3.7 到达指定位数,不四舍五入
SELECT trunc(26.53,-1) FROM dual; -- 20到达指定位置,不入 6 舍弃
(3)mod(num1,num2)
作用:用来计算两个数的余数,不够除时,被除数就是余数
SELECT mod(5,3) FROM dual; --2 5/3=1....2
SELECT mod(6,10) FROM dual; --6 6/10 商不了
3、日期型单行函数
(1)sysdate
作用:获取当前系统时间,可以和整数做运算,这个整数代表天数
SELECT sysdate FROM dual; --获取时,当时的时间,不同地方会有地区时差
SELECT sysdate+1 FROM dual;--2024/4/11
SELECT sysdate+31 FROM dual; --超过日,加成月 2024/5/11
SELECT sysdate+5/24 FROM dual;-- 整数/24 加上小时数
--两个日期相加减,得到相差的天数
-- 日 月 年
SELECT to_date ('5-4月-24')-sysdate FROM dual;
--查看系统日期表示格式语言
SELECT userenv('lang') FROM dual;--ZHS 中文
(2)add_months(时间值,添加的月份值)
作用:用来在某个时间上加上 n 个月
-- 日 月 年
SELECT add_months('10-4月-24',3) FROM dual;
五、空值和空值函数
1、空值:
空值是没有意义,不确定的值
在数据库中用关键字 Null 表示空值
对空值进行判断时,用 is null 或 is not null
2、空值函数
(1)nvl(num1,num2)
作用:对空值进行处理,使其可以进行运算
如果 num1 是空值 ,则返回 num2;否则返回 num1
SELECT ename,nvl(comm,1) FROM emp;
(2)nvl2(num,n,m)
作用:nvl2 是 nvl 的功能增强函数
如果 num 为空返回 m;否则返回 n
SELECT ename,nvl2(comm,comm,) FROM emp;
-- 做运算 SELECT ename,nvl2(comm,comm+100,2500) FROM emp;
六、逻辑处理函数
1、case函数
如果 i 的值 为 a 那么就得 a1 的值
对一个列的操作 格式
case i when a than a1
when b than b1
when c than c1
...
else n
end
作用:判断 i 和 a 是否相等,相等则返回 a1;
否则在判断 i 和 b 是否相等,相等则返回 b1;
以此类推
如果都不相等,则返回 n
--eg
SELECT ename,job,
case job when 'ANALYST' then sal+100
when 'SALESMAN' then sal+200
when 'CLERK' then sal+300
else sal
end "涨后通知"
FROM emp;
2、decode 函数
--格式
decode(i,a,a1,
b,b1,
....,
defualt
)
decode函数和 case函数作用相同
先判断 i 和 a 是否相等,相等则返回 a1;
否则判断 i 和 b 是否相等,相等则返回 b1;
以此类推
都不相等则返回 defual 处指定的值
--eg
SELECT ename,job,
decode(job,'ANALYST',sal+100,
'SALESMAN',sal+200,
'CLERK',sal+300,
sal--defualt
)"涨后工资"
FROM emp;
七、分组函数
用于对多行数据进行处理
sum(), avg(), max(), min(), count(), group by(), having()
1、sum() 求和
SELECT sum(sal) FROM emp;
2、avg() 求平均值
SELECT avg(sal) FROM emp;
3、max() 求最大值
SELECT max(sal)FROM emp;
4、min() 求最小值
SELECT min(sal)FROM emp;
5、count() 计数,列的行数
SELECT count(*) "人数" FROM emp;
6、group by() 分组函数,分组查询
SELECT job,avg(sal) "平均工资" FROM emp GROUP BY job;
7、having :筛选(对分组之后进行二次筛选)
SELECT job,avg(sal) "平均工资" FROM emp GROUP BY job HAVING avg(sal)>2000;
八、数据操作语言
数据操作语言主要是对表中的数据进行增删改操作,非空字段添加
1、insert:增加
字段名省略表示全部列名===全部列名写出来
--语法:insert into 表名(字段名) values(字段值);
--eg
--sysdate 当前日期
INSERT INTO emp VALUES(7933,'李四','经理',7431,sysdate,3500,300,20);
INSERT INTO emp(empno,ename) VALUES(7935,'张三');
2、update:修改
--语法:update 表名 set 字段名=值,字段名=值 [where 条件];
--eg
UPDATE emp SET job='副总裁' WHERE empno=7933;
3、delete:删除
--语法:delete from 表名 [where 条件];
--eg
DELETE FROM emp where ename='李四';