sql 经典版 

 
第一章:简单查询语句
1.         在查询语句中,实际上只有selectfrom语句是必须的,这是最简单的查询语句
2.         *”表示所有的列,“;”以分号结束
3.         Oracle有许多UnixC的影子
4.         在查询语句中选择指定的列,就是关系数据库中所称的投影(project)。
5.         组成SQL语句的关键字是不能缩写的,即关键字必须原样书写。
6.         SQL关键字不区分大小写,尽量采用大写,是oracle推荐的。
7.         一个完整的sql语句叫:statement,每个关键字和后面跟着的选项叫子句:clause
8.         SELECT * FROM employees
9.      alter session SET NLS_DATE_LANGUAGE ="AMERICAN"
10.  col hiredate for a15
11.  列标题和数据的显示格式
12.  SQL可以使用*,/+,-四种运算符
13.  给一列起一个别名,只要在列名和别名之间放上AS活空格就可以了,别名可以用引号括起来,也可以不括起来,如果不括起来,则显示为大写,括起来后,则按别名原样显示
14.  两个列之间可以用逗号分隔开,也可以用联字符||分割开如:
15.  select first_name ,(500+salary)*12
16.  select first_name || 'annual salary is '||(500+salary)*12 as "Employee's Salary" from employees
17.  上面连个例子的显示效果是差不多的
18.  上面使用了文本字符串(literal)和连接字符串。
19.  文本字符串是包含在SELECT子句中的字符,数字或表达式,而不是任何的列名或列的别名。
20.  如果文本字符串是日期型和字符型,则必须用单引号括起来。每个字符串在每行输出结果中都输出一次。文本字符串会原样显示,不会影响列名,也不会影响查询。
21.  连接字符串(||)把一个多多个列或字符串连接在一起。
22.  DISTINCT去掉重复的行,当查询比较大时,尽量避免使用,应为oracle是通过排序来完成的,所以会造成效率降低。所以可以用不同语句来完成。
Distinct可以作用于多列,此时显示的结果为每一列组合只显示一行。
第二章:限制性查询和数据的排序
1.         Where子句用来限制哪些行要显示,这在关系数据库中称为选择(Selection)操作。Where子句跟在from子句之后。
2.         Where是关键字,其后跟限制条件
3.         条件由列名,字符串,算术表达式,常量和比较运算符组成
4.      >,<,<=,>=,=,<>,!=,BETWEEN AND IN LIKEoracle提供的9个比较运算符。
5.      一般把比较运算符用在条件语句中
6.      BETWEEN 1 AND 2 运算符用于测试某些值是否在指定数值范围之内,1下限,2叫上限,该运算符可以用于数值型,字符型和日期型,但后面的两种类型必须用单引号括起来。
7.      被单引号括起来的字符串是区分大小写的。
8.      select empname from emp where hiredate not between '01-JAN-81' AND '31-MAY-82'
9.      IN 用来测试某些值是否在列表中出现
10.  select empname from emp where job not in ('analyst','president')
11.  LIKE运算符 select emp from emp where job like '%sal_' ; %代表多个字符,-代表一个且只能是一个字符
12.  转义字符\和~
13.  如果不在查询语句中使用order by则查询结果是不确定的。Order by子句一定是SQL语句的最后一个子句。
14.  Order by中也可以用 Select 子句中定义的列名的别名。
15.  Order by中也可以用 Select 子句中定义的表达式的别名。
16.  Order by中也可以用 列号。为了可读性,尽量少用
17.  Order by 也可以不用在select列表中列出的列。但为了可读性,尽量避免。
18.  Order by子句中也可以使用多列,如果要排序,需要为每一列分别指定排序方式
19.  select job,sal,ename from emp order by job,sal desc



第三章:单行函数
1. 单行函数只能对表的一行数据操作,并且对表的每一行只产生一个输出结果。可以接收一个或多个参数:单行函数可以用在select,where,order by 子句中
   2. 单行函数包括:字符型,数字型,日期型,转化型,一般型
