oracle(二)

来源:互联网 发布:拼多多互刷平台源码 编辑:程序博客网 时间:2024/05/16 10:17

SQL基础
这些写SQL语句的一些注意点:
1.SQL 语句不是大小写敏感的。
2.建议关键字用大写,其他用小写。
3.SQL 语句可以分布在一行或者多行中。
4.关键字不能进行缩写,也不能分布在两行。
5.一般地,不同的子句写在不同的行为宜。
.经常用跳格键或者缩进来增强可读性.
例子:
   SELECT * FROM dept;
   SELECT deptn,loc FROM dept;


缺省的对齐方式
 左部对齐:日期、字符数据
 右部对齐:数字格式数据
缺省的显示方式: 大写
可以用下述的数学符号,将日期或者数字数据组合起来形成数学表达式:+,-,*,/;
SELECT ename,sal,sal+300 FROM emp;
乘和除操作的优先级高于加和减。相同优先级的操作符自左向右进行计算。圆括号"("")",用来重新组合表达式的优先级
SELECT ename,sal,12*sal+100 FROM emp;  SELECT ename,sal,12*(sal+100) FROM emp;

空值是一个表达不可用、未分配、未知、或者不适用等意义的值。
空值与零和空格的概念不同,应当严格区分。
     SELECT ename,job,sal,comm FROM emp;
如果数学表达式中包含了一个空值,那么该数学表达式计算的结果为空值
     SELECT ename,12*sal+comm FROM emp WHERE ename='KING';

重新命名一个列的名字有时很有用。
可以用AS关键字为列名取一个别名。如果别名中包含空格,或者其他特殊自符,则需要用引号("")将别名包含起来
     SELECT ename AS name,sal salary FROM emp;
     SELECT ename "NAME",sal*12 "Annual Salary" FROM emp;
可以将一些列连接起来,也可以将一些列和一些字符串连接起来。 串接操作符用两个竖杠 (||)表示。可以用这种方法创建一个由字符串组成的结果列。
     SELECT ename||job AS "Employees" FROM emp;
文字字符串是包含在一个Select语句中的字符串、数字、或者日期。文字字符串必须用单引号('')括起来。对于返回的每一行,文字字符串都显示一次。在生成报表时非常有用。
     SELECT ename||'is a'||job AS "Employee Details" FROM emp;
查询语句执行的结果,缺省的显示方法是显示所有的行,包括重复的行。
      SELECT deptno FROM emp;
在SELECT语句中用 DISTINCT关键字来消除所有重复的行。
      SELECT DISTINCT deptno FROM emp;

PL/SQL、SQL和SQL*Plus间的关系
    SQL   Structured Query Language(结构化查询语言)
    PL/SQL  procedure language
    SQL*Plus 一个工具
SQL
一种语言,符合ANSI 标准,关键字不可以缩写,语句可以操纵数据和定义在数据库中的表。
SQL*Plus
一个环境,符合Oracle属性,关键字可以缩写,命令不能操作数据库中的数据

选择查询出的行:
用where子句限定查询出的行.Where子句紧跟在From子句之后.
     SELECT ename, job, deptno FROM  emp WHERE  job='CLERK';

字符串和日期
字符串和日期值应当用单引号括起来.字符串值大小写敏感,日期值对于日期的格式敏感。缺省的日期值格式: DD-MON-YY.
例如:23-9月-02.为02年9月23日
     SELECT ename, job, deptno FROM emp WHERE ename='JAMES';
   
使用比较操作符
      SELECT ename, sal, comm  FROM  emp WHERE  sal<=comm;

   用BETEEN操作符:用BETEEN操作符来查询出在某一范围内的行
      SELECT ename, sal FROM emp WHERE sal BETWEEN 1000 AND 1500;
   使用IN操作符:用IN操作符来检验一个值是否在一个列表中.
      SELECT empno, ename, sal, mgr FROM emp WHERE mgr IN (7902, 7566, 7788);

使用LIKE操作符
    用LIKE进行某个字符串值的通配符匹配,来选出某些行.查询条件中既可以包含字符,也可以包含数字.% 代表0个或者多个字符. _ 代表一个字符.
      SELECT ename FROM emp WHERE ename LIKE 'S%';
可以混合使用模式字符串.
      SELECT ename FROM emp WHERE ename LIKE '_A%';
如果要匹配%这个字符,可以用/%来表示
      SELECT * FROM dept WHERE dname like 'itc*%%' ESCAPE‘*';.

使用IS NULL操作符
    用 IS NULL操作符来检查有无空值
      SELECT  ename, mgr FROM emp WHERE mgr IS NULL;

使用AND操作符
    AND 需要所有的条件都为TRUE.
       SELECT empno, ename, job, sal FROM emp WHERE sal>=1100 AND job='CLERK';

使用OR操作符
    OR操作符只需任意条件为TRUE即可
       SELECT empno, ename, job, sal FROM  emp WHERE  sal>=1100 OR job='CLERK';

使用NOT操作符
       SELECT ename, job FROM emp WHERE job NOT IN ('CLERK','MANAGER','ANALYST');

优先级规则
       SELECT ename, job, sal FROM emp WHERE  job='SALESMAN' OR job='PRESIDENT' AND sal>1500;//这里是先AND后OR;
   用圆括号强制改变操作符的优先级次序。
       SELECT ename, job, sal FROM emp WHERE (job='SALESMAN' OR job='PRESIDENT') AND sal>1500;

