SQL(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理挂席数据库系统。

 

表:是逻辑概念,不是物理表,表由表名字,字段,记录组成。

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则:三范式

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

 

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

 

 

查询语言汇总:

1.

--查询某个表中的所有数据

--select * from 表名

select * from emp;

 

2.

--查询所有员工的姓名

--select 字段名 from 表名;

select ename from emp;

 

3.

--查询所有员工的姓名,员工编号,上级编号

--查询的数据: ename,empno,mgr

--数据来源: emp雇员表

select ename, empno, mgr from emp;

 

4.

--查询所有员工的部门编号

--查询的数据: deptno

select deptno from emp;

 

5.

--所有有员工存在的部门的部门编号

--查询的数据: deptno

--去重  distinct

select distinct deptno from emp;

select distinct ename,deptno from emp;

 

6.

--表达式  结果字段的名字为表达式的名字   值为表达式计算的结果-->计算器

select 1+1 from emp;

select distinct 123*456 from emp;

 

7.

--别名  select 字段1 as 别名,字段2 as 别名, 字段3 别名.. from 表名 别名;

--别名如果是英文默认大写,如果想要原样使用|中文带空格,在别名的前后""

select distinct 123+456 as "get Sum" from dept;

select distinct 123+456  "求 和" from dept d;

 

8.

--''代表字符串  ""原样输出 结果字段名和值原样字符串输出

select '哈哈' "123" from emp;

 

9.

--表达式|字符串都是伪列:不是表中真是存在的字段

--字符串的拼接  ||

select 'a-'||'-b' from dual;

 

10.

--查询所有员工的姓名添加同一前缀 aaa

select 'aaa'||ename "学生姓名" from emp;

 

11.

--虚表: oracle中不是真是存在的表,其中没有任何数据  dual

select sysdate from dual;

 

12.

--null

--查询所有员工的员工姓名和奖金

select ename,comm from emp;

--null与数字进行运算,结果为null

--在所有员工原奖金基础上+1

select ename, comm, comm+1 from emp;

 

13.

--null与字符串运算结果不会改变原串

select ename, comm, comm||'1' from emp;

--处理null值   nvl(字段,值2) 如果字段值1为null,给你值2,如果值1不为null,给你值1

select ename 姓名, comm 奖金, nvl(comm,0)+1 "+1后的奖金" from emp;

 

14.

--条件查询

--select *|字段1,字段2.. from 表名 where 行过滤条件;

--求20部门所有员工信息

select * from emp where deptno = 20;

 

15.

--求30部门的所有员工的员工名称,和部门编号

select ename, deptno from emp where deptno =30;

 

16.

--执行顺序  from---where---select

-- = 、 >、 <、 >=、 <=、 !=、 <>、

--所有员工中薪资>800

select * from emp where sal>800;

--SMITH查询斯密斯的信息

select * from emp where ename='SMITH';

 

17.

--求除了SMITH以外的所有员工信息

select * from emp where ename != 'SMITH';

select * from emp where ename <> 'SMITH';

select * from emp where not ename = 'SMITH';

 

18.

--and 、or、 not , between and

--求薪资在1500~2500之间的员工信息

select * from emp where sal >=1500 and sal<=2500;

select * from emp where sal  between 1500 and 2500; --是>=<=

--求薪资>1500并且是30部门的员工名称,部门标号,薪资

select ename,deptno,sal from emp where sal>=1500 and deptno=30;

--求薪资>1500或者30部门的员工名称,部门标号,薪资

select ename,deptno,sal from emp where sal>=1500 or deptno=30;

 

19.

--求除了薪资>1500和30部门的员工名称,部门标号,薪资

select ename,deptno,sal from emp where not sal>=1500 and not deptno=30;

--select ename,deptno,sal from emp where not(sal>=1500 and deptno=30);

select ename,deptno,sal from emp where not(sal>=1500 or deptno=30);

 

20.

----查询 岗位 为 CLERK 且部门编号为 20的员工名称 部门编号,工资

select ename,deptno,sal from emp where job='CLERK' and deptno=20;

--求奖金为null的人

select * from emp where comm is null;

--求有奖金的人

select * from emp where comm is not null;

select * from emp where not comm is null;

--select * from emp where comm not is null;  错误事例

 

21.

--集合操作

--求薪资>1500或者30部门的员工名称,部门标号,薪资

select * from emp where sal>=1500

Union

select * from emp where deptno=30;

 

-- Union All,全集(不去重)

select * from emp where sal>=1500

Union All

select * from emp where deptno=30;

 

22.

--求没有员工在的部门标号

select deptno from dept

Minus

select distinct deptno from emp;

 

23.

--like 模糊查询  %任意个任意字符  _任意一个字符

--姓名以A开头的所有员工信息

select * from emp where ename like 'A%';

--使用模糊匹配做精确匹配

select * from emp where ename like 'JONES';

--姓名中第二个字符为A的所有员工姓名

select ename from emp where ename like '_A%';

--姓名以H结尾的所有员工信息

select ename from emp where ename like '%H';

--测试数据

insert into emp(empno,ename,sal) values(1000,'t_%test',8989);

insert into emp(empno,ename,sal) values(1200,'t_tes%t',8000);

24.

--查找名字中带有%的用户

select * from emp where ename like '%A%';

select * from emp where ename like '%C%%' escape('C'); --任意指定转义字符,需要使用escape() 中说明

 

25.

--事务

commit;

rollback;

 

26.

--in 匹配后面结果集中的任意一个数据,无法做区间判断

--查询薪资为 1500 2000 2500 5000的员工信息

select * from emp where sal=1500 or sal = 2000 or sal=2500 or sal=5000;

select * from emp where sal in (1500,2000,2500,5000);

--查找 KING 和 SMITH 两个员工的信息

select * from emp where ename = 'KING' or ename = 'SMITH';

select * from emp where ename in ('KING','SMITH');

 

27.

--查询 在SALES he  ACCOUNTING 的所有员工信息

--查询的数据:*

--来源:emp

--条件: 1)查询SALES he  ACCOUNTING的部门编号  2)根据上一步查询的部门标号在emp中查询满足条件的数据

