查询语句SELECT时使用频率最高,用途最广的语句,它由许多子句组成,通过这些子句可以完成选择链接投影等功能,选择通过WHERE子句完成、投影通过指定列来完成
链接运算则是把两个及其以上的表链接起来,形成一个结果集合
其完整语法结构如下
SELECT
[ALL | DISTINCT ]
TOP n[PERCENT] WITH TIES select_list
[INTO [new table name]]
[FROM table_references
[WHERE where_definition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_definition]
[ORDER BY {col_name | expr | position}
[ASC | DESC] , ...]
[COMPUTE clause]
[FROM BROWSE]
简单查询
- 仅含有SELECT语句和FROM语句的查询属于简单查询,且SELECT和FROM为必填项,是所有查询都必须用到的两个子句
- SELECT子句代表想要查询的列,*号表示所有列
- FROM子句告诉我们从哪里找这些列,可以时视图也可是基本表
- 在使用SELECT查询时,可以对数字数据和日期数据进行算术运算操作,例如显示上调百分之10以后的薪资
select salary*(1+0.1) from employees
- 为了提高阅读性,可以在指定列名后面,空格加上一个新的列名,如果新的名字包含特殊字符则需要使用双引号
select salary*(1+0.1) new_salary form employees
- 如果需要删除重复出现的行则可以使用DISTINCT关键字,例如查询部门ID
select distinct department_id from employees
WHERE子句
- 该语句可以筛选从FROM中返回的结果集,完成的是选择操作,例如查询以刘姓开头的员工
select * from employees where first_name like '刘%'
- %代表任意个字符(0,1,或者多个),_代表任意一个字符
- 常用的链接运算符有AND和OR,AND表示都满足才返回,OR则为满足其中之一即可
- 在复合判断条件中,会涉及到运算符的优先级问题,可以合理的使用小括号()解决问题、
- 在ORACLE中判断一个值可能为TRUE、FALSE或者为UNKNOWN,例如查询一个值是否为20,但是对应的列是NULL,此时查询的结果就是UNKNOWN,而非FALSE
- 判断条件是否为空的时候,则需要使用IS NULL 或者 IS NOT NULL
ORDER BY子句
- 如果需要对查询出的结果集进行排序的话则可使用ORDER BY子句
- ASC为默认的,也就是默认为升序排序,DESC则为降序排序,例子对工资大于2000的员工信息进行降序排序
select * from employees where salary >= 2000 order by salary desc
- 如果需要对多个列进行排序使用逗号隔开即可,根据前后顺序依次排序
-- 如果工资相同,此时根据年龄降序排序
select * from employees where salary >= 2000 order by salary,age desc
GROUP BY子句
- 可用于在查询结果集中对记录进行分组,以汇总数据或者为整个分组显示单行的汇总信息
- 根据user_id对员工的薪资记录进行分组,然后查询员工id,平均薪资,薪资总和,最高薪资和各组的记录数
select user_id, avg(salary), sum(salary), max(salary), conut(user_id) from employees group by user_id
- 必须满足的条件,SELECT子句后面只能有两类条件:统计函数和进行分组的别名,SELECT子句的
- 列名必须是进行分组的列,除此之外添加其他的列都是不允许的,但是GROUP BY子句后面的列名可以不出现在SELECT子句中
- 如果使用WHERE子句,那么所有参加分组计算的数据必须先满足WHERE指定的条件
- 默认情况下,会根据GROUP BY子句指定的分组进行升序排列,如果需要改变,可以使用ORDER BY子句指定新的排列顺序
- 与ORDER BY子句类似,GROUP BY子句也可以对多个列进行分组,在这种情况下,GROUP BY子句在主范围内可以进行二次分组
- GROUP BY子句还可以使用ROLLUP 或者 CUBE,这两个的功能极其相似,在GROUP BY子句使用它们后,将会在查询结果中附加一行汇总信息
HAVING 子句
- 通常和GROUP BY子句一起使用,在完成分组统计结果后,可以使用HAVING子句对分组的结果进行进一步的筛选
- HAVING子句与组有关,而WHERE子句与行有关