结构化查询语言SQL 关系数据库语言
单表查询
LINESIZE PAGESIZE SHOW SET
SELECT EXTRACT(YEAR FROM SYSDATE) CREENT_YEAR FROM DUAL;
SELECT SNO,EXTRACT(YEAR FROM SYSDATE)-AGE FROM S;
别名可用双引号括起来
SELECT DISTINCT SPEC FROM S;
字符串常量和日期常量用一对单引号括起来
LIKE %代表任意长的字符串 _代表任意单个字符 通配符:% _
ORDER BY ASC升序排序(默认) 含有空值的行位于最后面
DESC降序排序 含有空值的行位于最前面
组函数COUNT() SUM() AVG() MAX() MIN()
SELECT DISTINCT COUNT(DISTINCT SNO) FROM SC;
分组查询:在包含GROUP BY子句的查询语句中,SELECT子句后面的所有字段列表(除组函数外),均应该包含在GROUP BY子句中,即所选项与分组的一致性。
WHERE作用于基本表或视图,从中选择满足条件的元组;
HAVING作用于组,从中选择满足条件的组。
SELECT 投影
FROM 连接
WHERE 选取
GROUP BY 分组
HAVING 去组
ORDER BY 排序
函数
SELECT EXTRACT(YEAR FROM SYSDATE) CREENT_YEAR FROM DUAL;
SELECT SNO,EXTRACT(YEAR FROM SYSDATE)-AGE FROM S;
系统日期SYSDATE
修改会话系统日期格式:ALTER SESSION SET NLS_DATE_FORMAT=‘YYYY-MM-DD HH24:MI:SS’;
获取系统日期 SYSDATE 年月日SELECT TO_CHAR(SYSDATE,‘YYYY’) FROM DUAL;
字符串函数:LOWER() UPPER() SELECT LOWER(‘ANM’) FROM DUAL;
其他函数:NVL(expr1,expr2):如果expr1=null,返回expr2;否则返回expr1
多表查询
无条件连接 笛卡尔乘积
SELECT * FROM S,SC WHERE S.SNO=SC.SNO;
SELECT * FROM S JOIN SC ON S.SNO=SC.SNO;
SELECT SNAME,CNAME,GRADE FROM S,C,SC WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND SC.CNO=2 AND (GRADE BETWEEN 70 AND 90);
SELECT SNAME,CNAME,GRADE FROM (S JOIN SC ON S.SNO=SC.SNO) JOIN C ON SC.CNO=C.CNO WHERE SC.CNO=2 AND (GRADE BETWEEN 70 AND 90);
外部连接
SELECT S.SNO,SNAME,SEX,AGE,SPEC,SDEPT,CNO,GRADE FROM S,SC WHERE S.SNO=SC.SNO (+);
SELECT S.SNO,CNO,GRADE FROM S,SC WHERE S.SNO=SC.SNO(+) AND CNO(+)=2;
SELECT S.SNO,SNAME,SEX,AGE,SPEC,SDEPT,CNO,GRADE FROM S FULL OUTER JOIN SC ON S.SNO=SC.SNO AND CNO=2;
SELECT S.SNO,SNAME,SEX,AGE,SPEC,SDEPT,CNO,GRADE FROM S FULL OUTER JOIN SC ON S.SNO=SC.SNO WHERE CNO=2;
嵌套查询
子查询的结果用于建立主查询的查找条件
子查询不能有ORDER BY子句
子查询选出的记录不显示
IN ANY ALL EXISTS
子查询在不同的位置上
a. WHERE子句中
b. FROM后面
c. SELECT后面
相关子查询 (子查询的查询条件用了父查询表中的属性值)
查询次数 由父查询表的行数决定
SELECT SNAME FROM S WHERE EXISTS(SELECT * FROM SC WHERE SNO=S.SNO AND CNO=1);
目标列表达式通常用*,给出列名无实际意义
传统集合运算的实现
并UNION (ALL)自动删除重复元组
交INTERSECT
差EXCEPT