关于oracle数据库-----基本 SQL SELECT 语句
基本SELECT语句:SELECT 标识选择哪些列。FROM 标识从哪个表中选择。----SELECT *|{[DISTINCT]column|expression[alias],...}FROM table; * 选择全部列----SELECT * FROM departments; 选择特定的列
----SELECT department_id,location_idFROM departments;
注意 SQL语言大小写不敏感。 SQL可以写在一行或者多行 关键字不能被缩写也不能分行 各子句一般要分行写。 使用缩进提高语句的可读性。算术运算符
* / + -
乘除的优先级高于加减 优先级相同时,按照从左至右运算 可以使用括号改变优先级定义空值
空值是无效的,未指定的,未知的或不可预知的值
空值不是空格或者0。空值在数学运算中的使用 包含空值的数学表达式的值都为空值列的别名: 重命名一个列。 便于计算。 紧跟列名,也可以在列名和别名之间加入关键字‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。 AS可以省略|| 连接符
把列与列,列与字符连接在一起。 用‘||’表示。 可以用来‘合成’列。重复行
默认情况下,查询会返回全部行,包括重复行,在SELECT子句中使用关键字‘DISTINCT’删除重复行
SELECT DISTINCTdepartment_idFROM employees;
where 过滤
使用WHERE子句,将不满足条件的行过滤掉。
SELECT employee_id,last_name, job_id, department_idFROM employeesWHERE department_id = 90 ;
***WHERE子句紧随FROM子句字符和日期
字符和日期要包含在单引号中。 字符大小写敏感,日期格式敏感。 l默认的日期格式是DD-MON-RR。SELECT last_name,job_id,department_idFROM employeesWHERE last_name='Whalen';
比较运算:
BETWEEN 1 AND 10 在两个值之间(包含边界)
使用BETWEEN运算来显示在一个区间内的值
SELECT last_name,salaryFROM employeesWHERE salaryBETWEEN 2500 AND 3500;
IN(set) 等于值列表中的一个
使用IN运算显示列表中的值。
SELECT employee_id,last_name, salary,manager_idFROM employeesWHERE manager_idIN (100, 101, 201);
LIKE 模糊查询
使用LIKE运算选择类似的值 l选择条件可以包含字符或数字: ?%代表零个或多个字符(任意个字符)SELECT first_nameFROM employeesWHERE first_nameLIKE 'S%';
?_代表一个字符SELECT first_nameFROM employeesWHERE first_nameLIKE 'S_';
?‘%’和‘-’可以同时使用
SELECT last_nameFROM employeesWHERE last_nameLIKE '_o%';
可以使用ESCAPE标识符选择‘%’和‘_’符号,代表取\后面字符的本意,在下面的sql语句中‘_’不代表一个字符,就代表_
SELECTemployee_id,last_name,job_id FROM employees WHERE job_id LIKE '%SA\_%'ESCAPE '\';
IS NULL 空值 使用IS (NOT)NULL判断空值。
SELECT last_name,manager_idFROM employeesWHERE manager_idIS NULL;
使用ORDERBY子句排序 ?ASC(ascend):升序 ?DESC(descend):降序 ?ORDERBY子句在SELECT语句的结尾。 ?默认是升序排序SELECT last_name,job_id,department_id,hire_dateFROM employeesORDER BY hire_date;
降序排序
SELECT last_name,job_id,department_id,hire_dateFROM employeesORDER BY hire_date DESC;
单行函数 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以转换数据类型 可以嵌套 参数可以是一列或一个值这类函数改变字符的大小写: LOWER('SQLCourse') 结果course
UPPER('SQLCourse') 结果 COURSE
INITCAP('SQLCourse') 结果 Course
字符控制函数
CONCAT('Hello','World') 结果 HelloWorld
SUBSTR('HelloWorld',1,5) 结果 Hello
LENGTH('HelloWorld') 结果 10
INSTR('HelloWorld','W') 结果 6
LPAD(salary,10,'*') 结果 *****24000
RPAD(salary,10, '*') 结果 24000*****
TRIM('H' FROM 'HelloWorld') 结果 elloWorld
replace('abcd','b', 'm') 结果amcd
日期
Oracle 中的日期型数据实际含有两个值: 日期和时间。 默认的日期格式是DD-MON-RR. 函数SYSDATE返回: 日期 时间SELECTSYSDATE FROM DUAL; 显示系统日期
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; 显示日期和时间
CASE表达式
在需要使用IF-THEN-ELSE逻辑时
CASEexprWHENcomparison_expr1THENreturn_expr1
[WHEN comparison_expr2THEN return_expr2
WHENcomparison_exprnTHENreturn_exprn
ELSEelse_expr]
END
分组函数
分组函数作用于一组数据,并对一组数据返回一个值。
组函数类型
不能在 WHERE子句中使用组函数。
AVG(平均值), COUNT(计数), MAX(最大值), MIN(最小值), SUM(合计)
可以对数值型数据使用AVG和SUM函数。
可以对任意数据类型的数据使用MIN和MAX函数。
COUNT(*)返回表中记录总数。
DISTINCT(distinct)关键字
-------------COUNT(DISTINCTexpr)返回expr非空且不重复的记录总数GROUP BY子句语法
可以使用GROUPBY子句将表中的数据分成若干组
在SELECT列表中所有未包含在组函数中的列都应该包含在GROUPBY子句中。
-------------------SELECT department_id, AVG(salary)FROM employees GROUP BY department_id ;
包含在GROUPBY 子句中的列不必包含在SELECT列表中
-------------------SELECT AVG(salary) FROM employees GROUP BY department_id ;
在GROUPBY子句中包含多个列
-------------------SELECT department_iddept_id,job_id, SUM(salary)FROM employees GROUP BY department_id, job_id ;
多表查询
使用连接在多个表中查询数据。
在 WHERE字句中写入连接条件。 在表中有相同列时,在列名之前加上表名前缀--------------------SELECT table1.column,table2.columnFROM table1, table2WHERE table1.column1=table2.column2;
表的别名
---------------------SELECT e.employee_id,e.last_name,e.department_id,d.department_id,d.location_idFROM employees e , departments d WHERE e.department_id =d.department_id;
使用别名可以简化查询。 使用表名前缀可以提高执行效率。 如果使用了表的别名,则不能再使用表的真名。子查询: 子查询 (内查询) 在主查询之前一次执行完成。 子查询的结果被主查询使用 (外查询)。注意事项 子查询要包含在括号内。 将子查询放在比较条件的右侧。 单行操作符对应单行子查询,多行操作符对应多行子查询。多行子查询
IN 等于列表中的任何一个
ANY 和子查询返回的任意一个值比较
-------在多行子查询中使用ANY操作符
--------------SELECT employee_id,last_name,job_id, salary FROM employees WHERE salary < ANY (SELECT salary FROM employees WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
ALL 和子查询返回的所有值比较
---------在多行子查询中使用ALL操作符
---------------SELECT employee_id,last_name,job_id, salary FROM employeesWHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';