3. Oracle内部日期存储格式为:世纪,年,月,日,时,分,秒
4. Oracle有效日期是公元前4712年到公元后9999年
5. 把字符串转换成日期 : select to_date('15-JUL-02') from dual
6. 日期函数:months_between,ADD_months,Next_day,Last_day
7. Round不能用于字符型,只能是数字型和日期型
8. 数字型数据与日期型数据不能直接转换,TO_CHAR,TO_NUMBER,TO_DATE
9. SELECT to_char(SALARY,'$999,999,999,999.00')FROM EMPLOYEES
10. to_char(数字,‘格式‘):
11. 9表示一位数字
12. 0表示前导零
13. $表示美元
14. L表示本地货币
15. .表示小数点
16. ,表示千分位
17. MI在数字的右边显示减号
18. PR把负数用尖括号显示减号
19. 其他的两个转换行数也是,第一个参数表示输入变量,第二个参数表示格式
第四章:
NULL值的处理、逻辑操作和函数嵌套
1. NULL出现的原因是信息不完全,但是有其存在的必要
2. 对NULL的运算只能是IS NULL运算符,不能是=或!=
3. 升序排序是NULL放在最后,降序排序时NULL放在最前
4. And运算符优先级 F-NULL—T
5. Or运算符优先级 T-NULL-F
6. 运算符优先级:算术运算符-连接运算符-比较(关系)运算符-IS NULL, IS NOT NULL,LIKE,NOT LIKE,IN,NOT IN-BETWWEEN ,NOT BETWWEEN-NOT-AND-OR
7. 可以用AND 和OR 代替BETWEEN AND 和IN,前者可能对非计算机人员更容易理解
8. NVL是一个空值转换函数NVL(表达式1,表达式2),两个表达式的数据类型必须一致,如果表达式1为NULL,就返回表达式2的值。
9. 因为SQL没有逻辑判断的语句,所以用DECODE函数来完成类似功能:
10. select first_name job ,decode(manager_id,100,22222,102,33333) from employees;
11. ORACLE的单值函数可以嵌套,计算次序是从内到外
12. 从oracle 9i开始增加的新的单值函数和表达式:NVL2,NULLIF,COALESCE,CASE
13. COALESCE(表达式1,表达式2。。。表达式n),返回第一个值非NULL的表达式
14. CASE类似与Decode函数
第五章:
综合函数和分组函数
1. 5个常用的分组函数:COUNT,AVE,SUM,MAX,MIN,分组函数是对一批数据操作
2. Count(*)返回所有的行,包括空行和重复行
3. Count(列名),返回非空的行
4. AVE和sum只能对数字型操作,ave是求平均值,SUN是求和
5. MAX,MIN,可以对数字,字符,日期操作。
6. GROUP BY分组,按照列名
7. group by的列,可以不在select的列表中,如果在select中只有分组函数的话。
8. 如果在一个查询中使用了分组行数,任何不在分组函数中的列,或表达式必须在group by子句中,也就是,group by中出现的必须在select中出现,除非是在分组函数中。
9. WHERE子句中不允许出现分组函数,如:
10. select job, avg(salary) from employees where avg(salary)>1500 group by job
11. 可以用HAVING子句来代替
12. select job, avg(salary) from employees having avg(salary)>1500 group by job,group by和having的出现顺序可以互换。但最好把having放在group by后面,oeder by肯定是最后的子句
13. 分组函数使用起来能使系统效率下降,特别是对大表操作时,因为分组函数要扫描整个表,如果使用了group by子句,oracle还有进行排序
14. 除了count(*)外,其他分组函数都不处理NULL值
第六章:多表查询
1. 在oracle系统中,查询的数据可以来自多个表,即一个查询语句可以对多个表操作。造成这一现象的原因是数据库的规范化(Normalization)
2. 主键和实体完整性:
3. 主键:是关系数据库表中的某一列或某几列的组合,能唯一的标识关系数据库表中的一行
4. 实体完整性:主键不能包含NULL值,并且主键必须能唯一的标识任一行。
5. 表的设计者负责定义主键,关系数据库管理系统负责维护实体完整性。
6. 第一范式:
7. 所有的键属性(列)都已定义
8. 没有重复的组,即每行和没列的交汇处可以而只能包含一个值,而不能包含一组值。
9. 所有属性(列)都依赖于主键
10. 部分依赖,只依赖部分主键的依赖关系,我们可以把存在部分依赖关系的列拿出来重新生成一个表。只依赖主键的一部分
11. 外键和引用完整性
12. 外键:是关系数据库表中某一列或几列的组合;它的值或者与另一表中(有时也可能是同一个表)的某一列(一般为主键)相匹配或者为NULL值。
13. 引用完整性:
a) 外键必须或者为NULL值,或者有相匹配的项
b) 外键可以没有相对应的键属性,但不可以有无效的项
14. 表的设计者定义外键,关系数据库管理系统负责维护引用完整性。
15. 第二范式:
a) 该表为第一范式的表
b) 该表不包含部分依赖
16. 如果一个表为第一范式表,并且它的主键由一列(单一属性)组成,那么该表自动成为第二范式表
17. 第三范式:
a) 该表已经为第二范式
b) 该表不包含传递依赖
18. 传递依赖:一个或多个属性列依赖于非主键的属性
19. 对于大多数商业数据库来说,第三范式是规范化过程的终点。
20. 多表连接:4种连接
21. Oracle是用join来完成多表查询的
22. 相等连接,自连接,不等连接,外连接
23. 相等连接:这种连接通常涉及到主键和外键,也叫简单连接或内连接,连接n个表,需要n-1个条件(用=连接)
24. 在列名前加上表名,可以改善系统效率
25. 表别名的定义,一旦在查询语句种使用了表别名,就不能再使用表名了。
26. 如果忘了用where条件,就会出现笛卡尔乘积:笛卡尔乘积形成条件:
a) 查询语句漏掉连接条件
b) 查询语句中两个表中所有行都满足连接条件
c) 查询语句中连接条件无效
27. 实际工作中应该避免产生笛卡尔乘积。应该在连接查询中使用where子句中,使用有效,正确的连接条件。
28. 自连接:可以用2个单独的查询代替
29. 自连接:是通过把一个表定义2个别名(即把一个表隐射成2个表)来完成自连接的
30. 不等连接:除了=以外的运算符产生的连接叫不等连接,如BETWWEN AND等运算符
31. 外连接:外连接运算符为(+),可以在等号的左边,也可以在右面,但一定要在缺少信息的那一面,如:select empno,emp.deptno,dept.deptno,loc from emp,dept
32. where emp.deptno(+)=dept.deptno
33. 新的SQL99的语法连接
34. 自然连接:select e.empno,d.loc from emp e cross join dept d
35. order by d.loc;这是一个笛卡尔乘积
36. 使用USING子句的连接:select e.empno,d.loc from emp e join dept d using(deptno) order by d.loc
37. NATURAL JOIN 子句和USING子句是互斥的。
38. 在所引用的列中不能用表名或列名
39. 当有多列时,USING子句只能匹配之中一列
40. ON子句的连接select e.empno,d.loc from emp e join dept d on(e.deptno=d.deptno) order by d.loc
a) 在所引用的列中要使用表名或列名
b) 相等连接条件在on子句中
41. 使用on子句的多表连接和附加条件:
42. select e.empno,d.loc,m.deptno from emp e join dept d on(e.deptno=d.deptno)
43. join manager m on (m.deptno=d.deptno)
44. where e.job in('clerk','analyst')
45. order by d.loc
46. 也可以直接把and加入条件语句中,如在上面语句中,把where改成and
47. 左外连接:select e.empno,d.loc from emp e 
48. left outer join dept d on(e.deptno = d.deptno)
49. 有外连接 select e.empno,d.loc from emp e 
50. right outer join dept d on(e.deptno = d.deptno)
51. 相等于用(+)
第七章:子查询
单行自查询可以放在where子句中,having子句中,FORM子句中:
   单行子查询使用单行比较运算符
   单行子查询放在单行比较关系符的右边
   单行子查询放在括号中
   单行子查询中不能使用order by子句
   From中也可以有子查询,可以只选择表中的几个列
多行子查询使用多行比较操作符,它返回多行:IN,ANY,ALL
   IN
操作符的含义为子查询返回列表中的任何一个,IN操作符比较子查询返回值列表中的每一个值,并且显示任何相等的数据行。
   select empno ename,sal,job from emp
where sal < all(select AVG(SAL) from emp grou by job)
all前面可以是< ,> 但不能是=。
any是相当于IN操作符
多列子查询:
   成对比较的多列子查询