(CSDN博主:写代码也要符合基本法)
各位看官老爷大家好,上堂课我们一起了解了SQL语言的历史和基本语法,今天我们一起来学习一下怎么写出一条简单的查询语句
PL/SQL基础教程第二课:简单SQL查询!上篇!
首先我们从最最简明的一个SQL查询说起
这是查询语句SELECT最简单的应用,但也展示出了查询语句最不可或缺的两个关键字和两个元素
两个必需关键字是SELECT和FROM,其作用可以简单介绍为:FROM指明要从哪个表中读取数据,SELECT则指示需要读取表中哪些字段的数据
两个必需元素则是分别跟随在SELECT和FROM关键字后面的字段列表和表,上图中的*表示要取出表中所有的列
另外需要注意的一点是,使用分号标记语句的结尾是一个好习惯,有时在语法中也是必要的
SQL> SELECT * FROM emp;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 800.00 20 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20 7839 KING PRESIDENT 1981/11/17 5000.00 10 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 7876 ADAMS CLERK 7788 1983/1/12 1100.00 20 7900 JAMES CLERK 7698 1981/12/3 950.00 30 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 1014 rows selected
事实上,无论多么复杂的查询语句也可以被划分出这个最基本的结构,只不过这里所说的“字段列表”并不一定只是表中的字段,也可以是各种标量表达式,甚至另外一个附加的查询语句
同样的,FROM后面的“表”也并不局限于数据表,它可以是任意形式的整齐矩阵或者说数据集合(Set)
这种最简的SQL查询对于我们来说是远远不够用的,下面我们在看一些例子,学习一些查询语句中常用到的技巧
SQL> SELECT e.empno 工号, e.ename 姓名, e.sal * 1.2 薪水, nvl(e.comm, 0) 绩效 2 FROM emp e; 工号 姓名 薪水 绩效----- ---------- ---------- ---------- 7369 SMITH 960 0 7499 ALLEN 1920 300 7521 WARD 1500 500 7566 JONES 3570 0 7654 MARTIN 1500 1400 7698 BLAKE 3420 0 7782 CLARK 2940 0 7788 SCOTT 3600 0 7839 KING 6000 0 7844 TURNER 1800 0 7876 ADAMS 1320 0 7900 JAMES 1140 0 7902 FORD 3600 0 7934 MILLER 1560 014 rows selected
在这个例子中展示了“字段列表”中,字段之间应使用逗号分隔,字段列表中列举了哪些字段,最终查询结果就按顺序展示哪些字段
另外查询语句中表名和字段名均可附加“别名”,这里的表emp e其中e即表别名,表别名在其出现的查询语句结构中是有作用域范围的,这个我们以后会接触到,比如例子中就在字段列表中使用了表别名,表别名后的点号(.)代表对表结构的访问,“表别名.字段名”则是指示从哪张表中取出哪个字段,这种写法在多表查询中尤为高效
除了表别名,还有列别名,即为SELECT字段列表中的列附加的别名,这个别名将会覆盖原本的列名或者表达式,出现在查询结果的“头部”
本例中,如“e.empno 工号”,e.empno是原本的字段名,而“工号”则是其列别名
这里需要强调的是,严格来讲,中文字符属于标准SQL字符集以外的字符,使用中文作为别名时其实是“引征标识符”,应当用双引号括起来标记
另外,如果遵循更为传统的语法,别名和列名或者表名之间还应该用关键字AS来连接
字段列表中还可以将原本的列进行加工,实现以某种表达式组成一个新列,如本例中的e.sal*1.2就使用了乘法,把每行中的sal字段的值提高了20%
请注意这里的乘法仅仅影响查询结果,不会对表中原本的数据造成任何改变;事实上加减乘除等算术运算符均可使用在列的表达式中
除了使用算术表达式,还可以调用标量函数,例如nvl(e.comm,0),这里的NVL就是数据库的一个标准内置函数,它可以将输入的空值替换成另一个值,当然如果输入的值不是空值,则不会发生替换
所谓函数(Function)可以理解为一个黑盒,对外提供输入端子和输出端子,而将其内部运作隐藏起来,以后我们在深入了解函数时会知道,函数可以没有输入端子,但必须有输出,哪怕是输出空值
Emp表中comm字段的实际情况是,个别没有绩效的人员,其对应行中这个字段是空的,我们这里就将空字段转换成0,以便查询结果更有意义关于空值也是一个可以展开讨论的话题,几乎所有的编程语言中都有NULL这个概念
在SQL中,NULL不是实实在在的量值,它既不是0,也不是没有内容的字符串(虽然在Oracle数据库中可以将空字串默认做NULL处理),严格上来说没有内容的字符串也是实在的量值,因为它已经拥有了数据类型的属性,而数字0就更不必说,0本身就是一个数值
NULL代表不确定,既不代表有,也不代表没有,它表示未知,表示此时不知道这个“东西”有没有内容、是什么类型,甚至不知道它到底存不存在
过分强求理解NULL的含义会给我们带来困扰,实际上NULL这个概念可以算作编程语言避免不了的一个BUG,我们最需要牢记的就是:任何数值与NULL进行数学运算,其结果还是NULL
至于算术表达式,并不局限于一个列与常量数值的运算,多个列也可组合成为算术表达式,例如e.sal+nvl(e.comm,0)就可以表达将薪资和绩效相加后,组合为一个列来显示在结果当中
查询语句默认会将结果集数据全部返回,在一些情况下,就可能包含重复的数据,这里的重复的数据是本来就存在的,不是SQL伪造的
SQL> SELECT e.deptno 2 FROM emp e;DEPTNO------ 20 30 30 20 30 30 10 20 10 30 20 30 20 1014 rows selected
例如员工表中,只检索部门编号列的话就会出现重复数据,因为一个部门往往会有多个员工
如果我们想从这张表中总结有多少个部门的时候,就可以使用DISTINCT关键字来标记,指示数据库在得到完整的结果集之后并将之输出之前做一步加工,去除重复的数据行,只保留唯一的结果
SQL> SELECT DISTINCT e.deptno 2 FROM emp e;DEPTNO------ 30 20 10
注意DISTINCT是一个语法关键字,不是函数,所以不需要在DISTINCT后面将列用括号括起来,而且只能紧跟SELECT之后出现,不能写在字段列表的中间或结尾。另外DISTINCT作用于整个字段列表,或者说结果集的整个行,
只有所有对应字段都一致的若干行才会被视作重复行处理
SQL> SELECT DISTINCT e.deptno 2 ,e.empno 3 FROM emp e;DEPTNO EMPNO------ ----- 20 7369 30 7499 30 7521 20 7566 30 7654 30 7698 10 7782 20 7788 10 7839 30 7844 20 7876 30 7900 20 7902 10 793414 rows selected
为了控制篇幅,达到最舒适的阅读效果,最后我们简简单单认识一个表来告一段落
在Oracle数据库中有一张公共表DUAL,我们通常称之为虚拟表,事实上它是sys用户下的一张表,它只有一个字段dummy,并且只有一行
Oracle会保证检索该表时只返回一行数据,这个表在将来会有很多用处
SQL> SELECT 'Hello World!' str FROM dual;STR------------Hello World!SQL> SELECT * FROM dual;DUMMY-----X
截至目前,我们对SQL查询语言的认识还停留在数据集横向的层面,下堂课我们将深入了解查询语句中WHERE的使用,它可以在查询中起到纵向控制结果数据的作用
今天的分享就到这里了,第三十一次发推没有经验,不会排版,行文也没有条理,以后估计也不会有什么长进,感谢朋友们的鼓励与支持,以后我会坚持下去,求求你们不要取关