自己学习 Oracle 的相关笔记, 主要备忘, 并不详细, 如有错误欢迎大家指正~~~
SELECT 查询
SELECT 基础查询
基本语法:
SELECT[DISTINCT | ALL] select_list FROM table_list[where_clause][group_by_clause][HAVING condition][order_by_clause]
SELECT: 查询必备关键字
-[DISTINCT | ALL]: 查询记录中是否除去重复记录
select_list: 需要查询的字段列表, 一个或多个
-[where_clause]: WHERE 条件查询
-[group_by_clause]: GROUP BY 子句
-[HAVING condiition]: HAVING 子句
-[order_by_clause]: 排序语句
SELECT * FROM student -- 查询 student 表中所有数据;
SELECT student_id,student_name FROM student -- 查询 student 表中 student_id 和 student_name;
select student_id as 学号, student_name as 姓名 from student -- 使用别名代替, AS 也可直接用空格代替;
select math_score 数学成绩, english_score 英语成绩, math_score+english_score as 总成绩 from student_scores-- 表达式查询;
select distinct(student_id) from student-- 去重;
SELECT 排序数据
语法:
- ORDER BY {
- expr | position | c_alias
- } [ASC | DESC][NULL FIRST | NULL LAST][, {
- expr | position | c_alias
- } [ASC | DESC][NULL FIRST | NULL LAST]]...
ORDER BY: 排序关键字
expr: 表达式
position: 表中列的位置
c_alias: 别名
-[ASC | DESC]: 升序或降序
-[NULL FIRST | NULL LAST]: 对空字符串的处理, 在前或在后, 默认 NULL 为最大值
select math_score 数学, english_score 英语, math_score+english_score 总成绩 from student_scores order by 总成绩 desc;-- 默认为升序排列
select * from student_scores order 2;-- 按照 2 位置字段排序
select * from student_scores order by 2 desc, 3 desc;-- 按多字段排序
SELECT+WHERE 字句查询
WHERE 子句中的操作符
关系操作符:<,>,=,<=,>=,!=,<>
比较操作符:
IS NULL: 如果为 NULL 返回 TRUE
LIKE: 模糊比较字符串值
BETWEEN...AND...: 验证值是否在范围内
IN: 验证操作数在设定的一系列值中
逻辑操作符:
AND : 两个条件都必须满足
OR: 满足其中一个条件即可
NOT: 与某个逻辑值相反
语句示例:
- SELECT * FROM student_scores WHERE math_score > 92;
- SELECT * FROM student_scores WHERE math_score > 92 AND english_score > 98;
- SELECT * FROM student_scores WHERE math_score BETWEEN 90 AND 92;
- SELECT * FROM student_scores WHERE math_score > 90 OR english_score > 1000;
SELECT * FROM student WHERE student_name LIKE '%T%'--_代替一个字符, % 代替多个字符;
SELECT * FROM student_scores WHERE student_id IN(1, 2);
GROUP BY 和 HAVING
GROUP BY 用于组的查询, 使用分组查询可以统计数据
语法:
GROUP BY
{expr -- 通常为列名
| {ROLLUP | CUBE} --GROUP BY 的扩展子句, 返回小计和总计
- ({expr [.expr]...})
- }
示例
SELECT class_id,AVG(math_score) FROM student_scores GROUP BY class_id;
HAVING 通常和 GROUP BY 一起使用, 用于限制搜索条件, 与组相关而不与单个值相关
SELECT class_id,AVG(math_score) FROM student_scores GROUP BY class_id HAVING AVG(math_score)>95;
SELECT 子查询
子查询指嵌套查询, 多数为 WHERE 后一个条件表达式
- select * from student_scores where student_id = (select student_id from student_scores where math_score = 90);
- select student_id from student_scores where student_id in (select student_id from student_scores where math_score > 90 AND english_score > 95);
SELECT 连接查询
多表数据联系查询
简单连接
SELECT * FROM student,student_scores;
内连接
等值连接(含'=')
select s.class_id,s.student_name,sc.math_score,sc.english_score from student s,student_scores sc where s.student_id=sc.student_id;
不等值连接
含>,<,>=,<=,!=,<>,BETWEEN...AND...,IN 等
select s.class_id,s.student_name,sc.math_score,sc.english_score from student s,student_scores sc where s.student_id in sc.student_id;
自连接
把自身表的引用作为另一个表来处理
select s.class_id,sc.english_score from student_scores s,student_scores sc where s.class_id!=sc.class_id AND sc.english_score=s.english_score;
外连接
左外连接(LEFT JOIN)
左向外连接, 返回的结果不仅是符合连接条件的行记录, 还包含左边表的全部记录
右外连接(RIGHT JOIN)
右向外连接, 将右边表中数据与左边表中数据匹配, 返回的结果除了配备成功的记录, 还有右表中为匹配的记录, 并将左表补 NULL
全外连接(FULL JOIN)
左右外连接的综合, 未匹配的都补 NULL
外链接中的(+)<符号形式表示外连接>
放在非主表的一方 (左外连接(+) 放在右表), 并使用 where 子句, 不使用 OUT JOIN;
不能用于全外连接
若外连接有多个条件, 则每个条件后都要加一个(+)
来源: http://www.jianshu.com/p/94c1565fde98