select deptno from dept where dname in('SALES','ACCOUNTING'); --10,30

select * from emp where deptno in(10,30);

--子查询 查询语句中嵌套查询语句

select *

  from emp

 where deptno in

       (select deptno from dept where dname in ('SALES', 'ACCOUNTING'));

      

28.

--查询薪资等级为2的员工信息

--查询的数据:*

--来源:emp

--条件: 薪资等级为2

select losal from salgrade where grade =2;  --1201

select hisal from salgrade where grade =2;  --1400

 

29.

select *

  from emp

 where sal between (select losal from salgrade where grade = 2) and

       (select hisal from salgrade where grade = 2);

      

30.

--查询 销售部(SALES) 中 工资大于1500的员工信息

--查询的数据:*

--来源:emp

--条件: 销售部(SALES)   sal>1500

select *

  from emp

 where sal > 1500

   and deptno in (select deptno from dept where dname = 'SALES');

 

31.

--查询工资比SMITH高的同一部门的员工信息

--查询的数据:*

--来源:emp

--条件: deptno是 'SMITH'的部门   sal>'SMITH'的薪资

select *

  from emp

 where deptno in (select deptno from emp where ename = 'SMITH')

   and sal > (select sal from emp where ename = 'SMITH');

  

select ename,deptno,sal from (select *

  from emp

 where deptno in (select deptno from emp where ename = 'SMITH')

   and sal > (select sal from emp where ename = 'SMITH'));

  

32.

--exists 存在即保留  存在即合法

select * from emp where exists (select * from dept where dname='SALES');

select *

  from emp

 where exists (select deptno, dname

          from dept

         where dname in ('SALES', 'ACCOUNTING'));

 

33.

--销售部和财务部所有员工信息

select *

  from emp

 where exists (select deptno, dname

          from dept

         where dname in ('SALES', 'ACCOUNTING')

           and emp.deptno = dept.deptno);

          

select *

  from emp e

 where exists (select deptno, dname

          from dept d

         where dname in ('SALES', 'ACCOUNTING')

           and e.deptno = d.deptno);

    

34.   

--除了销售部和财务部门的所有员工信息          

--select *

--  from emp e

-- where exists (select deptno, dname

--          from dept d

--         where dname in ('SALES', 'ACCOUNTING')

--           and e.deptno != d.deptno);

 

select *

  from emp e

 where not exists (select deptno, dname

          from dept d

         where dname in ('SALES', 'ACCOUNTING')

           and e.deptno = d.deptno);

          

35.

--获取所有行记录

select * from emp;

select * from emp where 1=1;  

 

36.

--排序  order by  desc 降序  asc升序

--select * from 表名 where 行过滤条件 order by 排序字段;  --默认升序

--from--where--select--order by

select * from emp order by sal asc;  

 

37.

--根据薪资进行升序排序,薪资相同的根据员工编号进行降序排序

select * from emp order by sal asc,empno desc;

 

38.

--根据员工的奖金进行降序排序       nulls first    nulls last 

select * from emp where deptno=30 order by comm desc nulls first;