版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Oracle基础学习
大型关系数据库
system
dhee
://IP:5560/isqlplus
导入数据库脚本:@脚本路径
所有的关系数据对表的操作使用的差不多上SQL语句
杳询表使用SQL语句中的SELECT语句
差不多SELECT语句:
SELECT列名洌名,……|*|算术表达式
FROM表名
-查询employees表中所有职员的last_name,salary
SELECTLAST_NAME,SALARY
FROMEMPLOYEES;
Selectlast_name,salary
Fromemployees;
一查询departments表中所有部门的信息
SELECT*
FROMDEPARTMENTS;
--算术运算符:+,*,!
+:只有加法运算的功能,没有连接作用
/:
SELECT5/2
FROMDUAL;
-查询employees表中所有职员的last_name,job_id,salary,年薪(salary*12)
SELECTLAST_NAMEJOB_ID,SALARY,SALARY*12
FROMEMPLOYEES;
列别名
1.列名列别名
2.列名AS列别名
注意:当列别名要区分大小写,或者列别名中包含了专门字符,或者列别名为关键时,需要
将别名放在一对双引号中
双引号在关系数据库中表示列别名
*/
SELECTLAST.NAME"USER"J0BJD.SALARY,SALARY*12AS"YEARSAL"
FROMEMPLOYEES;
一字符串:一对单引号
SELECT'DHEE'AS名字;大连,AS"city"
FROMDUAL;
-连接符:||
SELECTFIRST_NAME|r,'||LAST_NAMEAS姓名
FROMEMPLOYEES;
-屏蔽查询结果中重复记录:DISTINCT
SELECTDISTINCTJOBJD
PROMEMPLOYEES;
SELECTDISTINCTJOB」D,SALARY
FROMEMPLOYEES;
-过滤与排序
-过滤:WHERE子句
SELECT
FROM
[WHERE条件];
一兖询employees表中50号部门职员的last_name,salary,depar(menl_id
SELECTLAST_NAME,SALARY.DEPARTMENT_ID
FROMEMPLOYEES
WHEREDEPARTMENT_1D=5O;
--查询employees表中所有工资大于10000的职员的Iast_name,job_id,salary
SELECTLAST_NAME,JOB」D,SALARY
FROMEMPLOYEES
WHERESALARY>10000;
一查询employees表中king职员的employee_id,salary,department_id
SELECTEMPLOYEE_ID,SALARY,DEPARTMENT_ID
FROMEMPLOYEES
WHERELAST_NAME='King';
-查询条件为字符串时,查询的值必须放在一对单引号中,同时查询的内容区分大小写
—查询employees表中哪些职员的职位(job_id)为it_prog,显示这些职员的
last_namc,job_id,salary
SELECTLAST_NAME,JOBJD,SALARY
FROMEMPLOYEES
WHEREJOB_ID='IT_PROGr;
SELECTLAST_NAME,HIRE_DATE
FROMEMPLOYEES
WHEREHIRE_DATE=,07-6月-94:
-查询条件为口期类型时,查询的值必须放在一对单引号中,同时口期格式必须为Oracle默
认的日期格式。
-Oracle默认的日期格式为:DD-MON-RR
--查询employees表中97年以后入职的职员的last」iame.hire_date(包含97年)
SELECTLAST_NAME,HiRE_DATE
PROMEMPLOYEES
WHEREHIRE_DATE>='Oi-l月5;
--BETWEEN...AND…:使列大于等于一个值,同时小于等于另一个值1包含边界值)
一前旬employees表中工资在9000到12000的职员的lasl_name,salary
SELECTLAST_NAME,SALARY
FROMEMPLOYEES
WHERESALARYBETWEEN9000AND12000;
-查询employees表中95年到97年入职职员的Iasl_name,hire_dale(包含95年与97年)
SELECTLAST_NAME,HIRE_DATE
FROMEMPLOYEES
WHEREHIRE_DATEBETWEEN'01-1月-95,AND31-12月-97,;
-IN(值列表):使列与列表中任意一个值进行匹配
一查询employees表中在20,50,90部门「作的职员的last_name,salary,department_id
SELECTLAST_NAME.SALARY,DEPARTMENT_ID
FROMEMPLOYEES
WHEREDEPARTMENT_1DIN(20,50,90);
-查询employees表中职位(job_id)为ic_prog或st_clerk或sa_rep的职员的
last_namejob_id,salary
SELECTLAST_NAME,JOBJD,SALARY
FROMEMPLOYEES
WHEREJOB」DIN('IT_PROG',ST_CLERK',SA_REP');
--LIKE:模糊查询
SELECTLAST_NAME,SALARY,DEPARTMENT_ID
FROMEMPLOYEES
WHEREDEPARTMENT_iD=20ORDEPARTMENT_ID=50ORDEPARTMENT」D=90;
一查询employees表中last_name中包含A(不区分大小写)的职员的last_name
SELECTLAST_NAME
FROMEMPLOYEES
WHERELAST_NAMELIKE'%A%'ORLAST_NAMELIKE'%a%';
一查询employees表中工资在5000-12000之间,同时在20或50号部门工作的职员的
last_name,salary,department_id
SELECTLAST_NAME,SALARY,DEPARTMENT_ID
FROMEMPLOYEES
WHERESALARYBETWEEN5000AND12000ANDDEPARTMENT」DIN(20,50);
SELECTLAST_NAME,SALARY,DEPARTMENT_ID
PROMEMPLOYEES
WHERE(SALARY>=50(i0ANDSALARY<=12000)AND(DEPARTMENT_ID=20OR
DEPARTMENT_ID=50);
一行询employees表中工资不在9000-12000之间的职员的lasl_name,salary
SELECTLAST_NAME,SALARY
FROMEMPLOYEES
WHERENOTSALARYBETWEEN9000AND12000;
一排序:ORDERBY子句
SELECT3
FROMI
[WHERE]2
(ORDERBY排序列]4
升序:ASC,默认为升序
降序:DESC
*/
SELECTLAST_NAME,SALARYAS"sal”
FROMEMPLOYEES
WHERESALARY〉10000
ORDERBY"sal"DESC;
SELECTLAST_NAME,HIRE_DATE
FROMEMPLOYEES
ORDERBYHIRE_DATEDESC;
SELECTLAST_NAME
FROMEMPLOYEES
ORDERBYLAST_NAMEDESC;
1.ORDERBY后面能够放列名
2.ORDERBY后面能够放列别名(注意大小写)
3.ORDERBY后面能够放查询结果中列的序号
*/
一查询employees表中所有职员的lasl_name,job_id,depar【mem_id,salary,结果按部门升序,工
资降序排序
SELECTLAST_NAME,JOBJD,DEPARTMENT_ID,SALARY
FROMEMPLOYEES
ORDERBYDEPARTMENT"ASCNULLSFIRST,SALARYDESC;
SELECTLAST.NAME,JOBJD,DEPARTMENT_ID,SALARY
FROMEMPLOYEES
ORDERBYDEPARTMENT_IDDESCNULLSLAST,SALARYDESC;
-NULLSFIRST/NULLSLAST
--单行函数:
SELECTLAST_NAME,UPPER(LAST_NAME)--将参数的值变为大写
FROMEMPLOYEES;
SELECTLAST_NAME,LOWER(LAST_NAME)—将参数的值变为小写
FROMEMPLOYEES;
--查询employees表中last_name中包含A(不区分大小写)的职员的last_name
SELECTLAST_NAME
FROMEMPLOYEES
WHEREUPPER(LAST_NAME)LIKE'%A%';
SELECTLAST_NAME
FROMEMPLOYEES
WHERELOWER(LAST_NAME)LIKE'%a%';
SELECTINITCAPCabcabc!ABC#ABC$ABC%ABC・・・AABC)--将单词的单字母变为大写
FROMDUAL;
SELECTLAST_NAME,LENGTH(LAST_NAME)
FROMEMPLOYEES;
SELECTLENGTHC中国)-求字符数
FROMDUAL:
SELECTLENGTHBf中国')一求字节数
FROMDUAL;
SELECTLAST_NAME,SUBSTR(LAST_NAME,3)--截取字符串:从第N位开始截取一宜截
取到最后
FROMEMPLOYEES;
SELECTLAST_NAME,SUBSTR(LAST_NAME,3,2)-截取字符串:从第N位开始截取,械取
指定长度的字符串
FROMEMPLOYEES;
SELECTLAST_NAME,SUBSTR(LAST_NAME,-3)-截取字符串:从倒数第N位开始截取一
直截取到最后
FROMEMPLOYEES;
SELECTLAST_NAME,SUBSTR(LAST_NAME,-3,2)--截取字符串:从倒数第N位开始截取,
械取指定长度的字符串
FROMEMPLOYEES;
SELECTLAST_NAME,INSTR(LAST_NAME,'a>-在第一个参数中查找第二个参数首次显现
的位置,没找到返回0
FROMEMPLOYEES;
--显示第一个参数,并用第二个参数指定第一个参数的长度,假如第一个参数的长度不够用
第三个参数在左/右边补齐长度
SELECTLAST_NAME,LPAD(LAST_NAME,20,'$'),RPAD(LAST_NAME,20,'$')
FROMEMPLOYEES;
SELECTLAST_NAME.REPLACE(LAST_NAME:a','「)一将第一个参数中显现的第二个参数
用第三个参数替换掉
FROMEMPLOYEES;
SELECTTRIM('ABCABC')AS”A"—删除字符串左右显现的空格
FROMDUAL;
SELECTTRIM('A'FROM,AAABACAAA>-删除字符串左右显现的指定的字符
FROMDUAL;
--查询employees表中所有职员的last_namc,要求显示的内容中首字母为小写,其它字母均为
大写
SELECTLOWER(SUBSTR(LAST_NAME.1,1))||UPPER(SUBSTR(LAST_NAME,2))
FROMEMPLOYEES;
-查询employees表中last_name中包含a(小写)的职员的last_name(不能使用LIKE)
SELECTLAST_NAME
FROMEMPLOYEES
WHEREiNSTR(LAST_NAME;a')>0;
-查询employees表中last_name中为4个字符的职员的last_name
SELECTLAST_NAME
FROMEMPLOYEES
WHERELAST.NAMELIKE'
SELECTLAST.NAME
FROMEMPLOYEES
WHERELENGTH(LAST_NAME)=4;
一查询employees表中las5ame中包含a或e的职员的:asl」iame
SELECTLAST_NAME
FROMEMPLOYEES
WHERELAST_NAMELIKE'%a%'ORLAST_NAMELIKE'%e%';
SELECTLAST_NAME
FROMEMPLOYEES
WHEREINSTR(LAST_NAME;a')>0ORINSTR(LAST_NAME,'e')>0;
--四舍五入:
SELECTROUND(256.987),ROUND(256.987,2),ROUND(256,987.0),ROUND(256.987,-1)
FROMDUAL;
--截断数字:
SELECTTRUNC(256.987),TRUNC(256.987,2),TRUNC(256.987,0),TRUNC(256.987,-l)
FROMDUAL;
-MOD():取余数
SELECTMOD(15,2)
FROMDUAL;
SELECTFLOOR(12.I)
FROMDUAL;
SELECTCEIU12.1)
FROMDUAL;
--获得数据库服务器的时刻:SYSDATE,日期+时刻
SELECTSYSDATE
FROMDUAL;
SQLServer:
getDate。:获得系统时刻
MySQL:
currdateO:获得系统口期,没有时刻
now():获得系统日期+时刻
*/
日期+天数=日期
日期-天数=日期
口期-口期二天数
日期不能加日期
*/
SELECTSYSDATE-100
FROMDUAL;
-查询employees表中所有职员的last_name,hire_date,入职年数
SELECTLAST_NAME,HIRE_DATE,TRUNC((SYSDATE-HIRE_DATE)/365)
FROMEMPLOYEES;
-MONTHS_BETWEEN①1,D2):求两个参数相差的月数
SELECT
LAST_NAME,HIRE_DATE.TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12)AS
年数
FROMEMPLOYEES;
—ADD_MONTHS(D,N):在一个日期上加上指定的月数
SELECTLAST_NAME,HIRE_DATE,ADD_MONTHS(HIRE_DATE,35)
FROMEMPLOYEES;
-NEXT_DAY():
SELECTNEXT_DAY(SYSDATE,7)
FROMDUAL;
SELECTNEXT_DAY(SYSDATE,'星期四')
FROMDUAL;
—LAST_DAY():求日期所在月份的最后一天
SELECTLAST_DAY(SYSDATE)
FROMDUAL;
-类型转换:隐式转换,显式转换
-隐式转换:Oracle自动将一个类型转换为另一个类型。
SELECTLAST_NAME,SALARY,DEPARTMENT_ID
FROMEMPLOYEES
WHEREDEPARTMENT_1D='5O';
--显式转换:
/*
数字与字符进行类型转换
日期与字符进行类型转换
数字与日期不能进行类型转换
刊
-TO_CHAR(D,M):将口期类型D按模板M转换为字符类型的值。
SELECTLAST_NAME,HIRE_DATE,TO_CHAR(HIRE_DATE,YYYY-MM-DDDY')
FROMEMPLOYEES;
SELECTLAST_NAME,TO_CHAR(HIRE_DATE:YYYY)
FROMEMPLOYEES;
SELECTTO_CHAR(SYSDATE:DDDDDD')
FROMDUAL;
SELECTTO_CHAR(S¥SDATE,'YYYY-MM-DDHH24:MI:SS')
FROMDUAL;
SELECTLAST_NAME,H1RE_DATE,TO_CHAR(HIRE_DATE:FMYYYY"年”MM"月”DD"日“
DY')
FROMEMPLOYEES;
一查询employees表中所有周三入职的职员的last_name,hire_date(格式为:YYYY-MM-DD
DY)
SELECTLAST_NAME,TO_CHAR(HIRE_DATE,,YYYY-MM-DDDY')
FROMEMPLOYEES
WHERETO_CHAR(HIRE_DATE:DY尸星期三,;
SELECTLAST_NAME,TO_CHAR(HIRE_DATE;YYYY-MM-DDDY')
FROMEMPLOYEES
WHERETO_CHAR(HIRE_DATE.'D')='4';
-TO_CHAR(N,M):将数字类型N按模板M转换为字符类型的值
SELECTTO_CHAR(256.987),
TO_CHAR(256.897.,FM99999.99'),
TO_CHAR(256.987:99,),
TO_CHAR(256.987:9999999999999,),
TO_CHAR(256.897,,FM()(X)()().()0,),
TO_CHAR(256.897,(FM99999.00,),
TO_CHAR(256456.897;FM9,999,999.(X)X
TO_CHAR(256456.897:FM$9,999,999.00,),
TO_CHAR(256456.897;FML9,999,999.00')
FROMDUAL;
一查询employees表中所有5月入职职员的last_name,hiie_date(格式为:1999年1月1日星
期五),结果按hire_date升序排序。
SELECTLAST_NAME,TO_CHAR(HIRE_DATE,FMYYYY"年"MM"月”DD"曰"DY')AS
IIIRE_DATE
FROMEMPLOYEES
WHERETO_CHAR(HIRE_DATE1MONA5月’
ORDERBY2ASC;
--查询employees表中所有职员的last_name与职员3倍的工资(格式为:$50,000.00),结果
按工资的降序排序。
SELECTLAST_NAME,TO_CHAR(SALARY*3,'FM$999,999.00)
FROMEMPLOYEES
ORDERBYSALARYDESC;
-TO_DATE(C,M):依照模板M将字符类型C值转换为日期类型的值
SELECTTO_DATE('l999-10-10'/YYYY-MM-DD*)
FROMDUAL;
SELECTTO_DATE('2021-10-1VYYYY-MM-DD')-SYSDATE
FROMDUAL;
—TO_NUMBER(C,M):依照模板M将字符类型C转换为数字类型的值
SELECT
TO_NUMBERC256.23'),TO_NUMBER('2,256.23','9,999.00'),TO_NUMBER('$2,256.23','$9999.
00')
FROMDUAL;
一当NULL参与到算术运算时结果一定为NULL
—NVL():当第一个参数不为NULL时,返回第一个参数的值,当第一个参数为NULL时,返
回第二个参数的值,两个参数的类型必须一致。
SELECTLAST_NAMESALARY,NVL(TO_CHAR(COMMISSION_PCT),'没有佣金')AS佣
金’(SALARY*12)+(SALARY*12*NVL(COMMISSION_PCT.O))AS年收入
FROMEMPLOYEES;
-NVL2():当第一个参数不为NULL,返回第二个参数,当第一个参数为NULL,返回第三个
参数
SELECTLAST_NAME,NVL2(COMMISSION_PCT,'有佣金没有佣金')
FROMEMPLOYEES;
-查询employees表中所有职员的lasl_name,job_id,salary,以及增加后的工资,假如职员的
job_id为IT_PROG时,增加后的工资为工资为1.2倍,假如job_id为ST_CLERK时,增加
后的工资为工资的1.5倍,假如job_id为SA_REP时,增加后的工资为工资的2倍,其它jub_id
的职员的工资不变。
SELECTLAST_NAME,JOB_ID,SALARY,
CASE
WHENJOB」D=TT_PROG'THENSALARY*1.20
WHENJOB」D二ST_CLERKTHENSALARY*1.50
WHENJOB」D=5A_REPTHENSALARY*2
ELSESALARY
ENDAS增加后工资
FROMEMPLOYEES;
SELECTLAST_NAME,JOB」D,SALARY,
CASEJOB」D
WHEN'IT.PROG'THENSALARY*1.20
WHEN'ST-CLERK'THENSALARY*1.50
WHENSA_REP'THENSALARY*2
ELSESALARY
ENDAS增加后工资
FROMEMPLOYEES;
SELECTLAST_NAMEJOB_ID,SALARY,
DECODE(
JOBJD,
'IT.PROG',
SALARY*1.2,
'ST_CLERK',
SALARY*1.5,
'SA_REP',
SALARY*2,
SALARY
)AS增加后工资
FROMEMPLOYEES;
--多表连接
/*
笛卡尔集:
行数:表行数的乘积
产生笛卡尔集的缘故:没有连接条件或连接条件无效
*/
--等值连接[内连接,简单连接)
--查询所有部门的department_name,city
SELECTDEPARTMENT_NAME,CITY
FROMDEPARTMENTS,LOCATIONS
WHEREDEPARTMENTS.LOCATION_ID=LOCATIONS.LOCATION_ID;
一查询所有职员的last_name,department_name
SELECTLAST_NAME,DEPARTMENT_NAME
FROMEMPLOYEES,DEPARTMENTS
WHEREEMPLOYEES.DEPARTMENT_ID=DEPARTMENTS.DEPARTMENT_ID;
-表别名:表名表别名
SELECTLAST_NAME,DEPARTMENT_NAME
FROMEMPLOYEESEMRDEPARTMENTSDEPT
WHEREEMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID;
--杳询职员的last_name,department_id.department_name
SELECTEMRLAST_NAME,DEPT.DEPARTMENT_ID,DEPT.DEPARTMENT_NAME
FROMEMPLOYEESEMP,DEPARTMENTSDEPT
WHEREEMRDEPARTMENT_ID=DEPT.DEPARTMENT_ID;
一兖询职员的lasl_name,job_id,job_lille(jobs表中)
SELECTEMP.LAST_NAME,EMP.JOB_ID,JOB.JOB_TITLE
FROMEMPLOYEESEMPJOBSJOB
WHEREEMP.JOBJD=JOB.JOB_ID;
查询employees表中所有职员的last_nanie,hire_date(格式为:1999-10-10),工龄(只保留整数部
分),以及奖金,假如职员的工龄在15(不包含15年)年以上,奖金为8倍的工资,假如职
员的工龄大于18(不包含18年)年以上,奖金为10倍的工资,假如职员的工龄在201不
包含20年)年以上,奖金为15倍的工资,假如职员的工龄小于或等于15年,那么没有奖
金显示”此职员不在此次活动范畴内”.
*/
SELECTLAST_NAME,TO_CHAR(HIRE_DATE,'YYYY-MM-DD')AS
HIRE_DATE,TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12)AS"工龄",
CASE
WHENTRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12)>20THEN
TO_CHAR(SALARY*15)
WHENTRUNC(M0NTHS_BETWEEN(SYSDATE.HIRE_DATE)/12)>18THEN
TO_CHAR(SALARY*10)
WHENTRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12)>15THEN
TO_CHAR(SALARY*8)
ELSE,此职员不在此次活动范畴内,
ENDAS奖金
FROMEMPLOYEES;
SELECTLAST_NAME,TO_CHAR(HIRE_DATE,'YYYY-MM-DD')AS
HIRE_DATE.TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12)AS“工龄”,
CASE
WHENTRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12)>I5AND
TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12)<=18THENSALARY*8
WHENTRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12)>18AND
TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12)<=20THENSALARY*10
WHENTRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12)>20THENSALARY*15
ELSEO
ENDAS奖金
FROMEMPLOYEES;
-节询职员的last_name,job_ti(le,deparlmenl_name,cily
SELECTEMP.LAST_NAME,JOB.JOB_TITLE,DEPT.DEPARTMENT_NAME,LOC.CITY
FROMEMPLOYEESEMRDEPARTMENTSDEPT,LOCATIONSLOCJOBSJOB
WHEREEMP.DEPARTMENT_ID=DEPT.DEPARTMENT」D
ANDDEPT.LOCATION」D=LOC.LOCATION」D
ANDEMP.JOB_ID=JOB.JOB_ID;
SQL:1999
一查询职员的last_name,department_name
SELECTLAST_NAME,DEPARTMENT_NAME
FROMEMPLOYEESEMP,DEPARTMENTSDEPT
WHEREEMP.DEPARTMENT」D二DEPT.DEPARTMENT」D;
SELECTEMP.LAST_NAME,DEPT.DEPARTMENT_NAME
FROMEMPLOYEESEMPINNERJOINDEPARTMENTSDEPT
ONEMP.DEPARTMENT」D二DEPT.DEPARTMENT」D
WHEREEMP.LAST_NAMELIKE'%a%';
一查询职员Wlast_name,job_title,department_name,city
SELECTEMP.LAST_NAME,JOB.JOB_TITLE.DEPT.DEPARTMENT_NAME,LOC.CITY
FROMEMPLOYEESEMRDEPARTMENTSDEPTXOCATIONSLOC,JOBSJOB
WHEREEMP.DEPARTMENT」D=DEPT.DEPARTMENT」D
ANDDEPT.LOCATION_ID=LOC.LOCATION_ID
ANDEMRJOB_ID=JOB.JOBJD;
SELECTEMRLAST_NAME,JOBJOB_TITLE,DEPT.DEPARTMENT_NAME.LOC.CITY
FROMEMPLOYEESEMPJOINDEPARTMENTSDEPTON
EMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID
JOINJOBSJOBONJOB.JOB_ID=EMP.JOB_ID
JOINLOCATIONSLOCONLOC.LOCATION」D=DEPT.LOCATION」D;
--内连接:查询出满足连接条件的数据
--外连接:查询出满足连接条件与不满足连接条件的数,左外连接、右外连接
--查询所有职员的last_name,department_name
SELECTEMP.LAST_NAME,DEPT.DEPARTMENT_NAME
FROMEMPLOYEESEMPLEFTJOINDEPARTMENTSDEPT
ONEMP.DEPARTMENT」D二DEPT.DEPARTMENT」D;
SELECTEMP.LAST_NAME,DEPT.DEPARTMENT_NAME
FROMEMPLOYEESEMPRIGHTJOINDEPARTMENTSDEPT
ONEMP.DEPARTMENTJD=DEPT.DEPARTMENT_ID;
SELECTEMP.LAST_NAME,DEPT.DEPARTMENT_NAME
FROMEMPLOYEESEMPFULLOUTERJOINDEPARTMENTSDEPT
ONEMPDEPARTMENT」D=DEPT.DEPARTMENT」D;
-ORACLE中独有的外连接:(+)
-左外连接
SELECTLAST_NAME,DEPARTMENT_NAME
FROMEMPLOYEESEMP.DEPARTMENTSDEPT
WHEREEMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID(+);
-右外连接
SELECTLAST_NAME,DEPARTMENT_NAME
FROMEMPLOYEESEMP,DEPARTMENTSDEPT
WHEREEMP.DEPARTMENT_ID(+)=DEPT.DEPARTMENT_ID;
-SQLServer:*
-左外连接
SELECTLAST_NAME,DEPARTMENT_NAME
FROMEMPLOYEESEMP.DEPARTMENTSDEPT
WHEREEMP.DEPARTMENT_ID*=DEPT.DEPARTMENT_ID;
-右外连接
SELECTLAST_NAME,DEPARTMENT_NAME
FROMEMPLOYEESEMP.DEPARTMENTSDEPT
WHEREEMP.DEPARTMENT_ID=*DEPT.DEPARTMENT_ID;
-组函数(聚合函数)
—SUM():求总和
SELECTSUM(SALARY)
FROMEMPLOYEES;
-AVG():求平均值
SELECTAVG(SALARY)
FROMEMPLOYEES;
--MAX()/MIN():求最大值限小值
SELECTMAX(SALARY),MIN(SALARY)
FROMEMPLOYEES;
SELECTMAX(HIRE_DATE),MIN(HIRE_DATE)
FROMEMPLOYEES;
SELECTMAX(LAST_NAME),MIN(LAST_NAME)
FROMEMPLOYEES;
-求50号部门的平均工资,总工资,最高工资与最低工资
SELECTAVG(SALARY),SUM(SALARY),MAX(SALARY),MIN(SALARY)
FROMEMPLOYEES
WHEREDEPARTMENT_ID=50;
-COUNTO
SELECTCOUNT(*)-返回结果的行数
FROMEMPLOYEES
WHEREDEPARTMENT」D=50;
SELECTCOUNT(COMMISSION_PCT)-返I可指定列中不为NULL的值的个数
FROMEMPLOYEES;
--查询employees表中last_name中包含A(不区分大小写)的职员的人数
SELECTCOUNT(*)
FROMEMPLOYEES
WHEREUPPER(LAST_NAME)LIKE'%A%';
SELECT
EMP.LAST_NAME,EMP.JOB_iD,EMP.DEPARTMENT_ID,DEPT.DEPARTMENT_NAME
FROMEMPLOYEESEMPJOINDEPARTMENTSDEPTON
EMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID
JOINLOCATIONSLOCONLOC.LOCATIONJD=DEPT.LOCATION_ID
WHERELOC.CITY=Toronto';
SELECT
EMP.LAST_NAME,EMRJOB_ID,EMP.DEPARTMENT_ID,DEPT.DEPARTMENT_NAME
FROMEMPLOYEESEMRDEPARTMENTSDEPT.LOCATIONSLOC
WHEREEMP.DEPARTMENT_ID;DEPT.DEPARTMENT」DAND
LOC.LOCATION_ID=DEPT.LOCATION_IDANDLOC.CITY='Toronto';
-创建一个查询显示雇员的last_name并带星号显示他们的月薪,每个星号表示1000美圆。
按薪水降序排序数据。列标签为EMPLOYEES_AND_THEIR_SALARIESo
--查询所有90号部门职员的last_name,salary(格式为:Y50,000.00),city
SELECTEMP.LAST_NAME,TO_CHAR(EMP.SALARY,'FML99.999.00'),LOC.CITY
FROMEMPLOYEESEMPJOINDEPARTMENTSDEPTONEMP.DEPARTMENTJD=
DEPT.DEPARTMENT」D
JOINLOCATIONSLOCONLOC.LOCATION」D=DEPT.LOCATIONJD
WHEREDEPT.DEPARTMENT」D二90;
-查询97年以后入职职员的人数。
SELECTCOUNT(*)
PROMEMPLOYEES
WHEREHIRE_DATE>TO_DATE('1997-12-31','YYYY-MM-DD');
SELECTCOUNT(*)
FROMEMPLOYEES
WHEREHIRE_DATE>'31-12月-97,;
SELECTCOUNT(*)
FROMEMPLOYEES
WHERETO_CHAR(HIRE_DATE,'YYYY')>'1997';
—GROUPBY子句:分组。统计,报表。
SELECT4
FROM1
(WHERE]2
[GROUPBY]3
[ORDERBY]5
--查询每个部门的最高的工资
SELECTDEPARTMENT」D,MAX(SALARY)
FROMEMPLOYEES
GROUPBYDEPARTMENT」D
ORDERBY1ASC;
SELECTDEPARTMENT」D,MAX(SALARY)
FROMEMPLOYEES
GROUPBYDEPARTMENTJD;
--查询每个职位的平均工资,显示job_id与平均工资
SELECTJOB」D,AVG(SALARY)
FROMEMPLOYEES
GROUPBYJOBJD;
-查询每个部门最高的工资
SELECTMAX(SALARY)
FROMEMPLOYEES
GROUPBYDEPARTMENT」D;
一查询每个部门的人数,显示dcpartmcnt_namc与人数
SELECTDEPT.DEPARTMENT_NAME,COUNT(*)
FROMEMPLOYEESEMPJOINDEPARTMENTSDEPTON
EMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID
GROUPBYDEPT.DEPARTMENT_NAME;
--查询每个部门的人数,显示dcpartmcnt_id,dcpartmcnt_namc与人数
SELECTEMP.DEPARTMENT」D,DEPT.DEPARTMENT_NAME,COUNT(*)
FROMEMPLOYEESEMPJOINDEPARTMENTSDEPTON
EMP.DEPARTMENTJD=DEPT.DEPARTMENT_ID
GROUPBYEMP.DEPARTMENT_ID,DEPT.DEPARTMENT_NAME
ORDERBY1ASC;
--查询所个部门中每个职位的人数,显示depa「tment_id,jub_id,人数
SELECTDEPARTMENT」DJOB」D,COUNT(*)
FROMEMPLOYEES
GROUPBYDEPARTMENT—ID,JOB」D
ORDERBYIASC,2ASC;
-组函数与NULL值:所有组函数在进行运算时会自动忽略NULL值
SELECTAVG(NVL(COMMISSION_PCT.O))
FROMEMPLOYEES;
-HAVING子句:过滤分组结果,使用HAVING时必须使用GROUPBY.
SELECT5
FROM1
IWHEREJ2
(GROUPBY]3
[HAVING条件]4
IORDERBY]6
-WHERE子句中不能使用组函数作为过滤条件。
WHERE与HAVING的区别:
1.WHERE过滤的是表,HAVING过滤的是分组的结果
2.WHERE中不能使用组函数,HAVING能够使用组函数
*/
--查询平均工资大于10000的部门编号与平均工资,结果按工资降序排序
SELECTDEPARTMENT_ID,AVG(SALARY)
FROMEMPLOYEES
GROUPBYDEPARTMENT—ID
HAVINGAVG(SALARY)>l(X)()0
ORDERBYAVG(SALARY)DESC;
--当使用GROUPBY与DISTINCT时ORDERBY中的列必须在SELECT子句中显现。
--查询最高工资大于6000的职位与最高工资,同时JOB」D中要包含REP
SELECTJOB」D,MAX(SALARY)
FROMEMPLOYEES
WHEREJOBJDLIKE'%REP%'
GROUPBYJOBJD
HAVINGMAX(SALARY)>=6000;
--查询每年入职的人数,显示年份与人数,结果按年份升序排序
SELECTTO_CHAR(HIRE_DATE,'YYYY'),COUNT(*)
FROMEMPLOYEES
GROUPBYTO_CHAR(HIRE_DATE.'YYYY')
ORDERBYTO.CHARCHIRE.DATE/YYYY')ASC;
一查询人数大于或等于3人的部门的dcpartment_id与人数
SELECTDEPARTMENTJD,COUNT(*)
FROMEMPLOYEES
GROUPBYDEPARTMENT_ID
HAVINGCOUNT(*)>=3;
一组函数嵌套:
--查询所有部门的最高的平均工资
SELECTMAX(AVG(SALARY))
FROMEMPLOYEES
GROUPBYDEPARTMENT_ID;
1.组函数嵌套时必须使用GROUPBY子句
2.组函数嵌套时不要在SELECT子句中显现非组函数的列
3.组函数嵌套只能显现在SELECT子句中
*/
--子查询(嵌套查询):
-查询与144号职员在同一个部门工作的职员的last_name,deparlmenl_id
SELECTDEPARTMENTJD
FROMEMPLOYEES
WHEREEMPLOYEE」D=I44;
-一般子查询:先执行子查询,再执行主查询
SELECTLAST_NAME,DEPARTMENT_ID
FROMEMPLOYEES
WHEREDEPARTMENT_ID=(SELECTDEPARTMENT_ID
FROMEMPLOYEES
WHEREEMPLOYEE」D=144);
-杳询哪些职员的工资大于104号职员的工资,显示这些职员的last_name,salary
SELECTLAST_NAME,SALARY
FROMEMPLOYEES
WHERESALARY>(SELECTSALARY
PROMEMPLOYEES
WHEREEMPLOYEE」D=104);
/*
1.从ORACLE8I以后,除了GROUPBY子句外其它子句都能够使用子查询
2.子查询一定要显现在一对小括号中
3.尽量将子查询放在运算符的右边
4.除非取前N条数据,否则不要在子查询中使用ORDERBY子句。
5.子查询中返回列的个数与类型,必须与主查询中条件的列的个数与类型一致
*/
-查询工资大于公司平均工资的职员的last_name,d叩arlmenl_id,salary
SELECTLAST_NAME,DEPARTMENT」D,SALARY
FROMEMPLOYEES
WHERESALARY>(SELECTAVG(SALARY)
FROMEMPLOYEES);
一查询出入职最早的职员的last_name,hire_date(格式为:1999・1・1)
SELECTLAST_NAME,TO_CHAR(HIRE_DATE,,FMYYYY-MM-DD,)
FROMEMPLOYEES
WHEREHIRE.DATE=(SELECTMIN(HIRE_DATE)
FROMEMPLOYEES);
-查询平均工资大于60号部门最高工资的部门的departmenjid,平均工资
SELECTDEPARTMENTJD,AVG(SALARY)
FROMEMPLOYEES
GROUPBYDEPARTMENT_ID
HAVINGAVG(SALARY)>(SELECTMAX(SALARY)
FROMEMPLOYEES
WHEREDEPARTMENT_ID=60);
--查询人数最多的部门的加partment_id与人数
SELECTDEPARTMENT」D,COUNT(*)
FROMEMPLOYEES
GROUPBYDEPARTMENT—ID
HAVINGCOUNT(*)=(SELECTMAX(COUNT(*))
FROMEMPLOYEES
GROUPBYDEPARTMENT");
--多行子查询:IN,ANY,ALL
-查询工资至少大于60号部门一名职员的工资的职员的last_name,salary
SELECTLAST.NAME,SALARY
FROMEMPLOYEES
WHERESALARYIN(SELECTSALARY
FROMEMPLOYEES
WHEREDEPARTMENT_ID=60);
SELECTLAST_NAME.SALARY
FROMEMPLOYEES
WHERESALARY>ANY(SELECTSALARY
FROMEMPLOYEES
WHEREDEPARTMENT_ID=60);
SELECTLAST_NAME,SALARY
FROMEMPLOYEES
WHERESALARY>ALL(SELECTSALARY
FROMEMPLOYEES
WHEREDEPARTMENTJD=60);
-在SELECT子句中使用子查询
SELECTLAST_NAME,(SELECTDEPARTMENT_NAMEFROMDEPARTMENTSWHERE
DEPARTMENT_ID=90)
FROMEMPLOYEES;
-查询每个职位的人数以及那个职位人数占公司总人数的百分比,显示job_id,人数,百分比
SELECTJOB_ID,COUNT(*),TRUNC((COUNT(*)/(SELECTCOUNT(*)FROM
EMPLOYEES))*100)11'%'AS百分比
FROMEMPLOYEES
GROUPBYJOB」D;
--伪列:在建表时ORACLE为表自动添加的列。
--ROWID:数据在硬盘或内存中的地址
-ROWNUM:行号,只能小于或小于等于或等于1,否则返回0行数据
SELECTROWNUM.LASTNAME.SALARY
FROMEMPLOYEES
WHEREROWNUM=IO
ORDERBY2DESC;
-查询employees收入最低的前5名
SELECTLAST_NAME,SALARY
FROM(SELECTLAST_NAME,SALARY
FROMEMPLOYEES
ORDERBYSALARYASC)
WHERER0WNUM<=5;
-SQLServer
SELECTTOP5LAST_NAME,SALARY
FROMEMPLOYEES
ORDERBYSALARYDESC;
-MySQL
SELECTLAST_NAME.SALARY
FROMEMPLOYEES
ORDERBYSALARYDESC
LIMIT5;
--查询入职最晚的5名职员的last_name,hire_date(格式为:1999-10-10),salary(格式为:
50,000.00)
SELECTLAST_NAME.HIRE_DATE,SALARY
FROM(SELECTLAST_NAME,TO_CHAR(HIRE_DATE,'YYYY-MM-DD')AS
HIRE_DATE,TO_CHAR(SALARY,'FM99,999.00)ASSALARY
FROMEMPLOYEES
ORDERBYHIRE_DATEDESC)
WHEREROWNUM<=5;
--查询与124号职员在同一年入职的职员的employee_id,las5ame,hire_date(格式为:
1999-10-10)
SELECTEMPLOYEE」D,LAST_NAME,TO_CHAR(HIRE_DATE;YYYY-MM-DD')
FROMEMPLOYEES
WHERETO_CHAR(HIRE_DATE,'YYYY)=(SELECTTO_CHAR(HIRE_DATE;YYYY')
FROMEMPLOYEES
WHEREEMPLOYEE_ID=&INPUT);
-高级子查询:成对子查询,相关子查询
--查询工资与所在部门平均工资相等的职员的last_namedepartment_id,sala「y
SELECTLAST_NAME,DEPARTMENT」D,SALARY
FROMEMPLOYEES
WHERE(DEPARTMENT」D.SALARY)IN(SELECTDEPARTMENT」D,AVG(SALARYj
FROMEMPLOYEES
GROUPBYDEPARTMENT_ID);
一查询各个部门入职最早的职员的last_name,hire_date(格式为:1999-10-10).department_id
SELECTLAST_NAME,TO_CHAR(HIRE_DATE,'YYYY-MM-DD').DEPARTMENT_ID
FROMEMPLOYEES
WHERE(NVL(DEPARTMENTJD.O),HIRE_DATE)IN(SELECT
NVL(DEPARTMENT_ID,O),M1N(HIRE_DATE)
FROMEMPLOYEES
GROUPBYDEPARTMENT」D);
-相关子查询:先执行主查询,再执行子查询
一查询工资大于所在部门的平均工资的职员的lasl_name,department_id,salary
SELECTLAST_NAME,DEPARTMENT」D,SALARY
FROMEMPLOYEESEMP
WHERESALARY>(SELECTAVG(SALARY)
FROMEMPLOYEES
WHEREDEPARTMENT_ID=EMP.DEPARTMENT_ID);
SELECTEMP.LAST_NAME,EMP.DEPARTMENT_ID,EMP.SALARY
FROMEMPLOYEESEMP,
(SELECTDEPARTMENT_ID,AVG(SALARY)ASSALARY
FROMEMPLOYEES
GROUPBYDEPARTMENTSA
WHEREEMP.DEPARTMENT_ID=A.DEPARTMENTJDANDEMP.SALARY>A.SALARY;
--集合运算:井集,交集,补集
-并集:集合+集合
-兖询收入最高与收入最低的职员的last_name,salary
SELECTLAST_NAME,SALARY
FROMEMPLOYEES
WHERESALARY=(SELECTMAX(SALARY)
FROMEMPLOYEES)
UNION
SELECTLAST.NAME,SALARY
FROMEMPLOYEES
WHERESALARY=(SELECTMIN(SALARY)
FROMEMPLOYEES)
ORDERBY2ASC;
SELECTEMPLOYEE」D,LAST_NAME
FROMEMPLOYEES
UNION
SELECTDEPARTMENT」D,DEPARTMENT_NAME
FROMDEPARTMENTS;
SELECTEMPLOYEEJD.LAST_NAME
FROMEMPLOYEES
UNION-去掉重灾值
SELECTEMPLOYEE_ID,LAST_NAME
FROMEMPLOYEES;
SELECTEMPLOYEE_ID,LAST_NAME
FROMEMPLOYEES
UNIONALL-不去重复值
SELECTEMPLOYEE_ID,LAST_NAME
FROMEMPLOYEES;
一查询50号部门同时工资大于3000的职员的lasl_name,salary,department_id
SELECTLAST_NAME,SALARY.DEPARTMENT_ID
FROMEMPLOYEES
WHEREDEPARTMENTJD=50
INTERSECT
SELECTLAST_NAME,SALARY,DEPARTMENT_ID
FROMEMPLOYEES
WHERESALARY>30(X);
SELECTLAST_NAME
FROMEMPLOYEES
WHERELAST_NAMELIKE'%a%'
INTERSECT
SELECTLAST.NAME
FROMEMPLOYEES
WHERELAST.NAMELIKE'%e%';
-补集:集合•集合
/*
A:12345
B:35
A-B=l24
B-A=NULL
*/
--查询收入最高的6/0名职员的las5ame,salary
SELECTLAST_NAME,SALARY
FROM(SELECTLAST.NAME,SALARY
FROMEMPLOYEES
ORDERBYSALARYDESC)
WHEREROWNUM<=10
MINUS
SELECTLAST_NAME,SALARY
FROM(SELECTLAST.NAME,SALARY
FROMEMPLOYEES
ORDERBYSALARYDESC)
WHERER0WNUM<=5
ORDERBYSALARYDESC;
--创建表
/*
CREATETABLE表名(
列名数据类型[(长度)][约束],
列名数据类型[(长度)][约束],
列名数据类型[(长度)][约束],
列名数据类型[(长度)][约束]
)
*/
一数字类型:NUMBER,长度能够省略
/*
整型:NUMBER(6):整数,同时长度为6位的整数。NUMBER:省略长度,默认为38位的整
数
浮点型:NUMBERS.2):整个数字最大的长度为8位,其中有两位小数
*/
―字符类型:长度不能省略
/*
CHAR(10):AB,储存固定长度的字符串。
VARCHAR2(10):AB,储存可变长度的字符串。
VARCHAR与VARCHAR2的区别?
*/
--口期类型:不能写长度
/*
DATE:口期+时刻
*/
DROPTABLET1;
CREATETABLET1(
T」DNUMBER(5),
T_NAMEVARCHAR2(20),
T_SEXCHAR(ICHAR),
TDATEDATE
);
--复制表:
/*
CREATETABLE表名
AS
SELECT语句
*/
DROPTABLETl;
CREATETABLET1
AS
SELECTLAST_NAME,SALARY,DEPARTMENT」D
FROMEMPLOYEES
WHEREDEPARTMENT」D=50;
一添加数据:INSERTINTO语句
1.向表中添加一行新的数据,并表新行中所有的列赋值
INSERTINTO表名VALUES(值,值,值,……);
INSERTINTOT1VALUES(1,'AA','男',TO_DATE('1999-10-10','YYYY-MM-DD'));
2.向表中添加一行新的数据,并向指定的列中赋值
INSERTINTO表名(列名,列名,列名,……)VALUES(值,值,值,……);
INSERTINTOT1(T_ID.T_NAME)VALUES(2:BB');
INSERTINTOT1(T_NAME,T_ID)VALUES('CC',3);
-修改数据:UPDATE语句
UPDATE表名SET列名=值,列名=值,...(WHERE条件];
UPDATET1SETT_NAME='ABCWHERET」D=1;
UPDATET1SETT_SEX;女,T_DATE=SYSDATEWHERET_DATEISNULL;
-将employees收入最高的职员的工资改为公司的最低工资
UPDATEEMPLOYEESSETSALARY=(SELECTMIN(SALARY)FROMEMPLOYEES)
WHERESALARY=(SELECTMAX(SALARY)FROMEMPLOYEES);
-删除数据:DELETE语句
DELETE|FROM]表名[WHERE条件];
DELETET1WHERET_SEX二男;
-删除T1表中T_NAME列中所有的数据
UPDATET1SETT_NAME=NULL;
一约束:
L.主键约束:PRIMARYKEY:不能为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年昭平县公安局公开招聘警务辅助人员备考题库及参考答案详解一套
- 2025年玉环市应急管理局招聘编外人员的备考题库及答案详解一套
- 2025年中国电建集团河北省电力勘测设计研究院有限公司校园招聘备考题库带答案详解
- 2025广西贵港市利恒投资集团有限公司公开招聘14人备考考试题库及答案解析
- 2025滨州展鸿人力资源管理有限公司招聘备考笔试试题及答案解析
- 2025贵阳市医疗健康产业投资股份有限公司招聘参考笔试题库及答案解析
- 2025西安未央区大明宫社区卫生服务中心招聘(2人)备考笔试试题及答案解析
- 2025内蒙古鄂尔多斯市水之恩口腔医院招聘24人备考考试试题及答案解析
- 2025广东韶关市始兴县公安局招聘警务辅助人员9人备考笔试试题及答案解析
- 2025广东湛江市遂溪县卫生健康系统招聘事业单位人员83人备考考试试题及答案解析
- 2024年全省职业院校技能大赛高职学生组业财税融合大数据应用赛项样卷A
- GB/T 43983-2024足球课程学生运动能力测评规范
- 临床医学导论习题与答案2
- 盘锦团市委艾滋病防治工作总结
- 医院培训课件:《护患沟通技巧》
- 余华读书分享名著导读《文城》
- 脲的合成方法总结
- 重庆市2023年高职分类考试招生信息及通用技术试题及答案(重庆市春招考试)
- 押金退款申请书
- 河北省药学会科学技术奖申报书年度
- 焊接作业记录表
评论
0/150
提交评论