ORDER BY子句
   用 ORDER BY子句进行行的排序
   ASC: 升序, 缺省
   DESC: 降序
   ORDER BY子句跟在SELECT 语句之后
       SELECT ename, job, deptno, hiredate FROM emp ORDER BY hiredate;
   采用降序排序
       SELECT ename, job, deptno, hiredate FROM emp ORDER BY hiredate DESC;
   按照列的别名来进行排序
       SELECT empno, ename, sal*12 annsal FROM emp ORDER BY annsal;
   按照多个列进行排序
   ORDER BY 后的列的顺序既排序的顺序.
       SELECT ename, deptno, sal FROM emp ORDER By deptno, sal DESC;//先按照部门升序排序,部门相同的员工按照工资降序排序
集合操作符
   Union        联合两个结果集(去除掉重复记录)
   Union all    联合两个结果集(不去除掉重复记录)
   Intersect    取两个结果集的交集
   Minus        取两个结果集不同但属于第一个结果集的记录
下面是段举例:
   查找所有10部门的经理和 20部门的办事员
       SELECT * FROM emp WHERE (deptno=10 and job='MANAGER') OR (DEPTNO=20 AND JOB='CLERK');

   可以使用集合操作符等效查询:
      SELECT * FROM emp WHERE (deptno=10 and job='MANAGER')
       UNION
      SELECT * FROM emp WHERE (DEPTNO=20 AND JOB='CLERK');

   查找所有10部门的经理
      SELECT * FROM emp WHERE deptno=10 and job='MANAGER;

   可以使用集合操作符等效查询:
       SELECT * FROM emp WHERE  deptno=10
       INTERSECT
       SELECT * FROM emp WHERE  AND JOB=‘MANAGER');

注意啦,下面的内容相当重要的了,前面的内容说白了,其实很简单的,只要知道语法即可,而后面的是需要通过思考才能够完成的,一般企业招聘大多都考后面的内容。

聚合函数:
求和 Sum()
平均 Avg()
最小 Min()
最大 Max()
行数 Count()
语法:
Select …..from … where …
Group by ….having…  order by….

聚合函数的作用
    查找公司的工资总和:
        SELECT sum(sal) FROM emp;
    查找公司的总人数:
        SELECT count(*) FROM emp;
    查找公司的平均工资:
        SELECT avg(sal) FROM emp;
    查找公司的最高工资:
        SELECT min(sal) FROM emp;
查找公司的最低工资:
        SELECT max(sal) FROM emp;

Group by的含义
查看每个部门的总工资:
SQL> SELECT deptno,sum(sal) FROM emp GROUD BY deptno;
DEPTNO   SUM(SAL)
------ ----------
    10       8750
    20      10875
    30       9400
我们会按照deptno给emp表分成3个组,来对每个组进行聚合。

Having和where的区别
一、Having用来筛选聚合之后的结果集,比如我们要对刚才查询的结果进行筛选:我们只察看那些部门总工资高于10000的部门:
SQL> SELECT deptno,sum(sal) FROM emp GROUD BY deptno HAVING sum(sal)<10000;
DEPTNO   SUM(SAL)
------ ----------
    10       8750
    30       9400
二、Where用来筛选表中的记录,比如我们查找每个部门工资高于2000的员工的总工资,注意:这其中我们要让工资低于2000的记录不参加聚合,所以我们使用where来筛选表中的记录。
SQL> SELECT deptno,sum(sal) FROM emp WHERE sal>2000 GROUD BY deptno;
DEPTNO   SUM(SAL)
------ ----------
    10       7450
    20       8975
    30       2850
Where 分组前执行条件筛选,having 分组后执行。
Having可以使用聚合函数

两个隐藏列
Rowid
Rownum
SELECT * FROM (SELECT * FROM dept ODER BY deptno DESC) WHERE rownum <=3;

综合实例
查找每个部门工资高于2000的员工的总工资,要求只显示总工资高于5000的部门,按总工资降序排列:
SQL> SELECT deptno,sum(sal) FROM emp WHERE sal>2000 GROUD BY deptno HAVING sum(sal)>5000
     ORDER BY sum(sal) desc;

DEPTNO   SUM(SAL)
------ ----------
    20       8975
    10       7450

这个事某企业的面试题目,课上老师讲到,所以在这里拿出来与大家分享的.
姓名 科目 分数
张三 数学 71
张三 语文 80
李四 数学 86
李四 语文 90
王五 数学 100
王五 语文 91
王五 英语 60

1 用一条SQL语句,查出每门科目成绩都大于85分的学生的姓名?
Select 姓名 from table group by 姓名 having min(分数)>85;
2用一条SQL语句,查出平均分大于85分的学生的姓名。
Select 姓名 , count(*) from table where 分数<85 group by 姓名
Having count(*)=0;
其实地一题比第二题难理解的,第一题的思路是找出最低的分数高于85 即可,这里考查的是逆向思维。

通过上面知识的梳理,SQL初级的知识基本解决了,明天将写些初级知识的高级应用。高级应用的知识还是非常重要的,只要这些只是会了,一般的企业SQL面试80%是过了。