-- 注意:记得经常ctrl+s保存
/*
主要任务:
一、Oracle简介
二、基本查询语句
服务器地址:win+r \\192.168.1.101
Oracle环境:
桌面:PLSQL Developer 14 (64 bit)软件
新建=>SQL窗口=> ctrl+s
*/
SELECT * FROM employees;
/*
二、数据库简介
DB:数据库,存储数据
DBMS:数据库管理系统,负责管理数据库中的数据。orace属于数据库管理系统
RDBMS:关系型数据库管理系统(Oracle,Mysql,SqlServer....)
NoSQL:非关系型数据库管理系统(Redis)
常见的关系型数据库:
oracle:
- 功能最强大的数据库
- 收费,闭源(源代码不开放) 个人免费
- 政治因素也能影响!俄乌大战:制裁Oracle
mysql:
- 功能齐全,处理能力没有Oracle那么强
- 免费,开源
- 中小型企业,使用比例越来越高了!
共同点:1)关系型数据库,语法接近
2)同属于一家公司(甲骨文Oracle),Java也属于甲骨文公司
google:安卓->Java
*/
/*
三、基本查询语句
准备:默认电脑已经安装了数据库,直接查询就可以了
employees: 员工表,记录很多员工相关的字段的信息
employee_id:员工编号,唯一值
first_name:姓
last_name:名
email:邮箱
phone_number:电话
hire_date:入职日期
job_id :工作岗位
salary :工资
commission_pct:奖金系数
manager_id :上级领导ID
department_id:属于哪一个部门
departments:部门记录表
department_id :部门的编号,也是唯一值
department_name:部门的名称
manager_id :部门的领导
location_id :部门的地址
*/
-- 建议:学SQL 一定记住语法和关键字。然后在灵活运用
SELECT * FROM employees;
SELECT * FROM departments;
/*
四、基本SELECT语句
4.1 语法
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table;
SELECT:查询指定的列(字段)信息
FROM:从那张表查询
DISTINCT:去重
column:表示要查询的具体字段
expression:表示可以进行相关的运算,固定值
alias:别名
*:表示所有的字段
|:语法中,表示或者意思
{}:语法中,整个部门
[]:语法中,表示可以省略
*/
SELECT * FROM employees t;
SELECT t.*,last_name FROM employees t;
SELECT last_name,salary,salary+10000,1+2,'天珑' address FROM employees;
-- 1.查询所有的列
SELECT * FROM employees;
-- 2.查询指定的列
-- 1)多个列之间使用 逗号隔开(所有的符号,要在英文状态下)
-- 2)最后一个列,不需要使用逗号
-- 需求:查询所有员工的编号,姓名,岗位,工资信息
SELECT
employee_id,last_name,job_id,salary
FROM employees;
-- 3.注意事项
-- 1)SQL语句不区分大小写,但是一般:关键字建议大写; 自己取名(表名,列名):小写
-- 2)QL 可以写在一行或者多行,每条SQL语句之间使用分号隔开
-- 3)关键字不能被缩写也不能分行
-- 4)使用缩进提高语句的可读性,字句可以分行写!
-- 4.表达式 expression
-- 1)查询的列支持表达式
-- 2)可以对指定列 进行算术运算(+ - * /)
-- 3)使用()指定运算符的优先顺序
--- 4)运算符执行顺序:先乘除、后加减,如果同级从左到右执行,()改变优先级
SELECT
employee_id,last_name,job_id,salary,salary+1000*2,(salary+1000)*2
FROM employees;
-- 5.字段 取别名
-- 1)关键字AS,但是AS可以省略
-- 2)别名中使用 双引号 "",双引号字母保持原来的大小写,支持存在空格
SELECT
employee_id 员工编号,last_name 员工姓名,job_id 岗位,salary 工资,
salary+1000*2 "new_salary" ,(salary+1000)*2 new_salary2
FROM employees;
-- 6.连接符号|| 将多个字段 变成一个字段
SELECT
employee_id,last_name||first_name username,job_id,salary
FROM employees;
-- 7.字符串
-- 1)字符串可以是 SELECT 列表中的一个字符,数字,日期。
-- 2)日期和字符只能在单引号中出现。
-- 3)每当返回一行时,字符串被输出一次。
SELECT
employee_id,last_name||'-'||first_name username,job_id,salary,
112233,44,55,66,'abc','-'
FROM employees;
-- 8.查询员工所有的岗位信息
-- 1)默认不写关键字是ALL:显示所有记录
-- 2)DISTINCT:去除重复记录
-- 3)只有当记录中所有的列都相等,才会看成一个重复值
SELECT DISTINCT employee_id, job_id
FROM employees;
--------------------------------过滤数据------------------------------
-- 1)使用WHERE 子句,将不满足条件的行过滤掉
-- 2)WHERE 子句紧随 FROM 子句,如果不使用 WHERE表示查询整个表中所有的记录
-- 3)语法:SELECT *|{[DISTINCT] column|expression [alias],...}
-- FROM table
-- [WHERE condition(s)];
-- 过滤指定行的数据
-- 例如:查询工资大于等于15000的员工信息
SELECT
employee_id,last_name,job_id,salary
FROM employees
WHERE salary >=15000;
-- 1.WHERE条件中使用字符串
-- 需求:查询所有last_name等于 king的员工
-- 注意:
-- 1)字符和日期必须放在单引号里面
-- 2)单引号里面如果是字符,那么区分大小写
-- 3)单引号里面如果是日期,那么必须按照指定格式来访问(DD-MON月-YY 17-6月-03 )
/*
真实的日期格式:
默认的格式: DD-MON月-YY 17-6月-03
帮我们展示的格式:2003/6/17
使用的时候:需要默认的格式 17-6月-03
中文环境的月份:6月 17-6月-03
英文环境下月份:英文月份缩写
*/
SELECT
employee_id,last_name,job_id,salary
FROM employees
WHERE LAST_NAME = 'King';
SELECT *
FROM employees
WHERE hire_date= '17-6月-2003';
--- 比较运算符
/*
= :等于
> :大于
>= :大于等于
< :小于
<= :小于等于
<> :不等于
!= :不等于
*/
-- 例如:查询工资大于等于15000的员工信息
SELECT
employee_id,last_name,job_id,salary
FROM employees
WHERE salary <> 17000;
-----逻辑运算符-----------
-- and :并且,多个同时满足
-- or :或者,主要有一个满足即可
-- not : 相反
-- 例如:查询工资大于等于10000,小于等于15000之间的员工信息
SELECT
employee_id,last_name,job_id,salary
FROM employees
WHERE salary>=10000 AND salary<=15000;
SELECT
employee_id,last_name,job_id,salary
FROM employees
WHERE salary>=10000 AND salary<=15000;
SELECT
employee_id,last_name,job_id,salary
FROM employees
WHERE NOT salary>=10000;
-- 优先级:
/*
1 算术运算符 + - * /
2 连接符 ||
3 比较符 > >= < <=
4 IS [NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 NOT
7 AND
8 OR
and会有限执行。
注意:推荐使用()主动的区分执行顺序
*/
--29:请查询职位是 “SA_REP” 或“ST_CLERK”,且月薪不是 $2500、$3500、$7000 的员
SELECT *
FROM employees
WHERE (job_id = 'SA_REP' OR job_id = 'ST_CLERK') AND salary not in(2500,3500,7000);
--3.其他比较运算符
-- BETWEEN ...AND... :表示两者之间,注意:1)包括前后的值 2)小的写前面
-- IN(set) :在指定set里面的所有值
-- LIKE :模糊查询
-- IS NULL :为空,不能直接使用 =
-- 例如:查询工资大于等于10000,小于等于15000之间的员工信息
SELECT
employee_id,last_name,job_id,salary
FROM employees
WHERE salary>=10000 AND salary<=17000;
SELECT
employee_id,last_name,job_id,salary
FROM employees
WHERE salary between 10000 AND 17000;
-- IN(set) 在指定set里面的所有值
-- 请查询职位是 “SA_REP” 或“ST_CLERK”
SELECT *
FROM employees
WHERE job_id = 'SA_REP' OR job_id = 'ST_CLERK';
-- 结果一样
SELECT *
FROM employees
WHERE job_id IN ('SA_REP','ST_CLERK');
-- IS NULL | IS NOT NULL 不能使用 =null语法
-- 注意:空字符 '' 和 0 都不是NULL
-- 需求:查询所有没有奖金的员工
SELECT *
FROM employees
WHERE commission_pct IS NULL;
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL;
--- LIKE:模糊查询,需要搭配 % _
-- %: 表示任意个字符
-- _: 表示单个字符
-- 1)查询姓名 K 开头的所有员工信息
SELECT *
FROM employees
WHERE last_name LIKE 'K%';
-- K开头,并且长度是4
SELECT *
FROM employees
WHERE last_name LIKE 'K___';
-- 查询包含m的数据
SELECT *
FROM employees
WHERE last_name LIKE '%m%';
-- 查询姓名 第二个字母 是a的所有员工信息
SELECT *
FROM employees
WHERE last_name LIKE '_a%';
-- 转义符:将关键字转为普通符号
-- 关键字: escape
-- % 和 _ 表示是一个关键字
-- 有些场景中我们就需要把他当成一个普通字符
-- 需要用到转义符:
-- 需求:查询last_name中包含 _ 的所有员工的信息
SELECT *
FROM employees
WHERE last_name LIKE '%\_%' ESCAPE '\';
-- 第三个字母是_ 下划线的信息
SELECT *
FROM employees
WHERE last_name LIKE '__\_%' ESCAPE '\';
-----------------------------------排序:ORDER BY -------------------------
/*
1.简介
表示根据指定的规则,对结果进行排序
默认ASC表示升序,DESC:降序
2.语法
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table
[WHERE condition(s)]
[ORDER BY {column, expr, alias} [ASC|DESC]];
*/
-- 1.根据薪资进行排序(降序)
SELECT *
FROM employees
ORDER BY salary DESC;
-- 2.可以给多个字段排序
-- 优先满足靠前的排序规则,如果相同 排序后面的字段
-- 需求:首先根据部门升序排序,根据薪资降序排序
SELECT *
FROM employees
ORDER BY department_id ASC,salary DESC;
-- 按照别名排序
SELECT employee_id,last_name,salary,salary*12 nn
FROM employees
ORDER BY nn DESC;
-- 查询部门部门编号为 40,50,60的员工信息,并且根据salaay进行降序排序
-- 有WHERE的SQL语句一定把WHERE 放到 FROM后面
SELECT *
FROM employees
WHERE department_id IN(40,50,60)
ORDER BY salary DESC;
--1:查询雇员表中所有信息
select * from employees;
--2:查询雇员编号, 姓名, 工作, 工资
select employee_id,first_name,last_name,job_id,salary
from employees;
--3:查询雇员编号, 姓名, 工作, 工资, 列标题需显示中文
select employee_id "雇员编号",last_name "姓名",job_id "工作",salary "工资"
from employees;
--4:消除重复列, 查询雇员工作种类
select distinct job_id from employees;
--5:查询所有雇员编号, 姓名, 工作
select employee_id,last_name,job_id
from employees;
--6:查询雇员编号, 姓名, 工作, 年薪
select employee_id,last_name,job_id,salary
from employees;
--7:查询工资大于 1500 的雇员所有信息
select *
from employees
where salary>1500;
--8:查询可以得到奖金的雇员所有信息
select *
from employees
where salary>0 and salary is not null;
--9:查询工资大于 1500 或可以得到奖金的雇员
select *
from employees
where salary>0 and salary is not null;
--10:查询工资大于 1500 并且可以领取奖金的雇员
select *
from employees
where salary>1500 and commission_pct>0 and commission_pct is not null;
--11:查询工资不大于 1500 或者不可以领取奖金的雇员
select *
from employees
where salary<=1500 or commission_pct is null;
--12:查询工资在 1500 到 3000 的所有雇员信息
select *
from employees
where salary between 1500 and 3000;
--13:查询在 2003 年雇用的员工信息
select *
from employees
where hire_date between '1_1月_2002' and '31_12月_2002';
--14:查询雇员姓名中第二个字母为 “o” 的雇员信息
select *
from employees
where last_name like '_o%';
--15:查询雇员工资中带 8 这个数字的
select *
from employees
where salary like '%8%';
--16:查询编号是 100,110,120,130 的雇员信息
select *
from employees
where employee_id in (100,110,120,130);
--17:查询雇员编号不是 100,110,120,130 的所有雇员信息
select *
from employees
where employee_id not in (100,110,120,130);
--18:查询雇员编号为 130 的雇员信息
select *
from employees
where employee_id=130;
--19:查询雇员编号不为 130 的雇员信息
select *
from employees
where employee_id !=130;
--20:查询雇员信息, 按工资由低到高排序
select *
from employees
order by salary asc;
--21:查询雇员信息, 按工资由高到低排序
select *
from employees
order by salary desc;
--22:HR 需要得到一个月薪资 $12000 以上的员工名 (last_name)和薪水报告, 请完成查询
select last_name,salary
from employees
where salary>12000;
--23:HR 需要识别高收入和低收入员工群体不在5000到12000之间的
select *
from employees
where salary not in (5000,12000);
--24:请查询没有领导的员工名和职位
select last_name,job_id
from employees
where manager_id is null;
--25:请查询有奖金的员工名和月薪、奖金,并按奖金系数排降序
select last_name,salary,commission_pct*salary "奖金"
from employees
order by commission_pct desc;
--26:请查询月薪大于 1000 的员工名和月薪
select last_name,salary
from employees
where salary >1000;
--27:请查询第三个字母是 a 的员工名
select last_name
from employees
where last_name like '__a%';
--28:请查询员工名包含 a 或 e 的员工名
select last_name
from employees
where last_name like '%a%'or last_name like '%e%';
--29:请查询职位是 “SA_REP” 或“ST_CLERK”,且月薪不是 $2500、$3500、$7000 的员工信息
select *
from employees
where job_id in('SA_REP','ST_CLERK')and salary not in (2500,3500,7000);
--30:请查询奖金系数是 20% 的员工名、薪水和奖金系数
select last_name,salary,commission_pct
from employees
where commission_pct=0.2;
--31:查询部门 30 中的所有员工信息_
select *
from employees e
where e.department_id=30;
--32:列出所有办事员 (CLERK) 的姓名, 编号和部门编号
select last_name,employee_id,department_id
from employees
where job_id ='ST_CLERK';
--33:找出部门 110 中所有经理 (MGR) 和部门 50 中所有办事员 (CLERK) 的详细资料
select *
from employees e
where (e.department_id=110 and e.job_id like '%MGR') or (e.department_id=50 and e.job_id like '%CLERK');
--34:找出部门 110 中所有经理 (MGR), 部门 50 中的所有办事员 (CLERK), 既不是经理又不是办事员但薪金大于或等于 8000 的所有员工的详细资料
select *
from employees e
where (e.department_id=110 and e.job_id like '%MGR') or (e.department_id=50 and e.job_id like '%CLERK')
or((e.job_id not like '%MGR' and e.job_id not like '%CLERK') or salary >= 8000);
--35:找出收取佣金的员工的不同工作
select distinct job_id
from employees
where commission_pct > 0;