SQL基础文档格式.docx

上传人:b****6 文档编号:19532094 上传时间:2023-01-07 格式:DOCX 页数:16 大小:1.36MB
下载 相关 举报
SQL基础文档格式.docx_第1页
第1页 / 共16页
SQL基础文档格式.docx_第2页
第2页 / 共16页
SQL基础文档格式.docx_第3页
第3页 / 共16页
SQL基础文档格式.docx_第4页
第4页 / 共16页
SQL基础文档格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

SQL基础文档格式.docx

《SQL基础文档格式.docx》由会员分享,可在线阅读,更多相关《SQL基础文档格式.docx(16页珍藏版)》请在冰豆网上搜索。

SQL基础文档格式.docx

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;

查询的三大操作:

投影、选择、连接

简单查询、联合查询

在数据量较大的情况下,尽量避免使用联结查询,应该使用子查询。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1