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%是过了。
- oracle(二)
- Oracle 二
- Oracle(二)
- oracle (二)
- oracle(二)
- oracle二
- 【Oracle】Oracle实用教程总结(二)
- oracle毛病(二)
- Oracle常見問題集(二)
- oracle笔记二
- Oracle FAQ (二)
- Oracle知识点总结二
- oracle statspack实例(二)
- oracle学习总结(二)
- oracle学习(二)
- oracle学习笔记(二)
- oracle学习总结(二)
- Oracle学习笔记(二)
- Struts(二)
- Struts(三)文件上传
- JavaMail开发
- Struts(四)validator框架的应用
- Oracle(一)
- oracle(二)
- oracle(三)
- oracle(四)
- Hibernate(一)
- Hibernate(二)
- bash
- hibernate(三)(
- Hibernate(四)
- 做企业:什么都可以外包么