1. 基本查询:
第一条查询语句:
1.1 查询公司中全部的员工信息;
SQL>select * from emp;
注解:SELECT与FROM是关键字,“*”代表要查询emp表中所有的列,emp表为要查询数据的目标表,它由关键字FROM所指定,SQL引擎在执行该条代码的时候,首先执行FROM语句,将目标数据加载到内存中,再使用SELECT语句对数据进行投影操作。
上面的代码还可以按如下方法改写为:
SQL>select empno,ename,job,mgr,hiredate,sal,comm.,deptno from emp;
在执行以上代码的时候,效率高于前面的代码。原因是语句解析的时候不需要将“*”解析为各个列名,可以直接进行查询。
1.2 查询emp表中所有员工的姓名、入职时间以及现在的薪水值
SQL>select ename,hiredate,sal from emp;
注解:SELECT关键字用来进行数据投影操作的,FROM语句是用来确定查询的数据来源,需要到那张表查询数据就将该表的表名写到FROM中。
1.3 在SQL语句中使用算术表达式
SQL常用的算术运行运算符是+、-、*、/ 。
1.3.1 查询公司中每名员工在工资上调400元后的工资
SQL>SELECT ename,sal,sal+400 FROM emp;
注意:代码只是利用SELECT语句的数学表达式来改变结果集的值,而真正的表总的数据并没有改变。
1.3.2查询员工调整工资后的年薪
SQL>SELECT ename,(sal+400)*12 FROM emp;
1.4 空值(NULL)的应用
1.4.1 空值的介绍
示例:查询公司中所有员工的姓名、工资和奖金
SQL>SELECT ename,sal.comm FROM emp;
注解:在comm列中有很多的空白,只有4名员工有奖金值,而其他的员工并没有被分配这个值,在这种情况下,Oracle把这个字段分配为空值。简单的说,没有值就是空值,但是空值不等同于零或空格。
1.4.2 NULL值在算术表达式中的使用
示例:查询每个员工的月收入
SQL>SELECT ename,sal+comm FROM emp;
结果出乎意料,在最终的结果中,很多人没有了收入,这种结果是空值造成的,在算术表达式中,任意一个值是NULL,则表达式结果就是NULL,在上面的查询中,只有4名员工有奖金其他员工奖金的记录全部是NULL,所以必然就是NULL,解决办法是使用NVL函数。在以后的课程中会介绍。
1.5 列别名的使用
1.5.1 使用列别名的方法:
(1) 直接在字段的后面跟别名
(2) 在要取字段名的后面加上AS 跟别名
示例:查询中使用别名:
SQL> SELECT ename 员工姓名,sal as 工资 FROM emp;
1.6 DISTINCT关键字的使用
DISTINCT关键字的作用是消除结果集中的重复数据。
查看EMP表中的员工来自那几个部门,由于emp表中的“部门编号”字段存在大量重复的值,这时候就是用DISTINCT来剔除结果集中的重复数据。
示例:查询不重复的部门编号:
SQL> SELECT DISTINCT deptno FROM emp;
注意:当SQL语句中出现了DISTINCT关键字时,Oracle会强制规定,查询结果中不允许出重复的数据。
示例:查询emp表中员工名和部门号不重复的记录。
SQL>SELECT DISTINCT deptno,ename FROM emp;
注意:使用DISTINCT并不是要提出结果集中卖一个字段的重复数据,而是保证在最终的结果集中不会出现重复的行。
1.7 在查询中使用连接运算符
‘ || ’是Oracle中的连接运算符号,可以将SQL中的任意两个基本数据类型数据连接转换为字符串。
示例:使用连接运算符
SELECT ename||’的工作是:’||job||’ 他的工资是:’|| sal FROM emp;
注解:该查询将表中的三个字段连接为一个列,通常,连接字符使用在多列数据和格式化方面。
总结:学习查询语句中使用所有的关键字,这些是为大家以后学习复杂的查询语句的基础。
2 、查询语句中的条件
2.1 在查询中使用WHERE 语句
定义:WHERE关键字,在查询语句中的作用是实现数据选择操作的,简单来讲,可以通过WHERE关键字来确定,最终出现的结果集中的是那些行的数据,
示例:查询工资中超过2000元的员工
SQL>SELECT * FROM emp WHERE sal>2000;
注解:查看结果集可以发现sal字段都是超过2000元的,这就是WHERE条件语句带来的效果,
2.2 Oracle中的关系表达式
定义:所谓关系表达式是指使用Oracle关系运算符连接的句式,在Oracle是使用的关系运算符有很多,大体上可以划分为两种:一、传统的关系运算符 二、增强关系运算符。
2.3 Oracle中关系运算符
(1)传统关系运算符
传统关系运算符主要包括以下几种:>、<、>=、<=、<>、=。
(2)增强的关系运算符
除了传统的运算符,Oracle还提供了很多特殊的运算符,这些运算符都是在传统的运算符上扩展而来的,所以称之为增强的关系运算符,Oracle中增强运算符包括:between and、in、like、is NULL。
2.4 在WHERE语句中使用关系运算符表达式
示例:查询SCOTT员工的相关信息
SQL>SELECT * FROM emp WHERE ename=’scott’;
原因:Oracle数据库在做字符数据比较的时候是大小写敏感的。
SQL>SELECT * FROM emp WHERE ename=’SCOTT’;
2.4.1 日期类型格式敏感问题
示例:查询所有在1981年12月3号入职的员工。
SQL>SELECT * FROM emp WHERE hiredate=’81/12/3’;
注意:在Oracle中默认的时间格式为dd-mon-rr。
更改为SQL>SELECT * FROM emp WHERE hiredate=’03-12月-81’;
2.5 特殊关系运算符的使用
Oracle中特殊的逻辑运算符主要包括以下几种:BETWEEN AND、IN、LIKE、和IS NULL。
2.5.1 BETWEEN AND运算符的使用
说明:该运算符主要实现对相应区间的选择,通常使用在以某一个范围为查询依据时。
示例:查询公司中工资在1500~10000元之间的员工
SQL>SELECT ename,sal FROM emp sal BETWEEN 1500 AND 10000;
说明:该运算符实际是运算“sal>=1500 and sal<=3000” 。在使用BETWEEN AND
时需要注意的是:表示区间的时候必须是小值在前大值在后,如果顺序颠倒,则无法查询数据,另外使用BETWEEN AND还可以判断时间类型数据的区间和字符型类型的区间。
2.5.2 IN运算符的使用
定义:IN运算符号主要是对几个特定的值的匹配。在使用IN运算符时,必须为该运算符提供一个匹配列表。
示例:查询工资是1100、1300、3000元的员工信息。
SQL> SELECT * FROM emp WHERE sal IN (1100,1300,3000);
注释:最终的结果中,sal字段中的值只能是1100、1300、3000之一,该操作实际上等同于“”sal=1100 OR sal 1300 OR 3000“。
2.5.2 LIKE运算符的使用
定义:LIKE运算符主要实现字符串的模糊匹配功能。注意:LIKE运算符号实现模糊查询主要还是依靠通配符。在LIKE运算中,通配符的作用是用来代表未知数据的存在模式。
示例:查询员工姓名以‘S’开头的员工信息
SQL>SELECT * FROM emp WHERE ename=’S%’;
说明:“S“代表该字符串的开头字符为S,而后面的%代表任意个任意字符
通配符‘_’的使用方式
查询员工姓名第二个字符是L的员工信息
SQL> SELECT * FROM emp WHERE ename LIKE ‘_L%’;
2.5.3 IS NULL运算符的使用
说明:对NULL的判断一直是数据库使用过程中很重要的组成部分。
示例:查询没有奖金的员工
SQL> SELECT * FROM emp WHERE comm =NULL;
原因:书写上有问题,虽然该语句能执行成功,说明“comm=null“ 从语法的角度并没有什么错误,但要注意,用任意一个数据和NULL运算,结果是NULL,没有数据返回。
SQL>SELECT * FROM emp WHERE comm IS NULL;
说明:对于NULL值的判断,应该使用IS NULL运算。
3、在WHERE条件中使用逻辑运算符
在Oracle中主要有3个逻辑运算符:AND、OR、NOT。其中,AND和OR是双目运算符,而NOT是单目运算符。对于一个逻辑表达式,返回的值有3中,TRUE、FALSE、NULL。
3.1 在WHERE条件中使用AND(并且)运算符
AND运算符在WHERE条件中出现,通常用来连接两个关系运算表达式。
示例:查询10号部门工资大于2000元的员工
SQL>SELECT * FROM emp WHERE deptno=10 AND sal>2000;
注解:两个条件必须同时成立,所以使用AND运算符连接这两个关系表达式。
3.2 在WHERE条件中使用OR(或者)运算符
OR运算符在WHERE条件出现的作用于AND一样,也是为了连接两个关系运算表达式,不过,该运算符判断的依据跟AND不太一样,使用AND时,只有连个关系运算的结果全是TRUE时,目标数据才是所需的,而使用OR运算符时,左右两个关系只是有一个的结果是TRUE,该记录就是所需的。
示例:查询7369号员工或7698号员工的职员的信息
SQL>SELECT * FROM emp WHERE mgr=7698 OR mgr=7369;
3.3 在WHERE 条件中使用NOT运算符
NOT运算符是取反的意思,是单目运算符,它只能与增强关系运算符号使用,不能与传统关系运算符配合使用,NOT IN、IS NOT NULL、NOT BEWTEEN 。。AND,是NOT运算符使用的集中固定使用方式,分别代表:不在某个列表中、不为空、不在某个范围内。
示例:查询不归7698号员工和7839号员工领导的职员信息
SQL>SELECT * FROM emp WHERE mgr NOT IN(7698,7839);
4、结果集排序
4.1 ORDER BY的基本使用
ORDER BY主要是使得结果集按照升序或者降序的方式来排列,ORDER BY语句是SQL语句所有字句中最后被执行的一条。ORDER BY 字句后面指定列的列名或者直接使用列名作为结果集排序的依据。
示例:按入职时间查询员工信息
SQL>SELECT * FROM emp ORDER BY hiredate;
注解:默认是升序
4.2 ORDER BY语句中使用别名
示例:查询公司所有的员工收入,按照年薪排序
SQL>SELECT ename,sal*12 salary FROM emp ORDER BY salary;
注解:查询了员工的姓名与年薪,同时将运算年薪的表达式另起了别名“salary”
4.3 在ORDER BY语句中使用降序排列
示例:查询10号部门员工信息,按工资降序排序
SQL>SELECT * FROM emp WHERE deptno=10 ORDER BY sal DESC;
4.4 在ORDER BY语句中使用两个排序列
示例:查询员工信息,按部门和工薪排序
SQL>SELECT * FROM emp ORDER BY deptno,sal;
注解:指定两个列进行排序 ,数据库在执行该条语句时,首先按照deptno排序,在deptno相同的情况下再按照sal排序。
4.5 多个排序字段中使用不同的排序规则
示例:将emp表中的deptno列按照降序排列,sal列按照升序排列
SQL>SELECT * FROM emp ORDER BY deptno DESC,sal ASC;
注释:该查询中依然使用了两个排序字段,只不过deptno是按照降序来排列的,而在deptno相同的情况下,sal字段是按照升序来排列的