记录学数据库过程中遇到的知识点。
数据库:用于存储和管理数据,便于程序开发
常见数据库:oracle、informix、DB2、sysbase、SQL server、MySQL、MongoDB
DBA:数据库管理员
//查询emp表中所有成员信息
SELECT * FROM emp;
//查询emp表中empno列以及新的一列:年薪,计算表达式为:empno*12
SELECT empno,empno*12 "年薪" from emp;
//dintinct的作用范围是后面所有的列,重复记录只取一次
SELECT DISTINCT deptno,job from emp;
//where:条件过滤
//查询comm不为空的成员信息
SELECT *from emp where comm is not null
//between表示区间,in表示两个具体的值,in后可加nul,not in后不可加null
select * from emp where sal between 100 and 200
select * from emp where sal in(100,200)
//like:模糊查找
//"%"匹配多个字符,"_"匹配一个字符,escape表示转义字符
//查询姓名以S开头的成员信息
select * from emp where ename like 'S%';
//查询名字中包含"_"的成员
select * from emp where ename like '%\_%'escape'\';
//比较运算符:> < != = >= <= <>
//逻辑运算符:and or not
//集合运算符:in not in
//排序order by colname|alias|expr|number 列名、别名、表达式、序号
//默认升序ASC,降序为desc,desc只作用于最近的一列
//对comm列进行降序排序,并且nulls last 表示将空值显示在后
select * from emp order by comm desc nulls last
//单行函数:只对一行进行变换,产生一个结果
/*
lower、upper、initcap(首字母大写)
substr(a,b)、substr(a,b,c),取子字符串。a:字符串,b:开始位置,c:取的长度
length字符数、lengthb字节数
concat(连接符||),concat(a,b):'ab'
instr(a,b):判断b是否在a中存在,存在返回第一次出现位置,否则返回0
lpad左填充、rpad右填充。lpad('abc',5,'#')
trim去掉首尾的空格,trim('x' from 'xxlxlxx')去掉首尾的x
replace(str,old,new)
round四舍五入,trunc截断,mod求余,ceil/floor取整
*/
/*转换函数
to_number to_char to_date
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day')from dual;
*/
/*日期函数
months_between:两个日期值相差的月数
add_months:加月份
last_day:日期所在月的最后一天
next_day:求指定日期的下一个星期几
select next_day(sysdate,'星期一')from dual;
*/
/*通用函数
nvl(a,b):a为null时,返回b
nvl2(a,b,c):a为null时,返回c,否则返回b
nullif(a,b):a=b返回null,否则返回a
coalesce(a,b,c,...n):从左向右找第一个不为空的值
*/
/*条件表达式
类似if-else。涨工资案例
select empno,
job,
sal "涨前薪水",
case job
when '总裁' then sal+1000
when '经理' then sal+800
else sal+400
end "涨后" from emp;
或,decode是一个函数,除第一个和最后一个参数之外,中间的参数都是成对出现的
select empno,
job,
sal "涨前薪水",
decode(job,
'总裁' sal+1000
'经理' sal+800
sal+400) "涨后" from emp;
*/
/*分组函数(组函数、聚合函数),具有滤空功能
sum、count、max、min、avg
//统计不同部门的平均工资
select deptno,avg(sal) from emp group by deptno;
//统计不同部门不同职位的平均工资,先按deptno分,再按job分
select deptno,job,avg(sal) from emp group by deptno,job;
//having过滤分组,查询平均薪水大于2000的部门
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
//语法:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY
//where先过滤再分组,having先分组再过滤。where更高效一点