1.dual表常用在没有查询目标的SELECT语句块中,它只包含一行数据
查询当前日期 SELECT sysdate FROM dual;
在当前日期的基础上加3天 select sysdate+3
from dual;
2.约束,保证数据的完整性
--约束分类: 1.primary key ,2.unique 3.not null 4. default 5.check 6. foreign key
--语法: alter table 表名 add constraint 约束名 约束类型(primary key/unique/check/foreign key)(字段)
-- references 表名(字段名)
-- notnull default
-- create table (id int, s_name varchar2(20) not null default 默认值 )
--级联删除外键对应的数据行
--create table course ( c_id int , c_name varchar2(20) );
--alter table course add constraint pk_c_id primary key(c_id);
--create table student (s_id int,s_name varchar2(20),c_id int )
--alter table student add constraint fk_c_id foreign key(c_id) references course(c_id) on delete cascade;
--当主表中数据删除,子表中的行就删除
on delete set null
--删除约束:
alter table 表名 drop constraint 约束名
3.关于表单查询相应操作
别名查询 select sal as "员工工资" from emp;
使用运算符查询 select sal,sal+500 as "加薪后的" from emp;
查询员工的ename+”职位是:”+job
SELECT ename||‘ 的职位是'||job AS "Employees Details" FROM emp;
--查询员工编号不等于7369的员工信息 != <>
select empno,ename from emp where empno<>7369
--查询员工表,要求 员工编号 大于如下列表中的任意一个值即可 7369,7521,7499
select empno,ename from emp where empno>all(7369,7521,7499)
any 列表中任意一个 all 列表中所有的。
--表示什么范围内,between ... and
select empno,ename,sal from emp where sal between 1800 and 3000;
--查询没有福利的员工
select empno,ename,sal,comm from emp where comm is null;
--列出员工编号不是数字的员工信息
select empno,ename from emp where empno is not nan
LIKE:匹配字符串
IN:匹配列表值
BETWEEN:匹配范围值
IS NULL:匹配空值
IS NAN:匹配非数字值
--匹配'_M%',表示第一个是任意字母,第二个是M,%表示最后可以是任意字母
SELECT *FROM emp WHERE ename LIKE '_M%';
--列出姓名中有%的员工信息
(ESCAPE选项告知数据库如何区分通配符和要匹配的字符,可以使用反斜杠(\))
select empno,ename from emp where job like '%\%%' escape '\';
--查询emp表中入职日期大于1982-1-1 ,同时工资大于900的员工信息
select empno,ename,hiredate,sal from emp where hiredate>'01-1月-1982' and sal>900
--删除表中所有记录 delete from t1;
--消除重复 distinct,消除重复的job值
select distinct job from emp3;
ORDER BY是按照升序(ASC)排序,也可以使用DESC指定为降序排序
例如,查询EMP表,先按empno升序排列,再按ename降序排列(如果第一个相同,再按第二个排序)
SELECT *FROM EMP ORDER BY empno ASC, ename DESC;
--处理NULL值,NULL值被查询出来的时候没有显示信息,如何告知用户这是空字符串还是NULL,这可以通过NVL()函数来进行处理
SELECT empno,ename ,NVL(comm, 0) FROM EMP;
--使用&+参数名(手工输入啦)
例如:查询员工编号为某数值的员工
SELECT * FROM EMP WHERE EMPNO=&arg;
4.综合查询
--检索员工表中员工姓名和雇佣时间 ,要求是年-月-日形式,中文显示
--函数 to_char 转换函数字符格式 日期--字符串 to_char(时间字段,转换格式)
select ename 员工姓名, to_char(hiredate,'yyyy-mm-dd') 雇佣时间 from emp;
--检索员工表中员工的姓名及全年的收入
select ename 员工姓名, (sal+nvl(comm,0))*12 全年收入 from emp;
--检索emp表中部门编号是30的员工姓名,月收入及提成,并要求结果按月收入升序,然后按提成降序显示
select ename,deptno,sal,comm from emp where deptno=30 order by 3,4 desc;
--选择公司中没有管理者的员工姓名及工作
select ename,job from emp where mgr is null;
--找出部门10中的所有经理和部门20中的所有办事员的详细资料
select * from emp where (deptno=10 and job='MANAGER') or
(deptno=20 and job='CLERK') ;
--找出在(任何年份的)2月受聘的所有员工
--取到月份,hiredate, 靠to_char(日期字段,转换格式)
select ename,hiredate from emp where to_char(hiredate,'MM')='02';
--对于每个员工,显示其加入公司的天数
select ename,sysdate-hiredate 天数差 from emp;