1、select语句执行步骤
- from子句。根据from子句创建工作表,如果from子句中有多个表,则进行多个表的连接
- where子句。在步骤1 的结果基础上,删除不满足where条件的行
- group子句。对步骤2的结果进行分组,每个组的group by字段有相同的值
- having 子句。将步骤3的结果作为基础,进一步删除不满足having子句的记
- select子句。在步骤4的执行结果基础上,删除不在select子句中的列
- order by子句。对5的结果进行排序
- 对于交互式的select语句,在屏幕上显示结果,对于嵌入式的sql,使用游标将结果传递到宿主程序中
2、基本表(teacher)
3、使用distinct关键字去除重复信息
eg1:
结果:
使用distinct关键字查询:
结果:
- 比较上述两个查询可以看出:使用distinct关键字对查询的结果进行了排序,实际上它的的执行过程就是首先对查询结果进行排序,再去除重复值。也就是说使用distinct是要付出代价的,排序再去重的过程甚至比查询本身更加费时。
- 另外使用distinct关键字进行去重时,如果select后面有多个字段,则只有多个字段都相同时才算作重复的列进行去除。
4、排序查询的结果
上除查询可以改成:
其中的4和2代表order by中的列在select语句中出现的次序。这种用法只能用于order by子句中的排序列刚好出现在select子句中的情况。
查询结果:
由查询结果可知:
- 系统根据order by后面的列表col1,col2,col3顺序进行排序。先按col1的顺序进行排序,如果col1相同时候 ,这些相同信息再按照col2的的顺序进行排序
- 某些情况可以采用序号替代列名
- NULL值被看成最小,如上述在sex为女的一组内,按照sal排序时候,sal为NULL的值行排在这一组的最上方
5、where子句
(1)比较运算符用于数值
eg:where sal<>1200
(2)比较运算符用于字符串
eg: where dname>='计算机'
(3)between用于数值和字符串
eg:where dname between '计算机'and '生物'(包括dname为’计算机‘和’生物‘的记录在内)
(4)对NULL值的判断
null参与算术运算,则该算术运算的结果为null;
参与比较运算,结果为false;
参与聚集函数运算,则除了count(*)外,其他聚集函数都忽略null
如果要查询某列为null或者不为null的记录,应该用is null或者is not null
eg:要从teacher表中查询工资不为空的教师姓名,工资,年龄,性别信息
结果为:
而不要写成
这种写法,将null用于比较运算符,结果为false,即null<>null结果为false,且null=null结果还是false
则查询的结果只有列名,没有数据,如下图: