数据库脚本文件介绍:
- 已后缀.sql结尾
- 注释:
- 单行: --开始(--这是一个注释)
- 多行:/* */ (/* 只是一个多行注释 */)
- 可以把各个对象的创建(表,序列等),以及数据的添加写到一个脚本中
- 执行脚本:
- start 脚本路径
- @脚本路径
- 从脚本的上面逐行执行,一行出错,后面继续执行
- 如果执行脚本错误,建议先删除用户,重新创建用户后再执行
- 管理员删除用户:DROP USER 用户名 CASCADE;
查询语句--简单的单表查询
准备工作
创建用户(oaec),密码oaec
授权
切换到oaec,在新的用户(oaec)下,导入数据库脚本(oaec.sql)(注:alter session set nls-data-language=english; 可以设置本次回话为英文。
小技巧:
- clear scre可以清屏
- notepad++中按Ctrl+f可以查找所需内容
单表查询:SELECT
语法:
SELECT 列名1,列名2,列名3,...,列名n
FROM 表名;
从某张表查询指定的列
注:
- 执行流程:FROM(确定数据来源)-->SELECT,确定哪些列;
- 如果查询全部列,可以用*代替,用*可读性不高,不建议使用,查询出来的列顺序语定义时一致。
- 查询时,数值型,日期型可以做算术运算,+,-,*,/
- 关于空值:代表的是未知的,不确定的,没有值(空值运算后结果还是空值) 空值转换函数: 数值型列 NVL(列,数值) :如果这个列值为空,则用这个数值代替 文本型列 NVL(列,'文本'):如果这个列值为空,则用这个文本代替
- 查询时可以给查询的列或表达式取别名 SELECT 列 [AS] 别名, 列名... 别名如果需要保持原来的大小写(默认显示大写),或者包含一些特殊字符,比如空格,可以用双引号括起来
- 查询某个列时,如果查询不重复的结果,distinct
eg1:查询部门编号,部门名
SELECT id, name
FROM s_dept;
eg2:查询区域表全部列
SELECT *
FROM s_region;
eg3:查询每个员工加薪1000后的薪资
SELECT id, salary+1000
FROM s_emp;
eg4:求每个员工包含提成后的员工总资总额
SELECT id, salary*(1+NVL(commission_pct ,0)/ 100)
FROM s_emp;
eg5: 求每个员工包含提成后的员工总资总额,取别名为sal
SELECT id AS eid, salary*(1+NVL(commission_pct ,0)/ 100) AS sal
FROM s_emp;
eg5.1:保持别名原样大小写
SELECT id AS eid, salary*(1+NVL(commission_pct ,0)/ 100) AS "sal"
FROM s_emp;
eg6:查询公司的所有部门名,相同的只保留一份
SELECT DISTINCT name
FROM s_dept;
查询子句之ORDER BY:排序
语法:
SELECT 列名1,列名2,列名3,...,列名n
FROM 表名
ORDER BY 列名 ASC|DESC, 列名 ASC|DESC;
注:
- 执行流程:FROM-->SELECT,此时确定了结果集-->ORDER BY 把数据改变位置,排序
- ASC:升序,DESC:降序, 默认是升序(即不加ASC或DESC是升序)
- 按照多列排序,首先先按照第一列排序,如果第一列相等在按第二列排序...
- null值默认为最大
- ORDER BY 子句永远在查询的最后,排序永远是最后执行
eg1:查询每个员工的编号,名字,部门编号,并按照部门编号升序排序
--升序排序演示
SELECT id, first_name, dept_id
FROM s_emp
ORDER BY dept_id ASC;
--降序排序演示
SELECT id, first_name, dept_id
FROM s_emp
ORDER BY dept_id DESC;
eg2:查询每个员工的编号,名字,部门编号,薪资,要求按照部门编号升序排序,如果部门相同,则按照薪资降序排序
--多列排序
SELECT id, first_name, dept_id, salary
FROM s_emp
ORDER BY dept_id ASC, salary DESC;
调整结果集的列宽:
- 数值型:col 名字 format 999999; 用9作站位,一个9表示一个位,前面表示有6位
- 文本型:col 名字 format a10; a+数值, 前面表示有10位
设置日期的语言:仅针对于本次会话生效
- 查询当前日期:SELECT sysdate FROM dual;
- 修改为英文语言:
- ALTER SESSION SET nls_date_language=english;
- ALTER SESSION SET nls_date_language='SIMPLIFIED CHINESE'; (改回中文)
- data常量默认形式:
- 中文下:'14-11月-18' 中文下只认识这个格式
- 英文下:'14-NOV-18' 英文下只认识这个格式
查询补充:
可以直接查询一个常量或者常量表达式:
SELECT 1+2 FROM dual; 结果为3
此时,为了满足SELECT ... FROM ..., FROM后面跟的dual(虚表)
SELECT sysdate FROM dual;
sysdate:当前系统时间,data类型
查询子句之WHERE (对行的筛选)
语法:
SELECT 列名1,列名2,列名3,...,列名n
FROM 表名
WHERE 条件
ORDER BY;
注:
- 执行流程: FROM,确定表-->WHERE,确定表的行-->SELECT,确定列,结果集确定-->ORDER BY,排序
- WHRER子句紧跟在FROM之后
- WHERE筛选,逐行判断,如果当前行条件满足,则结果集中包含,否则不包含
- 条件中的运算符:
- 比较运算符:>, >=, <, <=, =(等于), !=, <>(不等于)
- BETWEEN...AND...:在...和...之间,闭区间
- IN, IN(点值1,点值2,...)
- IS NULL:是空的,空代表未知的,不确定的,不能用等号判断(不报错,但无结果)
- LIKE:用来模糊查询的
- 通配符:
- %:可以匹配0个或多个字符
- _:可以代表任意一个字符
- 如果需要%,_表示普通的含义,可以利用转义字符
- eg:查询以 _a 开头的名字
--转义字符示例 SELECT first_name FROM s_emp WHERE first_name LIKE '\_a%' escape '\';
- eg:查询以 _a 开头的名字
- 通配符:
- NOT BETWEEN...AND...:不在...和...之间
- NOT IN
- IS NOT NULL:不是空的
- NOT LIKE
- 逻辑运算符:
- NOT: 非 取反
- AND: 与,都成立,结果才成立
- OR: 或,只要有一个成立,结果就成立
- 优先级:NOT>AND>OR
- 拼接:||
- 比较运算符:>, >=, <, <=, =(等于), !=, <>(不等于)
eg1:查询出所有薪资高于1200的员工编号,薪资
--运算符
SELECT id, salary
FROM s_emp
WHERE salary>1200;
eg2:查询薪资在1100到1450之间的所有员工编号,名字,薪资
--BETWEEN...AND...
SELECT id, first_name, salary
FROM s_emp
WHERE salary BETWEEN 1100 AND 1450;
eg3:查询部门编号为41或44或45的所有员工编号,部门编号
--IN
SELECT id, dept_id
FROM s_emp
WHERE dept_id IN(41,44,45);
eg4:查询没有提成的员工的编号,名字
--IS NULL
SELECT id, first_name
FROM s_emp
WHERE commission_pct IS NULL;
eg5:查询以a今晚的名字
--模糊查询
SELECT id, first_name
FROM s_emp
WHERE first_name LIKE '%a';
'B%':以B开头的
'%b%':包含b的
'_b%':第二个字符是b
'_b':长度是2,第二个字符是b
注:内容区分大小写
eg6:查询薪资低于1000或者薪资高于1500的所有员工id,薪资
--逻辑运算符
SELECT id, salary
FROM s_emp
WHERE salary<1000 OR salary>1500;
eg7:查询在41或44号部门,并且薪资高于1100的员工id,部门id,薪资
--逻辑运算符
SELECT id, dept_id, salary
FROM s_emp
--WHERE dept_id=41 OR dept_id=44 AND salary>1100; 会先计算AND
WHERE (dept_id=41 OR dept_id=44) AND salary>1100;
eg8:查询每个员工的项目,显示格式为:名,姓
--拼接
SELECT first_name||','||last_name
FROM s_emp;