




免费预览已结束,剩余27页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL(Structured Query Language)- 结构化查询语言 SQL是在关系数据库中执行数据操作,检索,维护所使用的标准语言,可以用来查询数据,操作数据,定义数据,控制数据 执行SQL语句时用户只需要知道其逻辑含义,而不需要知道SQL语句的具体执行步骤。-数据库对象通常包含表,视图,索引,序列【数据定义语言DDL】 -表结构 Data Definition Language,用于建立,修改,删除数据库对象,不需要事务的参与,自动提交。CREATE:创建表或其他对象的结构CREATE TABLE table_name(column_name datatype DEFAULT expr,); Eg: -创建表emp CREATE TABLE emp( id NUMBER(10), name VARCHAR2(20), gender CHAR(1), birth DATE,salary NUMBER(6,2),job VARCHAR2(30),deptid NUMBER(2) ); ALTER:修改表或其他对象的结构修改表名:RENAME old_name TO new_name (新表名不能使数据库中已有的表)增加列:ALTER TABLE table_name ADD(column_name datatypeDEFAULT, ); (新增列只能在表的最后一列追加)删除列:ALTER TABLE table_name DROP(column_name); (删除不需要的列)删除字段需要从每行中删掉该字段占据的长度和数据,并释放在数据块中占据的空间,如果表记录比较大,删除字段可能需要比较长的时间。修改列:ALTER TABLE table_name MODIFY(column_name datatypeDEFAULT, ); (修改仅对以后插入的数据有效, 修改字段前的所有数据不受影响)修改时一般类型不改,改长度,尽量往长里改,因为如果表中已经有数据的 情况下,把长度由大改小,有可能不成功DROP:删除表或其他对象的结构DROP TABLE table_nameTRUNCATE:删除表数据,保留表结构TRUNCATE TABLE table_name 可以通过DESC table_name 查看表结构【数据操作语言DML】 -表结构中的数据 Data Manipulation Language,用于改变数据表中的数据,和事务是相关,执行完DML操作后必须经过事务控制语句提交后才真正的将改变应用到数据库中INSRET:将数据插入到数据表中INSERT INTO table_name(column, column) VALUES(value, value); (每执行一次增加一条记录)指定向哪些列插入对应的值,没有指定的列:若设有默认值(DEFAULT),那么插入的就是该默认值,否则插入null,若某列设为not null,执行INSERT语句时又没指定该列,那么插入会抛出违反不为空的约束条件,若不写指定的列,默认所有列插入,每一列的值VALUE都不能少UPDATE:更新数据表中已存在的数据UPDATE table_nameSET column = value,column = valueWHERE condition; -若不写where子句,全表所有行的column都被更新DElETE:删除表中的数据DELETE FROM table_nameWHERE condition; -若不写where子句,全表所有行数据都被删除另注意与DDL中的TRUNCATE的区别: * 二者都是删除表记录,DELETE可以有条件的删(WHERE),TRUNCATE是将表数据全部删 除 * DELETE是DML,可以回退(ROLLBACK),TRUNCATE是DDL,立即生效,无法回退 * 如果删除的是全部表记录,且数据量较大,TRUNCATE速度更快【事务控制语言TCL】 Transaction Control Language,用来维护数据的一致性COMMIT:提交,确认已经进行的数据改变ROLLBACK:回滚,取消已经进行的数据改变SAVEPOINT:保存点,使当前事务可以回退到指定的保存点,便于取消部分 改变Eg: DDL 范畴 ,控制表结构 不需要TCL参与,自动提交 DML 范畴, 控制表结构中的数据 经TCL确认后,才会真正生效, 否则是“假象”【数据控制语言DCL】 Data Control Language,用于执行权限的授予和收回操作GRANT:授予,用于给用户或角色授予权限REVOKR:用于回收用户或角色已有的权限CREATE USER:创建用户【数据查询语言DQL】 Data Query Language,用来查询需要的语句 补充知识点 数据类型:定义表中每一列可以使用的数据格式和范围,用来保证数据类型的格式和有效性 字符串操作: Oracle中的字符串是用单引号()括起来的,注意与Java的区别1.字符串类型:CAHR,VARCHAR2 表示字符串数据类型,用来在表中存放字符串信息 几点说明: 在数据库中CHAR,VARCHAR表示的是字符串,注意与java的区别 CHAR(N),VARCHAR2(N) 指定的是字节数,不是字符数 VARCHAR2是Oracle独有的数据类型,和其他数据库中的VARCHAR 作用一样,加2 是Oracle为以后新增一个字符类型,而又不改变原有 VARCHAR定义的长远考虑 LONG:VARCHAR2 的加长版,也是存储变长字符串,最多可达2GB的字 符串数据 ,LONG有诸多限制:每张表只能有一个LONG类型列; 不能作为主键;不能建立索引;不能出现在查询条件中 CLOB:LONG的改进版,存储定长或变长字符串,最多可达4GB的字符串 数据,Oracle建议用CLOB替代LONG Eg: UTF-8环境下:varchar2英文占1个字节,中文占3个字节,nvarchar2英 文占2个字节,中文占2个字节 GBK环境下: varchar2英文占1个字节,中文占2个字节,nvarchar2英 文占1个字节中文占3个字节2. 字符串函数: 【补充】虚表dual的概念: 在数据库中,我们想要测试某个表达式的结果只能使用SELECT 语句来实现 DUAL,虚表,没有这么一个表,只是为了满足SELECT的语法 要求 我们常用虚表来测试表达式的结果 当SELECT后没有一张表的字段参与时,FROM后就用虚表a:CONCAT(char 1,char 2):返回char1和 char2连接后的结果 相当于Java中的 “+” 等价操作:连接操作符 “|” CONCAT的参数只能有两个,若多个字符串CHAR连接,需嵌套使 用,如果char1 和 char2 任何一个为NULL,相当于连接了一个 空格 SELECT CONCAT(I,CONCAT (LIKE,Oracle) FROM dual SELECT I|LIKE|Oracle FROM dual b:LENGTH(char):获取字符串的长度(字符个数) 若字符类型是VARCHAR2,返回字符的实际长度 若字符类型是CHAR,长度还有包括补充的空格 SELECT ename,LENGTH(ename) FROM emp_yys c:UPPER(char):字符串转大写 SELECT upper(asfadg) FROM dual d:LOWER(char):字符串转小写 SELECT lower(asAAAS) FROM dual e:INITCAP(char):将字符串中每个单词的首字母转大写,其他字符 小写,单词之间用空格或非字母分隔 SELECT initcap(as%NGSY isaT) FROM dual f:TRIM(c2 FROM c1):去掉字符串c1两侧的t2g:LTRIM(c1,c2):从c1的左侧截去c2h:RTRIM(c1,c2):从c1的右侧截去c2注:TRIM,LTRIM,RTRIM 中,如果没有c2,就截去空格TRIM的c2只能是单一字符,LTRIM,RTRIM中的c2可以是多字符, 且多字符不管顺序,只要出现就截若c1中不包含c2,则无法截取,原样输出c1在LTRIM,RTRIM 中,若c2不是c1的最左/右端,则无法截取,原样输出c1SELECT TRIM(1 FROM 1sd1) FROM dualSELECT LTRIM(eaaeeeehaha,ae)FROM dualSELECT RTRIM(aaahaha,o) FROM duali:LPAD(原字符串 , 总长度 , 填充字符串):左补齐j:RPAD(原字符串 , 总长度 , 填充字符串):右补齐要求显示N个字符,若char1的值不足长度,则在L/R补充若干个char2,以达到N个字符,不够则补,刚好则原样,超了则择取到N(都是从左右读取(截取)字符,像计算器看到从右左的效 果,只是在左右读取时加空格显示的效果) SELECT LPAD(haha,10,OK) FROM dual SELECT RPAD( yys,20, very good) FROM dual k:SUBSTR(char, m, n):将字符串char从第m开始,获取n个长度大小的子字符串,在oracle中字符串的下标从1开始说明:m:若果m = 0,则从首字符开始 ,m为负数,则从尾部开始 (从后往前,-3,-2,-1),倒数第m个,向后获 取n个字符 n:如果没有设置n,或者n的长度超过了char的长度,则 取到字符串末尾为止SELECT SUBSTR(abcde, 2, 8) FROM DUALSELECT SUBSTR(abcde, -3, 2) FROM DUALl:INSTR(char1 ,char2,,n,m :返回字符串char2在源字符串 char1中的位置 n,从第几个字符开始找 不写默认从第一个开始找 n为负数,从后开始计数,且往前找,注意与SUBSTR 的区别(SUBSTR是从后开始计数,往后截取) m,指定第m次出现 不写默认第一次出现 如果在char1中没有找到子串char2,返回0 n不能为负数,否 则会报错 其实找子字符串只是看字符串的第一个字符SELECT INSTR(abc abc abc,abc) FROM DUALSELECT INSTR(abc abc abc,abc,6) FROM DUALSELECT INSTR(abc abc abc,abc,1,3) FROM DUALSELECT INSTR(abc abc abc,abc,-3,2) FROM DUAL充分说明了,找子字符串只是看字符串的第一个字符,往前找前提是必须是abc ,abcd就不包含在源字符串中会返回0m:REPLACE(char, m , *):将字符串char中的m,替换成*,注意:replace不会替换原始字符串,仅影响显示结果SELECT REPLACE(abc abc abc,b,*) FROM DUAL 数值操作: 1. 数值类型:NUMBER(p,s) 用来在表中存放数值类型的数据 p表示数字的总位数,取值为1-38,不写(NUMBEE(*,s),p默 认为38 s表示小数点后面的位数,不写,s只有p 表示纯整数 整数部分开头有再多的0,只要除去开头的0不超过p-s就OK小数部分结尾有再多的0,只要除去结尾的0不超过s就OK2. 数值函数:a:ROUND(要处理的数字m,小数位数n):对数字进行四舍五入 * n必须是整数,为正数,四舍五入到小数点后n位 为0,四舍五入到整数位,n缺省,默认为0 为负数,四舍五入到小数点前n位n 为0,保留到个位,看小数点后一位n 为-1,保留到十位,看个位n 为-2,保留到百位,看十位SELECT ROUND (45.678,2) FROM dualSELECT ROUND (45.678) FROM dualSELECT ROUND(43455.678, -3) FROM dualb:TRUNC(m,n):按位截取数字mm,n含义与ROUND的m,n一样,只不过,只舍不进位SELECT trunc(45.678, 2) FROM dualSELECT TRUNC(45.678,-1) FROM dualc:CEIL(n):上取整 天花板,大于等于n的最小整数SELECT CEIL(3248.999) FROM DUALd:FLOOR(n):下取整 地板,小于等于n的最大整数SELECT floor(34564.4343)FROM DUALe:MOD(m , n):取m/n的余数,n若为0,直接返回mSELECT mod(9,0)FROM dual 日期操作: Oracle中的字符串是用单引号()括起来的,注意与Java的区别1. 日期类型:Date:年月日时分秒,占7字节 保存日期和时间,能表示的日期范围 公元前4712年1月1日公元9999年12月31日TIMESTAMP(timestamp):年月日时分秒.小数秒 最高精度可达纳秒(ns)占7或者11字节CREATE TABLE test_1(C1 DATE,C2 TIMESTAMP );2. 日期关键字:SYSDATE ,其本质就是一个Oracle内部的函数,返回当前系统时间,精确到秒 默认显示格式:DDMONRRCREATE TABLE test_2(registerDate DATE DEFAULT SYSDATE);column type defuult exprSELECT SYSDATE FROM DUALSYSTIMESTAMP,返回当前系统时间,精确到毫秒SELECT systimestamp FROM DUAL3. 日期转换函数:* TO_DATE(要转换的字符串,转换格式,指定的日期语言) 将字符串按照指定格式转换为日期类型 xxx-xx-xx xxxx/xx/xx xxxx年xx”月” 装换格式是按习惯自行编写的,是字符串所以用单引号括起来,若中间非关键字或符号的其他字符时,在把这些字符双引号括起来Eg yyyy“年”mm“月”dd“日” 在日期格式字符串中大小写不区分,其他字符串中大小写区分 转化格式的代词 SELECT TO_DATE(2014年09月14,YYYY年MM月DD) FROM dual 说明:1.实际上已经按照YYYY年MM月DD的日期格式,只不过 Oracle的控制台输出格式为DDMONRR 2.需要转换的字符串里出现的非符号字符时,不需要再加“”, 只有转换格式字符串中出现的非关键字或符号的其他字符 时,才把这些字符用双引号括起来* TO_CHAR(data,转换格式,指定的日期语言) 将日期类型数据data按照装换格式输出字符串 SELECT TO_CHAR( sysdate,YYYY年MM月DD日 HH24:MI:SS) FROM dual 4. 日期常用函数:a:LAST_DAY(data):返回给定日期date所在月的最后一天SELECT LAST_DAY(to_date(2014年9月14日,YYYY年MM月DD日)FROM DUALb:NEXT_DAY(date,char) 给定日期 离给定日期最近的下一个星期几(char决定) 中文环境下,char可写成星期三英文环境下,char可写成WEDNESDAY为避免麻烦,可直接使用数字1-7 表示 周日-周六 SELECT NEXT_DAY(SYSDATE,星期三) FROM DUAl SELECT NEXT_DAY(4-9月-14,5)FROM DUAL 说明:获取的是距当前时间最近的周四,若给定的时间刚好是周四, 及周四以后则获取的是下周周四,周四之前,则获取本周周四 注意是按外国的周算 一周时间为: 日 一 二 三 四 五 六c:ADD_MONYHS(date,i):返回给定日期加上i个月后的日期值i可以是任何数字,大部分时候取正值整数i为小数,会被截取整数后再参与运算i为负数,即减去i个月后的日期值SElECT ADD_MONTHS(14-9月-14,2.6) FROM DUAl date默认格式为DDMONRR 所以写14-9月-14 d:MONTHS_BETWEEN(date1,data2):获取date1和date2之间隔了 多少个月 是date1 - date2,若果date2比date1的时间晚,会得到负数除非两个日期之间隔整数月,否则结果会带小数 SELECT months_between(1-1月-14,3-3月-14) FROM DUAl e:LEAST(expr1,expr2,expr3) GREATEST(expr1,expr2,expr3) 比较函数,返回结果是参数列表中最大或最小的值参数类型必须一致,或可转(在比较之前,参数列表的第二个参数会被自动转换为第一个参数的数据类型,可以转,则继续比较,不可以转报错) SELECT LEAST(22,99.9)FROM DUAL SELECT greatest(sysdate,1-1月-14)FROM DUAl f:EXTRACT(date FROM datetime):从参数datetime中提取参数date指定的数据,比如extract(year/month/day from 日期变量)SELECT extract(MINUTE FROM SYSTIMESTAMP) FROMDUAl 空值操作: *数据类型未知或暂时不存在 *数据库中字段无论是什么类型,默认值都是NULL *若使用了DAFAULT关键字指定了默认值,则使用指定的 *在创建表的时候,可以为列添加非空约束,被约束的列在插入数据时必须给值,更新数据时,不能将该列的值设为空 * DAFULT 和NOT NULL不约束同一字段 * 判断是否为空,不能写 = null 要写IS NULL插入值INSERT,更新(UDATE)时,可以写column = null *NULL和任何数字运算结果还是NULL 空值函数:NVL(expr1,expr2):若expr1 为空 ,则取 expr2的值(不管expr2是否为空 eg NVL(null,null) 结果为 null )若expr1不为空,则还是expr1,expr2没用expr1和expr2可以是任何数据类型,但这两个参数的类型必须一致SELECT NVL(1,8) FROMDUAlSELECT NVL(null,Good) FROM DUALNVL2(expr1,expr2,expr3):若expr1为NULL,返回expr3若expr1不为NULL,返回expr2SELECT NVL2(null,Good,Better) FROM DUALSELECT NVL2(YYS,Good,Better) FROM DUAL【查询语句】 SELECT ALL|DISTINCT,n4 FROM ,1 WHERE 2 GROUP BY HAVING 3 ORDER BY ASC|DESC,;5说明:1. 其中SELECT和FROM语句为必选子句,其他子句为任选子句;2.SELECT ALL|DISTINCT,n子句 指明查询结果集的目标列。是指查询结果集中包含的列名, 可以是直接从基本表或视图中投影得到的字段、与字段相关的表达式或数据 统计的函数表达式,目标列还可是常量。 DISTINCT说明要去掉重复的元组: 数据表中有可能存储相同数据的行,当执行查询操作时,默认情况会显 示所有行,当重复数据没有意义需要去掉时,使用DISTINCT实现 根据单列去重 SELECT DISTINCT deptno FROM emp 根据多列去重 SELECT DISTINCT deptno ,job FROM emp只能是保证这几列的组合是没有重复的,单列值还是有可能重复 SELECT (DISTINCT deptno),job FROM emp 是没有意义的 DISTINCT 后面要么一列 单列去重 要么多列 几列组合去重 不能加括号 ALL表示所有满足条件的元组。 (一般不写) 查询所有列,SELECT后的 使用*代替 查询特定列,SELECT后的 指定列名 若目标列中使用了两个基本表或与视图中相同的列名,要在列名前加表名限 定,即使用“”表示。【补充】: (使用表或列的别名改变标题的显示样式) 当SELECT中的字段是一个表达式,那么查询出来的结果集中,当前 列的列名就是该表达式,这样的可读性差,为此,引入别名来改善 别名跟在原表名或原列名的后面,中间用空格或AS关键字隔开 若果希望别名区分大小写,或别名中包含空格or字符,则必须使用双引 号将别名扩起来3.FROM ,子句 指明要查询的数据来自哪些基本表或视图。基本表或视图名间用“,”分隔。 如果查询使用的基本表或视图不在当前DB中,还需要在表或视图前加上DB 名加以说明,即使用“.”的形式表示。 如果在查询中需要一表多用,则每种使用都需要一个表的别名标识,并在各 自使用中用不同的基本表别名表示。4.WHERE 子句 通过条件表达式描述对基本表或视图中元组的选择条件。【补充】查询条件: 、!或、 NOT将它使用的逻辑运算符的意义反转。如NOT BETWEEN、NOT IN、NOT EXISTS、NOT LIKE、NOT UNIQUE等。 OR连接多个查询条件,表示至少有一个查询条件成立。 AND连接多个查询条件,表示所有的查询条件都成立。 AND的优先级高于OR NOT LIKE ESCAPE 当只知道部分信息时,可用LIKE模糊查询 (百分号):代表任意长度(长度可能为0)的字符串; _(下划线): 代表任意单个字符。 【注】若要查询的字符串本身就含有“%”或“_”,则需要使用 由ESCAPE指定的换码字符。 例如:在WHERE子句中的LIKE谓词为: LIKE COM_cn_ ESCAPE (表示以COM_cn开始的最后一个字母任意的字符串) NOTIN 用于判断值是否(不)属于指定的集合。 IN等于其中之一 NOT IN 不等于所有 BETWEENAND 和 NOT BETWEENAND谓词BETWEEN用于判断值是否在给定的两个值之间,注意包括边值。CJ BETWEEN 90 AND 100 等价于CJ90 AND CJ100 IS NULL 和 IS NOT NULL用于判断字符串(任何类型属性均可判断)的值是否是空值判断(比较)是否为空,必须使用IS NULL 不能使用 =BMH NULL /errorBMH NULL /error ANY 和 ALL条件不能单独使用,需配合比较运算符Eg: ANY 大于最小 ALL 大于最大 100000000 DBMS处理语句时,以元组为单位,逐个考察每个元组是否满足WHERE子句中 给出的条件,将不满足条件的元组筛选掉,所以WHERE子句中的表达式也称 为元组的过滤条件。 (比较条件是,数字可引可不引,字符和日期类型的数据,必须用单引号引起)5.GROUP BY子句的作用对象是查询的中间结果表 分组方法:按指定的一列或多列值分组,值相等的为一组 【补充】聚合函数多行数据参与返回一行结果,又称 分组函数,集合函数,多行函数可作为列标识符出现在SELECT子句的目标列或HAVING子句的条件中。查询语句中,若有GROUP BY分组子句,则语句中函数为分组统计函数;若没有GROUP BY分组子句,则语句中函数为全部结果集的统计函数。聚合函数忽略NULL,所以为了求值的准确性,经常用NVL(null,0) 若指定DISTINCT短语,则表示在计算时要取消指定列中的重复值;若不指定DISTINCT短语和ALL短语,则取默认值ALL,表示不取消重复值。 Eg:表结构 SELECT MAX(sal)max_sal, MIN(sal) sal_min FROM emp_yys SELECT AVG(comm) avg_sal FROM emp_yys 计算4个人的comm(奖金)注意二者的区别,充分证明聚合函数忽略NULL SELECT AVG(NVL(comm,0)FROM emp_yys 计算14个人的comm SELECT count(*) total FROM emp_yys SELECT count(DISTINCT sal) total FROM emp_yys 只要在SELECT语句中使用了分组函数,那么SELECT中其他非分组函数 的列若出现,那么也必须同时出现在GROUP BY子句中,反过来没有限制 若GROUP BY后出现了多列(如:GROUP BY deptno,job)那么就按照这几 列组合值相同的记录分为一组 查看每个部门中每种职位的工资情况 HAVING 用于在进行分组查询后,二次过滤数据的,HAVING不能独立存在,必须跟在GROUP BY之后HAVING短语与WHERE子句的区别:作用对象不同WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。HAVING可以包含聚合函数,而WHERE不可以。WHERE用于第一次检索数据的过滤,HAVING用于检索后,二次过滤的,就 好比淘金子,WHERE区分金子和石头,HAVING是(在挑出金子的基础上)挑出3kg以上的金子6. ORDER BY 子句 写在SELECT语句块的最后一句,对数据按照一定的规则进行序(ASC)(默认 选项,不写ASC或DESC,默认ASC升序)或降序(DESC)进行排序。查询结果 集可以按多个排序列进行排序,根据各排序列的重要性从左向右列出。 首先按第一列进行排序,如果第一列数据相同,再以第二列排序, 若第一列的值全表没有重复,那么第二列的排序会被忽略 以此类推 多列排序,无论是ASC还是DESC每列都要单独设置排序方式 SELECT ename,deptno,sal FROM emp_yys ORDER BY deptno,sal DESC 连接查询: 查询两个或两个以上数据表或视图的查询 连接查询通常建立在存在相互关系的父子表之间 n张表联合查询至少有n-1个连接条件 不加连接条件,就会产生笛卡尔积(笛卡尔积指做关联操作的每张表的每 一行和其表的每一行做组合),要避免 SELECT COUNT(*)FROM emp -14条记录 SELECT COUNT(*)FROM dept -4条记录 SELECT emp.ename,dept.dname FROM emp,dept -56条记录 等值连接 通常是在有主外建关联关系的表间建立,使用 = 连接两表中关联的列(主键 1 外键 多) SELECT e.ename,e.job,d.dname,d.loc FROM emp_yys e, dept_yys d WHERE e.deptno = d.deptno 内连接 返回所有满足连接条件的记录 SELECT e.ename,d.dname FROM emp_yys e JOIN dept_yys d ON( e.deptno = d.deptno) 连接条件 连接两个表 等价于 SELECT e.ename,d.dname FROM emp_yys e, dept_yys d WHERE e.deptno = d.deptno 当两张表中只有一列名字相同,可以使用自然连接(NATURAL JOIN), 会自动寻找两张表列名相同的做等值连接 SELECT e.ename,d.dname FROM emp_yys e NATURAL JOIN dept_yys d 外连接 内连接返回满足连接条件的数据记录 有些情况下,需要返回那些不满足连接条件的记录,需要使用外连接 外连接不仅返回满足连接条件的记录,还将返回不满足连接条件的记 录 以emp_yys为驱动表,emp_yys中不满足的也并入结果集中 SELECT e.ename,d.dname, e.deptnoFROM emp_yys e LEFT OUTER JOIN dept_yys dON e.deptno = d.deptnoORDER BY e.deptno以dept_yys为驱动表,dept_yys中不满足的也并入结果集中SELECT e.ename,d.dname, e.deptnoFROM emp_yys e RIGHT OUTER JOIN dept_yys dON e.deptno = d.deptnoORDER BY e.deptno全外连接,二者都为驱动表SELECT e.ename,d.dname, e.deptnoFROM emp_yys e FULL OUTER JOIN dept_yys dON e.deptno = d.deptnoORDER BY e.deptno 自连接自己连自己,表中的列参照同一个表中的其他列通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接FROM emp_yys worker join emp_yys managerON workwer.mgr = manager.empno (员工上级的编号 = 上级的的编号)【子查询】:查询需要建立在另一个查询的结果基础之上 一个查询结果可能作为另一查询的临时来源或条件,需要在 加工,或者再判断,子查询可以放在select、where、from、having中根据返回结果的不同,子查询可分为单行子查询、多行子查询及多列子查询 单行单列和多行单列子查询通常用在父查询的WHERE子句中: 比较运算符 = 后只能跟单行单列子查询 NOTIN , 比较运算符配合ANY,ALL 后可跟多列子查询 EXISTS 和 NOT EXISTS 格式为:EXISTS(子查询)。 用于判断在指定的表中是否存在数据(是否空?) 带有EXISTS谓词的子查询不返回任何数据,当子查询结果非 空,返回逻辑真值“True”,否则,返回逻辑假值“False”。 Eg:有员工的部门 SELECT deptno FROM dept_yys d WHERE EXISTS( SELECT * FROM emp_yys e WHERE d.deptno = e.deptno)多行多列子查询通常用在父查询的FROM中 在FROM子句中出现了子查询,那么意味着我们要将子查询的 结果当作一张表去看待,从中再次查询想要的结果,此时需注 意:子查询的SELECT语句中,出现了非字段名(列名)的字段(通常是表达式或函数),必须给它们加上别名 在FROM子句中出现的子查询被当作视图对待(又称内视图or 匿名视图),但视图没名字,只能在当前的SQL语句中有效Eg:查询薪水比本部门平均薪水高的员工信息 【思路】:1.查看每个部门的平均薪水(得到子表)2.根据deptno,将emp_yys 和第一步查询出来的子表连接起来比较每名员工的工资(emp_yys)和该员工所在部门的平均工资SELECT e.deptno,e.ename,e.salFROM emp_yys e,(SELECT deptno,AVG(sal) avg_sal FROM emp_yys前边所说的必须加别名否则下面用的时候会出现问题 GROUP BY deptno) xWHERE e.deptno = x.deptno AND e.sal x.avg_salORDER BY e.deptno连接条件通过WHERE子句表达在WHERE子句中,有时既有连接条件又有元组选择条件,这时它们间用AND(与)操作符衔接,且将连接条件放在前面。连接条件中的列名。连接字段类型必须可比,不必相同。 若果直接使用, 会当成聚合函数,而WHERE 子句中,不能出现聚合函数 运行结果: 出现在HAVING中的子查询;Eg:查询 最低薪水 高于 30号部门的最低薪水 的部门信息【思
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理学基础知识填空题库及答案解析
- 基础护理期末题库和及答案解析
- 锅炉工安全培训考试题及答案解析
- 中医痔疮护理试题题库电子版及答案解析
- 2025年常见急救药品试题及答案
- 2025年大数据与云计算技术考试试卷及答案
- 2025年农村信用社招聘考试综合基础知识题库及答案
- 2025年中学教师职业道德考试试卷及答案
- 2025年妇产科主治医师试题及答案组卷
- 2025年高中面试化学考试题及答案
- 壶腹部肿瘤的治疗及护理
- 感术行动培训课件
- 桥梁施工安全会议记录
- 乡村旅游环境卫生培训
- 六级英语试题库电子版及答案
- 2025年工程机械行业发展研究报告
- (二模)2025年5月济南市高三高考针对性训练英语试卷(含答案解析)
- 智慧燃气解决方案
- 抖音来客本地生活服务丽人美容美体商家短视频拍摄创作运营方案
- 《妊娠期合并心脏病》课件
- 政府采购投标及履约承诺函(最终五篇)
评论
0/150
提交评论