A. oracle sql的左外连接怎么写
select * from tb1 left join tb2 on tb1.id=tb2.id where ........
B. 在Oracle中查询出来后有一列中的首位数字为0,我把数据提取出来后,那个为0的数字就没有了。
你是怎么提取出来的。
你句子这也写试试: to_char(chr(9)||c.dist_nbr )
C. oracle数据库的sql语句问题:用substr()方法截取字符串,字符串的第一位是0还是1,网上说0,我试一下是1
SUBSTR(string,start,count)取子字符串,从start开始(如果start是负数,从尾部开始),取count个
上述就是PL/SQL函数的解释,从中可以看出,是1开始从左开始取数;如果是负值,那么就从右开始取数。
D. oracle数据库如何修改字段的数据类型
1、首先打开plsql,连接上oracle数据库,假设有一张数据库表叫做 tblTest,通过sql查询也可以看出,这里面是有测试数据的。
E. oracle sqlplus 命令都有那些 show命令除了 parameter外,还有什么可以show。
一般在SQL>下进行SQLPLUS操作,都需要进行必要的环境设置才能完成我们所需要的输出。所有环境的设置由SET命令加相应的环境变量来完成。下面是常用的环境设置:
§2.5.1 ARRAYSIZE(取回的行数)
SET ARRAY[SIZE]{integer}
一次可以提取(Fetch)的行的数目,1->5000,当有较长字段时应设小些。
§2.5.2 AUTOCOMMIT(自动提交)
SET AUTO [COMMIT] { [ OFF | ON | IMM | n] }
用于在操作中是自动提交或是部分提交或是不自动提交。
1) 或IMM使得在完成每条SQL语句时将未提交的改变立刻提交给数据库系统。ON
2) 允许在用户发出COMMIT后,可以执行命令的数量(将n条SQL语句所做的改变进行提交)。N
3) 停止自动提交,用户必须用COMMIT命令才能被提交。OFF
§2.5.3 LINESIZE(行显示宽度)
可以设置LINESIZE环境变量来控制行的显示宽度,缺省是80个字符。
SET Lin[esize]{80|integer}
Integer =设置行宽度(字符个数),最大值999,如:
SQL>set linesize 160
§2.5.4 LONG(长类型显示字节数)
在缺省的SQL> 状态下,SQL>缓冲区用于显示LONG 的字节数只有80个字符。如果我们需要查询的列中含有 LONG类型的字段的话,就需要将LONG缓冲区设置大些。
SET LONG{80|integer}
Integer是 显示或拷贝long值的最大宽度, n=1->32767(但必须小于Maxdata值)
SQL>show Maxdata (最大行宽)
SQL>set long 2000
§2.5.5 PAGESIZE(页行数)
在缺省的SQL> 状态下,SQL>缓冲区显示页的行数是24行,其中22行显示数据,2行显示标题和横线。我们将pagesize 设置大些以减少提示标题和横线。
SET pag[esize] {24|integer}
SQL>SET pagesize 66
§2.5.6 PAUSE(暂停)
可以设置 PAUSE 为ON 或OFF来控制屏幕显示。当设置为ON 时,在select 语句发出后需要按Enter键才能显示一屏。
SET PAUSE [ ON | OFF ]
SQL> setpause on
提示:在发出select 语句并按Enter键后还要再按Enter键才能显示结果.
§2.5.7 SPACE(列间空格)
可用 set space 来设置各列间的空格数,语法为:
SET SPA[CE] {1|n}
N为设置输出行列间的空格数,最大为10。
SQL>set space 2
建议:在一般情况下,不用设置space参数。
§2.5.8 Termout (启/停屏幕显示)
TERMOUT用于设置在屏幕上显示或不显示所输出的信息。
SET TERMOUT { ON | OFF }
set termout off
set termout on
set termout off 常用SPOOL XXX时,即关闭报表在屏幕上的显示(节省时间)
set termout on 常用SPOOL off之后,即恢复报表在屏幕上的显示
§2.5.9 ECHO (启/停命令显示)
可以用ECHO命令来显示或不显示所执行的SQL命令。语法如:
SET ECHO{OFF|ON}
显示执行当中的各命令( 即用start 时)
set echo 受到 set termout 的影响
set pagesize 100
set echo on
select table_name from dict where rownum<20;
select * from cat where rownum<30;
set echo off
--下面只显示结果不显示命令:
select table_name from dict where rownum<20;
select * from cat where rownum<30;
§2.5.10 TRANSACTION (启动事务)
一个很重要的事务环境设置是TRANSACTION。它包括两个部分的内容:
SET TRANSACTION { READ ONLY | USE ROLLBACK SEGMENT segment_name }
READ ONLY是用于保证读的一致性。即其他用户的修改不影响当前查询结果。
USE ROLLBACK SEGMENT segment_name是为当前所处理的事务指定专门的回滚段。这主要是在进行大量的Insert或Delete或Update时,需要一个大的回滚段以保证事务正常完成。详细见数据库管理员。
§2.5.11 SHOW ALL(列出所有参数)
可以用SHOW ALL来显示当前的所有参数情况。它的用法很简单。比如:
SQL> show all
appinfo为ON并且已设置为"SQL*Plus"
arraysize 15
autocommit OFF
autoprint OFF
autorecovery OFF
autotrace OFF
blockterminator "." (hex 2e)
btitle OFF and为下一条SELECT语句的前几个字符
cmdsep OFF
colsep " "
compatibility version NATIVE
concat "." (hex 2e)
commit 0
COPYTYPECHECK为ON
define "&" (hex 26)
describe DEPTH 1 LINENUM OFF INDENT ON
markup HTML OFF SPOOL OFF ENTMAP ON PREFORMAT OFF
echo OFF
editfile "afiedt.buf"
embedded OFF
escape OFF
flagger OFF
flush ON
heading ON
headsep "|" (hex 7c)
instance "local"
linesize 80
lno 14
loboffset 1
logsource ""
long 80
longchunksize 80
newpage 1
null ""
numformat ""
numwidth 10
pagesize 14
PAUSE为OFF
pno 0
recsep WRAP
recsepchar " " (hex 20)
release 801070000
repfooter OFF and为NULL
repheader OFF and为NULL
serveroutput OFF
shiftinout INVISIBLE
showmode OFF
spool OFF
sqlblanklines OFF
sqlcase MIXED
sqlcode 0
sqlcontinue "> "
sqlnumber ON
sqlprefix "#" (hex 23)
sqlprompt "SQL> "
sqlterminator ";" (hex 3b)
suffix "sql"
tab ON
termout ON
time OFF
timing OFF
trimout ON
trimspool OFF
ttitle OFF and为下一条SELECT语句的前几个字符
underline "-" (hex 2d)
USER为"SYS"
verify ON
wrap :行将为已换行
SQL>
你可以从上面的参数中看到其当前值,也可以修改某些参数的值。
格式化输出
§2.6.1 一般数据的格式化输出
在Oracle的SQL>下,经常用COLUMN命令来对所输出的列进行格式化,即按照一定的格式进行显示。COLMUN命令语法如下:
COL[UMN] [{ column | expr } [ option_1 ... option_n ] ]
column:列名
expr:有效的SQL表达式
option_1...option_n:可以是下列之一:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE {expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
下面给出常用的关键字的解释:
Alias 给出列的别名,BREAK和COUMN可以引用所定义的别名。
CLEAR 取消列的定义。
FORMAT列显示格式,format为:
9999990 9或0的个数决定最多显示多少位
9,999,999.99按照逗号和小数点来显示数据,若是0以空格显示
099999 显示前面补0
$999,999.99 数字前加美圆号
B99999 若为0,则结果为空白
99999Mi 若数字为负,则负号放在数字后(右边),缺省放在左边
99999PR 负号将以括号括起
9.999EEEE 以科学记数法表示(必须有4个E)
999V99 数字乘以10n ,如1234变为123400
DATE 采用日期数字格式(MM/DD/YY)
Heading重新标记列的显示标题,如:
SQL> col ename heading 姓名format a10
SQL> select ename,sal from emp;
例子:
SQL
COLUMN SALARY FOR $9,999,999.99
COLUMN LAST_NAME FOR A35.
§2.6.2 日期的格式化输出
Oracle系统提供了一个NLS_DATE_FORMAT的环境变量来设置日期的显示格式。用它可以完成按照不同格式要求的显示,比如按照中国的习惯为yyyy年mm月dd日等。
1.系统日期 sysdate 的显示
用sysdate 可以显示ORACLE RDBMS 所在机器的日期及时间,如:
SQL> alter session set nls_date_format ='"公元"yyyy"年"mm"月"dd"日"';
会话已更改。
SQL> select sysdate from al;
SYSDATE
------------------
公元2001年05月30日
2.日期类型的显示
select sysdate,to_char(sysdate,’yyyy.mm.dd hh24:mi;ss’) from al;
SQL> connect scott/tiger
已连接。
SQL> alter session set nls_date_format ='yyyy"年"mm"月"dd"日生"';
会话已更改。
SQL> col HIREDATE heading生日
SQL> col sal heading工资
SQL> col sal ename姓名
SQL> select ename,sal,hiredate from emp;
姓名 工资 生日
---------- ---------- -----------------
SMITH 800 1980年12月17日生
ALLEN 1600 1981年02月20日生
WARD 1250 1981年02月22日生
JONES 2975 1981年04月02日生
MARTIN 1250 1981年09月28日生
BLAKE 2850 1981年05月01日生
CLARK 2450 1981年06月09日生
SCOTT 3000 1987年04月19日生
KING 5000 1981年11月17日生
TURNER 1500 1981年09月08日生
ADAMS 1100 1987年05月23日生
JAMES 950 1981年12月03日生
FORD 3000 1981年12月03日生
MILLER 1300 1982年01月23日生
已选择14行。
§2.7 加标题
有时在输出一些结果时,可能需要加一些标题,如表上面的顶标题,落款等。这样的要求可由Ttitle和Btitle来完成。
ttitle和btitle
ttitle [center|left|right]string 顶标题
btitle [center|left|right]string 底标题
ttitle center 'XX公司人员情况表'
btitle left '制表人:xxxx' right '日期:xxxx年xx月'
Clear ttitle
§2.8 建立简单报告
我们可以用TTITLE、BTITLE、COLUMN、BREAK ON、COMPUTE SUM及SET LINESIZE、SET PAGESIZE、SET NEWPAGE来设置查询结果的显示格式;在用SPOOL命令将显示结果输出到一个操作系统文件中去,一般输出文件的类型为.LST。
建立简单报告主要使用下面命令来实现:
1. SPOOL命令
SPOOL filename 将缓冲区的内容写到文件中
SPOOL off 终止写命令
2. COLUMN 命令
column col_name[,heading] format format_spe
把字段的结果指定为一种输出格式
COL name heading '姓名' for a10
COL sal heading '工资' for 9,999.99
3.ttitle、btitle
ttitle [center|left|right]string 顶标题
btitle [center|left|right]string 底标题
ttitle center 'XX公司人员情况表'
btitle left '制表人:赵元杰' right '日期:1998.11月'
Clear ttitle
4.break、compute
clear breaks,clear computes
break on column 在该列上中断
break on row 在每一行上中断
break on Page
break on report
skip n 跳过n行
skip page 跳过未用完的页
compute avg
compute count
compute max
compute min
compute std
compute sum
compute var
compute num 计算所有行
compute sum of sal on deptno
5.set 在报表中的设置
l set termout off、set termout on命令
l set termout off 常用SPOOL XXX前,即关闭报表在屏幕上的显示(节省时间)
l set termout on 常用SPOOL off之后,即恢复报表在屏幕上的显示
l set ECHO{OFF|ON} 显示执行当中的各命令(即用start 时),set echo 受到 set termout 的影响
l set Lin[esize]{80|integer} 设置行宽度,最大值999
l set pag[esize] {24|integer} 设置页的大小
例子:
SQL>COL ename heading ‘姓名’ for a12
SQL>COL sal heading ‘工资’ for a999,999.99
SQL>COL hiredate heading ‘出生’
SQL>SET LINESIZE 200
SQL>SET PAGESIZE 60
SQL>SPOOL c:\all_emp
SQL>select ename,sal,deptno,hiredate from emp order by deptno;
SQL>SPOOL OFF
§2.9 输入变量
Oracle提供一种在处理SQL语句时可以将参数作为变量来对待的技术,即在条件句中可以是变量而不是具体的值,这样的处理就是输入变量。这样做的目的就是可以重复使用同样的语句,每次只要输入相应的值即可。要实现将参数写成为变量,只要在变量前加一个&号即可。看下面语句:
Select sid, serial#,username, command from v$session
Where USERNAME = upper(‘&usr’);
这样的语句在运行中,系统会自动提示你回答变量的具体值,上面语句运行时提示和回答时显示的信息如下:
SQL> Select sid, serial#,username, command from v$session
2 Where USERNAME = upper('&usr');
输入 usr 的值: sys
原值 2: Where USERNAME = upper('&usr')
新值 2: Where USERNAME = upper('sys')
SID SERIAL# USERNAME COMMAND
---------- ---------- ------------------------------ ----------
7 26 SYS 3
在变量说明中,可以使用多个变量,比如:
Alter system kill session ‘&sid,&ser’;
或
Alter system kill session ‘&会话号,&序列号’;
它的运行情况如下:
SQL> Select sid, serial#,username, command from v$session;
SID SERIAL# USERNAME COMMAND
---------- ---------- ------------------------------ ----------
1 1 0
2 1 0
3 1 0
4 1 0
5 1 0
6 1 0
7 26 SYS 3
8 16 ZHAO 0
已选择8行。
SQL> Alter system kill session '&sid,&ser';
输入sid的值: 8
输入ser的值: 16
原值 1: Alter system kill session '&sid,&ser'
新值 1: Alter system kill session '8,16'
系统已更改。
一般系统缺省下是使用 “&” 符号来定义变量,你也可以使用另外的符号来代替,比如不喜欢用 & 而要用 ?,则有:
SQL> set define ?
SQL> select sid,serial#,username from v$session where username='?usr';
输入 usr 的值: SYS
原值 1: select sid,serial#,username from v$session where username='?usr'
新值 1: select sid,serial#,username from v$session where username='SYS'
SID SERIAL# USERNAME
---------- ---------- ------------------------------
7 26 SYS
次时由于我们修改了会话环境的参数值,可以用下面命令查看:
SQL> show define
define "?" (hex 3f)
F. Oracle SQL查询和SQL函数 问题
诶亚
看来我的贴几章书才行
1.请总结为日期字段赋值的几种方式,并举例说明
oracle中有个到当前系统时间--sysdate,如:
select sysdate from al
可对日期进行自述运算:
select (sysdate-mybirthday)/7 from person
months_between('01-sep-95','11-jan-94')---取得二个日期之间的间隔月数(19.6774194)
add_months('11-jan-94',6)---给指定日期加上指定的月份后得到一个新的日期(11-jul-94)
next_day('01-sep-85','friday')---取得当前日期中下个周五的日期(01-jul-95)
last_day('01-feb-95')---取得当前日期中月份的最后一天(28-feb-95)
round进行四舍五入,trunc则否,以下是我的操作结果:
sysdate为:
SYSDATE
----------
28-7月 -06
select
round(sysdate,'month') RM,
round(sysdate,'year') RY,
trunc(sysdate,'month') TM,
trunc(sysdate,'year') TY
from al;
RM RY TM TY
---------- ---------- ---------- ----------
01-8月 -06 01-1月 -07 01-7月 -06 01-1月 -06
2.请总结select语句的几种用法,并举例说明
inner join
left join
right join
cross join (一般不允许用)
3.请总结SQL操作符,每种操作符各举一例说明
||字符串相加
>
<
=
Like
Between and
4.请总结SQL单行函数,每个函数各举一例说明
越全面越好,
>字符处理
upper(str)---将字符串str全部转换成大写
lower(str)---将字符串str全部转换成小写
initcap(str)---将字符串中每个单词的首字母大写
concat(str1,str2)---将字符串str1与str2连接起来(也可以通过'||'号直接相连)
substr(str,a,b)---取字符串str中的指定字符,从位置a开始取长度为b的字符串,假如a为正则从左边开始,否则从右边开始
instr(str,'z')---取得str字符串中从左边开始每一次出现z字符的下标位置(下标从1开始)
lpad(str,12,'*')---左填充,即将字符串str长度填充到12,假如其不足12位则在左边以*号填充
rpad(str,12,'*')---右填充,同上
length(str)---计算字符串str的长度
2>数字函数
round(45.926,2)---将前一数保留指定的小数位,并四舍五入(45.93),假如指定位是负数则意为在小数点左边保留指定位,如round(45.923,-1)=50,rount(45.923,0)=46,round(45.93,-2)=0,round(55.93,-2)=100
trunc(45.926,2)---同上,得不四舍五入(45.92)
mod(1600,300)---求余(100)
G. oracle数据库的sql语句问题:用substr()方法截取字符串,字符串的第一位是0还是1,网上说0,我试一下是1
select
substr('a123456',instr('a123456','a')+1,len('a123456')-instr('a123456','a'))
from
al
instr
返回1,
所以给它+1
,
从第2位开始截取到总长度-‘a’这个字符串的位置,
就是
6
,
所以最终会是
select
substr('a123456',2,6)
from
al
这么写能明白吗?
H. 请教在MSSQL中有和ORACLE里LPAD一样的补齐字符函数吗
Oracle lpad函数将左边的字符串填充一些特定的字符,其语法格式如下: lpad( string1, padded_length, [ pad_string ] )
其中string1是需要粘贴字符的字符串 padded_length是返回的字符串的数量,如果这个数量比原字符串的长度要短,
lpad函数将会把字符串截取成padded_length; pad_string是个可选参数,这个字符串是要粘贴到string1的左边,
如果这个参数未写,lpad函数将会在string1的左边粘贴空格。
例如: lpad('tech', 7); 将返回' tech'
lpad('tech', 2); 将返回'te'
lpad('tech', 8, '0'); 将返回'0000tech'
lpad('tech on the net', 15, 'z'); 将返回 'tech on the net'
lpad('tech on the net', 16, 'z'); 将返回 'ztech on the net'
Lpad(str1,number,str2),这个函数的意思是,如果str1不足number那么多位,则使用str2去补齐左边的空位
I. oracle sql 如何选取数据集中四分位数(min,25%,MED,75%max)
-- 首先,以超级管理员的身份登录oracle
sqlplus sys/bjsxt as sysdba
--然后,解除对scott用户的锁
alter user scott account unlock;
--那么这个用户名就能使用了。
--(默认全局数据库名orcl)
1、select ename, sal * 12 from emp; --计算年薪
2、select 2*3 from al; --计算一个比较纯的数据用al表
3、select sysdate from al; --查看当前的系统时间
4、select ename, sal*12 anuual_sal from emp; --给搜索字段更改名称(双引号 keepFormat 别名有特殊字符,要加双引号)。
5、--任何含有空值的数学表达式,最后的计算结果都是空值。
6、select ename||sal from emp; --(将sal的查询结果转化为字符串,与ename连接到一起,相当于Java中的字符串连接)
7、select ename||'afasjkj' from emp; --字符串的连接
8、select distinct deptno from emp; --消除deptno字段重复的值
9、select distinct deptno , job from emp; --将与这两个字段都重复的值去掉
10、select * from emp where deptno=10; --(条件过滤查询)
11、select * from emp where empno > 10; --大于 过滤判断
12、select * from emp where empno <> 10 --不等于 过滤判断
13、select * from emp where ename > 'cba'; --字符串比较,实际上比较的是每个字符的AscII值,与在Java中字符串的比较是一样的
14、select ename, sal from emp where sal between 800 and 1500; --(between and过滤,包含800 1500)
15、select ename, sal, comm from emp where comm is null; --(选择comm字段为null的数据)
16、select ename, sal, comm from emp where comm is not null; --(选择comm字段不为null的数据)
17、select ename, sal, comm from emp where sal in (800, 1500,2000); --(in 表范围)
18、select ename, sal, hiredate from emp where hiredate > '02-2月-1981'; --(只能按照规定的格式写)
19、select ename, sal from emp where deptno =10 or sal >1000;
20、select ename, sal from emp where deptno =10 and sal >1000;
21、select ename, sal, comm from emp where sal not in (800, 1500,2000); --(可以对in指定的条件进行取反)
22、select ename from emp where ename like '%ALL%'; --(模糊查询)
23、select ename from emp where ename like '_A%'; --(取第二个字母是A的所有字段)
24、select ename from emp where ename like '%/%%'; --(用转义字符/查询字段中本身就带%字段的)
25、select ename from emp where ename like '%$%%' escape '$'; --(用转义字符/查询字段中本身就带%字段的)
26、select * from dept order by deptno desc; (使用order by desc字段 对数据进行降序排列 默认为升序asc);
27、select * from dept where deptno <>10 order by deptno asc; --(我们可以将过滤以后的数据再进行排序)
28、select ename, sal, deptno from emp order by deptno asc, ename desc; --(按照多个字段排序 首先按照deptno升序排列,当detpno相同时,内部再按照ename的降序排列)
29、select lower(ename) from emp; --(函数lower() 将ename搜索出来后全部转化为小写);
30、select ename from emp where lower(ename) like '_a%'; --(首先将所搜索字段转化为小写,然后判断第二个字母是不是a)
31、select substr(ename, 2, 3) from emp; --(使用函数substr() 将搜素出来的ename字段从第二个字母开始截,一共截3个字符)
32、select chr(65) from al; --(函数chr() 将数字转化为AscII中相对应的字符)
33、select ascii('A') from al; --(函数ascii()与32中的chr()函数是相反的 将相应的字符转化为相应的Ascii编码) )
34、select round(23.232) from al; --(函数round() 进行四舍五入操作)
35、select round(23.232, 2) from al; --(四舍五入后保留的小数位数 0 个位 -1 十位)
36、select to_char(sal, '$99,999.9999')from emp; --(加$符号加入千位分隔符,保留四位小数,没有的补零)
37、select to_char(sal, 'L99,999.9999')from emp; --(L 将货币转化为本地币种此处将显示¥人民币)
38、select to_char(sal, 'L00,000.0000')from emp; --(补零位数不一样,可到数据库执行查看)
39、select to_char(hiredate, 'yyyy-MM-DD HH:MI:SS') from emp; --(改变日期默认的显示格式)
40、select to_char(sysdate, 'yyyy-MM-DD HH:MI:SS') from al; --(用12小时制显示当前的系统时间)
41、select to_char(sysdate, 'yyyy-MM-DD HH24:MI:SS') from al; --(用24小时制显示当前的系统时间)
42、select ename, hiredate from emp where hiredate > to_date('1981-2-20 12:24:45','YYYY-MM-DD HH24:MI:SS'); --(函数to-date 查询公司在所给时间以后入职的人员)
43、select sal from emp where sal > to_number('$1,250.00', '$9,999.99'); --(函数to_number()求出这种薪水里带有特殊符号的)
44、select ename, sal*12 + nvl(comm,0) from emp; --(函数nvl() 求出员工的"年薪 + 提成(或奖金)问题")
45、select max(sal) from emp; -- (函数max() 求出emp表中sal字段的最大值)
46、select min(sal) from emp; -- (函数max() 求出emp表中sal字段的最小值)
47、select avg(sal) from emp; --(avg()求平均薪水);
48、select to_char(avg(sal), '999999.99') from emp; --(将求出来的平均薪水只保留2位小数)
49、select round(avg(sal), 2) from emp; --(将平均薪水四舍五入到小数点后2位)
50、select sum(sal) from emp; --(求出每个月要支付的总薪水)
------------------------/组函数(共5个):将多个条件组合到一起最后只产生一个数据------min() max() avg() sum() count()----------------------------/
51、select count(*) from emp; --求出表中一共有多少条记录
52、select count(*) from emp where deptno=10; --再要求一共有多少条记录的时候,还可以在后面跟上限定条件
53、select count(distinct deptno) from emp; --统计部门编号前提是去掉重复的值
------------------------聚组函数group by() --------------------------------------
54、select deptno, avg(sal) from emp group by deptno; --按照deptno分组,查看每个部门的平均工资
55、select max(sal) from emp group by deptno, job; --分组的时候,还可以按照多个字段进行分组,两个字段不相同的为一组
56、select ename from emp where sal = (select max(sal) from emp); --求出
57、select deptno, max(sal) from emp group by deptno; --搜素这个部门中薪水最高的的值
--------------------------------------------------having函数对于group by函数的过滤 不能用where--------------------------------------
58、select deptno, avg(sal) from emp group by deptno having avg(sal) >2000; (order by )--求出每个部门的平均值,并且要 > 2000
59、select avg(sal) from emp where sal >1200 group by deptno having avg(sal) >1500 order by avg(sal) desc;--求出sal>1200的平均值按照deptno分组,平均值要>1500最后按照sal的倒序排列
60、select ename,sal from emp where sal > (select avg(sal) from emp); --求那些人的薪水是在平均薪水之上的。
61、select ename, sal from emp join (select max(sal) max_sal ,deptno from emp group by deptno) t on (emp.sal = t.max_sal and emp.deptno=t.deptno); --查询每个部门中工资最高的那个人
------------------------------/等值连接--------------------------------------
62、select e1.ename, e2.ename from emp e1, emp e2 where e1.mgr = e2.empno; --自连接,把一张表当成两张表来用
63、select ename, dname from emp, dept; --92年语法 两张表的连接 笛卡尔积。
64、select ename, dname from emp cross join dept; --99年语法 两张表的连接用cross join
65、select ename, dname from emp, dept where emp.deptno = dept.deptno; -- 92年语法 表连接 + 条件连接
66、select ename, dname from emp join dept on(emp.deptno = dept.deptno); -- 新语法
67、select ename,dname from emp join dept using(deptno); --与66题的写法是一样的,但是不推荐使用using : 假设条件太多
--------------------------------------/非等值连接------------------------------------------/
68、select ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal); --两张表的连接 此种写法比用where更清晰
69、select ename, dname, grade from emp e
join dept d on(e.deptno = d.deptno)
join salgrade s on (e.sal between s.losal and s.hisal)
where ename not like '_A%'; --三张表的连接
70、select e1.ename, e2.ename from emp e1 join emp e2 on(e1.mgr = e2.empno); --自连接第二种写法,同62
71、select e1.ename, e2.ename from emp e1 left join emp e2 on(e1.mgr = e2.empno); --左外连接 把左边没有满足条件的数据也取出来
72、select ename, dname from emp e right join dept d on(e.deptno = d.deptno); --右外连接
73、select deptno, avg_sal, grade from (select deptno, avg(sal) avg_sal from emp group by deptno) t join salgrade s on (t.avg_sal between s.losal and s.hisal);--求每个部门平均薪水的等级
74、select ename from emp where empno in (select mgr from emp); -- 在表中搜索那些人是经理
75、select sal from emp where sal not in(select distinct e1.sal from emp e1 join emp e2 on(e1.sal < e2.sal)); -- 面试题 不用组函数max()求薪水的最大值
76、select deptno, max_sal from
(select avg(sal) max_sal,deptno from emp group by deptno)
where max_sal =
(select max(max_sal) from
(select avg(sal) max_sal,deptno from emp group by deptno)
);--求平均薪水最高的部门名称和编号。
77、select t1.deptno, grade, avg_sal from
(select deptno, grade, avg_sal from
(select deptno, avg(sal) avg_sal from emp group by deptno) t
join salgrade s on(t.avg_sal between s.losal and s.hisal)
) t1
join dept on (t1.deptno = dept.deptno)
where t1.grade =
(
select min(grade) from
(select deptno, grade, avg_sal from
(select deptno, avg(sal) avg_sal from emp group by deptno) t
join salgrade s on(t.avg_sal between s.losal and s.hisal)
)
)--求平均薪水等级最低的部门的名称 哈哈 确实比较麻烦
78、create view v$_dept_avg_sal_info as
select deptno, grade, avg_sal from
(select deptno, avg(sal) avg_sal from emp group by deptno) t
join salgrade s on(t.avg_sal between s.losal and s.hisal);
--视图的创建,一般以v$开头,但不是固定的
79、select t1.deptno, grade, avg_sal from v$_dept_avg_sal_info t1
join dept on (t1.deptno = dept.deptno)
where t1.grade =
(
select min(grade) from
v$_dept_avg_sal_info t1
)
)--求平均薪水等级最低的部门的名称 用视图,能简单一些,相当于Java中方法的封装
80、---创建视图出现权限不足时候的解决办法:
conn sys/admin as sysdba;
--显示:连接成功 Connected
grant create table, create view to scott;
-- 显示: 授权成功 Grant succeeded
81、-------求比普通员工最高薪水还要高的经理人的名称 -------
select ename, sal from emp where empno in
(select distinct mgr from emp where mgr is not null)
and sal >
(
select max(sal) from emp where empno not in
(select distinct mgr from emp where mgr is not null)
)
82、---面试题:比较效率
select * from emp where deptno = 10 and ename like '%A%';--好,将过滤力度大的放在前面
select * from emp where ename like '%A%' and deptno = 10;
83、-----表的备份
create table dept2 as select * from dept;
84、-----插入数据
insert into dept2 values(50,'game','beijing');
----只对某个字段插入数据
insert into dept2(deptno,dname) values(60,'game2');
85、-----将一个表中的数据完全插入另一个表中(表结构必须一样)
insert into dept2 select * from dept;
86、-----求前五名员工的编号和名称(使用虚字段rownum 只能使用 < 或 = 要使用 > 必须使用子查询)
select empno,ename from emp where rownum <= 5;
86、----求10名雇员以后的雇员名称--------
select ename from (select rownum r,ename from emp) where r > 10;
87、----求薪水最高的前5个人的薪水和名字---------
select ename, sal from (select ename, sal from emp order by sal desc) where rownum <=5;