SQL基础文档格式.docx
《SQL基础文档格式.docx》由会员分享,可在线阅读,更多相关《SQL基础文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
DEFINE变量=值可以定义变量,用DEFINE可查询系统中所有已定义的变量
DEFINEv_col=customer_id;
UNDEFINE变量可以删除已定义变量
UNDEFINEv_col
ACCEPT变量名[type][FORMATformat][PROMPTprompt][HIDE]:
交互式定义变量
ACCEPTv_idnumberformat99prompt'
用户ID'
ACCEPTv_passwordCHARPROMPT'
Password:
'
HIDE
SQL语句
⏹SQL是一种介于关系代数与关系演算之间的结构化查询语言。
SQL是一个通用的、功能极强的数据库语言。
⏹SQL集数据查询(dataquery)、数据操作(datamanipulation)、数据定义(datadefinition)、数据控制(datacontrol)于一体。
⏹SQL语言包括的内容
1.SQLDDL(datadefinition):
定义关系模式、删除关系、建立索引以及修改关系模式;
2.SQLDML(datamanipulation):
查询、插入、删除和修改;
3.嵌入式DML:
嵌入在Pascal、C等宿主语言;
4.视图定义:
创建视图;
5.权限管理:
对关系和视图的访问进行授权;
6.完整性:
定义数据必须满足的完整性约束条件;
7.事务控制(datacontrol):
定义事务的开始、提交、和结束等。
背景知识:
scott用户所有的table的结构
EMPNO:
编号,number
ENAME:
姓名,varchar2
JOB:
职位,varchar2
MGR:
上级,number
HIREDATE:
雇佣日期,date
SAL:
工资number
COMM:
佣金number
DEPTNO:
部门代号number
DNAME:
部门名称varchar2
LOC:
部门位置varchar2
GRADE:
工资级别number
LOSAL:
该级别的最低工资number
HISAL:
该级别的最高工资number
简单查询
投影查询(projectselect)
语法:
SELECT[DISTINCT|ALL]*|表达式|列名[别名],列名别名…FROM表名别名;
SELECT*FROMemp;
SELECT2+3FROMemp;
解释:
返回14行,原因是该表有14行数据,为了简便输出,我们使用dual表,dual是系统内置表,专门用来存放表达式数据,写法是:
SELECT2+3FROMdual;
SELECT2+3RESULTFROMdual;
可以使用别名
问题:
显示所有员工的编号,职务和工资
SELECTempno,job,salFROMemp;
显示所有员工的编号,职务和年薪
SELECTempno,job,sal*12“salofyear”FROMemp;
字段可以参与表达式运算,“”一般不使用,当别名需要保持原始状态,需要加。
显示员工信息如下格式:
员工编号:
XXX员工姓名:
XXX员工工资:
XXX
SELECT‘员工编号:
’||empno||’员工姓名:
’||ename||’员工工资:
’||sal员工信息FROMemp;
||代表两个字符串的合并
显示所有员工的岗位
SELECTDISTINCTjobFROMemp;
DISTINCT用来去除重复项,重复项必须全部一致,
显示所有员工的姓名和岗位
SELECTDISTINCTename,jobFROMemp;
DISTINCTC此处无意义
思考题:
如何显示所有员工的编号及入职年限?
selectempno,round((sysdate-hiredate)/365)入职年限fromemp
选择查询(条件查询):
语法:
SELECT[DISTINCT]*|表达式|列名别名,列名别名…FROM表名别名WHERE条件(…);
条件可以是:
>
、<
=、>
=、<
>
、!
=、=、ANY、ALL、BETWEEN…AND、IN、LIKE、ISNULL、AND、OR、NOT
NOT可以和LIKE、IN、BETWEEN、ISNULL联用
显示工资大于1500元员工资料
SELECT*FROMempWHEREsal>
1500;
显示工资不等于1500元员工资料
SELECT*FROMempWHEREsal<
SELECT*FROMempWHEREsal!
=1500;
SELECT*FROMempWHERENOTsal=1500;
显示员工号小于7800且上级号大于7400的员工资料或工资大于1500元的员工资料
1500ORempno<
7800ANDmgr>
7400;
AND比OR优先级高,比较表达式比AND和OR优先级高
显示所有有佣金的员工信息
SELECT*FROMempWHEREcommISNOTNULL;
显示所有没有佣金的员工信息
SELECT*FROMempWHEREcommISNULL;
NOT可以用于ISNULL条件之中,表示不为空
查询所有姓名以A开头的员工
SELECT*FROMempWHEREenameLIKE‘A%’;
LIKE后可以加%或_,%代表任意多位字符_代表一位字符
查询所有姓名第二个字母是A的员工
SELECT*FROMempWHEREenameLIKE‘_A%’;
查询所有姓名倒数第二个字母不是A的员工
SELECT*FROMempWHEREenameNOTLIKE‘%A_’;
查询所有员工号在7500-7800的员工
SELECT*FROMempWHEREempnoBETWEEN7500AND7800;
查询所有员工号不在7500-7800的员工
SELECT*FROMempWHEREempnoNOTBETWEEN7500AND7800;
对比SELECT*FROMempWHEREempnoNOTIN(7500,7800);
查询所有员工号可以是752176547700及7800的员工
SELECT*FROMempWHEREempnoIN(7521,7654,7700,7800);
IN(7521,7654,7700,7800)相当于empno=7521orempno=7654or…
查询所有大于7499,7521,7654员工号的员工信息
SELECT*FROMempWHEREempno>
ALL(7499,7521,7654);
查询所有至少大于7499,7521,7654中的一个的员工号的员工信息
ANY(7499,7521,7654);
ALL和ANY区别是:
ALL要比范围内最(大|小)的还要(大|小),ANY比范围内任意的还要(大|小)
结果的排序:
SELECT[DISTINCT]*|表达式|列名别名,列名别名…FROM表名别名WHERE条件(…)ORDERBY(ASC)DESC;
ASC升序,默认值,DESC降序
ORDERBY必须是整个SELECT语句的最后一个子句。
显示按工资的从高到底排序的员工信息
SELECT*FROMempORDERBYsalDESC;
显示按工资的从高到底排序,如果工资一致,按照员工号从小到大排序的员工信息
SELECT*FROMempORDERBYsalDESC,empnoASC;
显示按入职时间的从早到晚排序的员工信息
SELECT*FROMempORDERBYhiredateASC;
时间比较是单纯的看时间的数字表示
多表复杂查询和事务处理
多表查询应该注意去除笛卡尔积,一般多个表时会为表起个别名
补充:
要求查询雇员的编号、姓名、部门编号、部门名称及部门位置以及工资和工资所在等级,以编号排序
selecte.empno,e.ename,d.deptno,d.dname,d.loc,e.sal
fromempe,deptd,salgrades
wheree.deptno=d.deptno
ANDe.salbetweens.losalANDs.hisal
【1】要求查询雇员的编号、姓名、部门编号、部门名称及部门位置
SQL>
SELECTe.empno,e.ename,d.deptno,d.dname,d.loc
FROMempe,deptd
WHEREe.deptno=d.deptno;
【2】要求查询每个雇员的姓名、工作、雇员的直接上级领导的姓名(表自关联)
SELECTe.ename,e.job,m.ename
FROMempe,empm
WHEREe.mgr=m.empno;
【3】对【2】进行扩充,将雇员所在部门名称同时列出
SELECTe.ename,e.job,m.ename,d.dname
FROMempe,empm,deptd
WHEREe.mgr=m.empnoANDe.deptno=d.deptno;
【4】查询每个雇员的姓名、工资、部门名称,工资在公司的等级(salgrade),及其领导的姓名所在公司的等级
<
1>
先确定工资等级表的内容
SELECT*FROMsalgrade;
2>
查询每个雇员的姓名、工资、部门名称和工资在公司的等级
SELECTe.ename,e.sal,d.dname,s.grade
FROMempe,deptd,salgrades
WHEREe.deptno=d.deptnoANDe.salBETWEENs.losalANDs.hisal;
3>
查询其领导姓名及工资所在公司的等级
SELECTe.ename,e.sal,d.dname,s.grade,m.ename,m.sal,ms.grade
FROMempe,deptd,salgrades,empm,salgradems
WHEREe.deptno=d.deptnoANDe.salBETWEENs.losalANDs.hisal
ANDe.mgr=m.empnoANDm.salBETWEENms.losalANDms.hisal;
【5】左连接与右连接的概念,"
+"
在等号左边表示右连接,反之,左连接
查询雇员的编号、姓名及其领导的编号、姓名
SELECTe.empno,e.ename,m.empno,m.ename
WHEREe.mgr=m.empno(+);
就发现将KING的那条记录也连过来了
(+)是oracle的sql的方言写法
SQL1999语法中有如下几种连接(了解)
1、交叉连接CROSSJOIN,产生笛卡尔积
SELECT*FROMempCROSSJOINdept;
2、自然连接NATURALJOIN,自动进行关联字段的匹配
SELECT*FROMempNATURALJOINdept;
3、使用USING子句,直接关联操作列
SELECT*FROMempJOINdeptUSING(deptno)
WHEREdeptno=30;
4、使用ON子句,用户自己编写的条件
SELECT*FROMempJOINdeptON(emp.deptno=dept.deptno)
5、左连接(左外连接、LEFT(OUTER)JOIN)、右连接(右外连接、RIGHT(OUTER)JOIN)
SELECT*FROMempFULLJOINdeptUSING(deptno)
连接条件数=连接表数-1;
查询的三大操作:
投影、选择、连接
简单查询、联合查询
在数据量较大的情况下,尽量避免使用联结查询,应该使用子查询。