Oracle命令行工具基本操作及SQL 命令

上一篇 / 下一篇  2012-07-13 11:39:21 / 个人分类:数据库

2. SQL*PLUS
这是个Oracle提供的最常用,也是最好用的sql命令执行工具。

2.1.1. 登录
C:> sqlplusw
C:> sqlplus /nolog
SQL> conn username/password@Oranet
如,system登录
SQL> conn system/systempwd@whfc
如果要行一些只有sysdba才能执行的命令,必须以sysdba特权登录:
SQL> conn sys/syspwd@whfc as sysdba

2.1.2. 创建表空间
必须有CREATE TABLESPACE 特权的用户才能创建表空间,比如system
和sys用户。
SQL> conn system@whfc01
请输入口令:
已连接。
SQL> create tablespace ts_test datafile '/data2/oradata/ciis/ts_test01.dbf' size
10m ;
表空间已创建。
2.1.3. 添加数据文件
SQL> alter tablespace ts_test add datafile '/data2/oradata/ciis/ts_test02.dbf' size
10m ;
表空间已更改。
2.1.4. 查看表空间大小
SQL> DESC DBA_DATA_FILES
名称 是否为空? 类型
-------------------- -------- --------------
FILE_NAME VARCHAR2(513)
FILE_ID NUMBER
TABLESPACE_NAME VARCHAR2(30)
BYTES NUMBER
BLOCKS NUMBER
STATUS VARCHAR2(9)
RELATIVE_FNO NUMBER
AUTOEXTENSIBLE VARCHAR2(3)
MAXBYTES NUMBER
MAXBLOCKS NUMBER
INCREMENT_BY NUMBER
USER_BYTES NUMBER
USER_BLOCKS NUMBER
SQL> SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 M
2 FROM DBA_DATA_FILES
3 GROUP BY TABLESPACE_NAME;
TABLESPACE_NAME M
-------------------- ----------
DEVELOP1 8000
DEVELOP2 14336
DEVELOPINDEX 4106
DRSYS 20
EXAMPLE 145.625
INDX 25
ODM 20
SYSTEM 1024
TOOLS 10
TS_CI_13 4094
TS_CI_32 4094
TS_CI_33 2047
TS_II_13 2047
TS_II_32 2047
TS_PI_1301 2047
TS_PI_1302 2047
TS_PI_3201 2047
TS_TEST 20
UNDOTBS1 5048
USERS 25
XDB 38.125
已选择21 行。
SQL> SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 M
2 FROM DBA_DATA_FILES
3 WHERE TABLESPACE_NAME='TS_TEST'
4 GROUP BY TABLESPACE_NAME;
TABLESPACE_NAME M
-------------------- ----------
TS_TEST 20
2.1.5. 查看自由(剩余)表空间大小
SQL> desc DBA_FREE_SPACE
名称 是否为空? 类型
---------------------- -------- ---------------
TABLESPACE_NAME VARCHAR2(30)
FILE_ID NUMBER
BLOCK_ID NUMBER
BYTES NUMBER
BLOCKS NUMBER
RELATIVE_FNO NUMBER
SQL> SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 M
2 FROM DBA_FREE_SPACE
3 WHERE tablespace_name='TS_TEST'
4 GROUP BY TABLESPACE_NAME;
TABLESPACE_NAME M
-------------------- ----------
TS_TEST 19.6875
2.1.6. 创建新用户
SQL> create user test identified by test default tablespace ts_test temporary
tablespace temp;
用户已创建
2.1.7. 给用户角色特权
SQL> grant connect,resource to test;
授权成功。
2.2. 用户数据对象
2.2.1. 查看当前用户表名
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
CC TABLE
DEPT TABLE
EMP TABLE
EMP_IOT TABLE
SALGRADE TABLE
已选择6 行。
2.2.2. 创建数据表
SQL> CREATE TABLE book (
2 bookid NUMBER(18),
3 bookname VARCHAR2(80) NOT NULL,
4 author VARCHAR2(40),
5 price NUMBER(6,2)
6 );
表已创建。
2.2.3. 创建索引
SQL> CREATE INDEX idx_book_bookid ON book(bookname);
索引已创建。
2.2.4. 创建主键约束
SQL> ALTER TABLE book ADD CONSTRAINT pk_book_bookid PRIMARY
KEY (bookid);
表已更改。
2.2.5. 显示表结构
SQL> desc book
名称 是否为空? 类型
------------------------------ -------- ----------------------
BOOKID NOT NULL NUMBER(18)
BOOKNAME NOT NULL VARCHAR2(80)
AUTHOR VARCHAR2(40)
PRICE NUMBER(6,2)
2.2.6. 查看表的索引
SQL> column index_name format a30
SQL> select table_name, index_name from user_indexes;
TABLE_NAME INDEX_NAME
------------------------------ ------------------------
BOOK IDX_BOOK_BOOKNAME
BOOK PK_BOOK_BOOKID
2.2.7. 查看索引列
SQL> select table_name, index_name, column_name, column_position
from user_ind_columns;
TABLE_NAME INDEX_NAME COLUMN_NAME COLUMN_POSITION
-------------- ------------------- -------------- ---------------
BOOK PK_BOOK_BOOKID BOOKID 1
BOOK IDX_BOOK_BOOKNAME BOOKNAME 1
2.2.8. 查看数据段占空间大小
数据段包括表、索引、分区等。
SQL> desc user_segments
名称 是否为空? 类型
-------------------- -------- ------------------------
SEGMENT_NAME VARCHAR2(81)
PARTITION_NAME VARCHAR2(30)
SEGMENT_TYPE VARCHAR2(18)
TABLESPACE_NAME VARCHAR2(30)
BYTES NUMBER
BLOCKS NUMBER
EXTENTS NUMBER
INITIAL_EXTENT NUMBER
NEXT_EXTENT NUMBER
MIN_EXTENTS NUMBER
MAX_EXTENTS NUMBER
PCT_INCREASE NUMBER
FREELISTS NUMBER
FREELIST_GROUPS NUMBER
BUFFER_POOL VARCHAR2(7)
SQL> select segment_name,segment_type,bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ --------------- ---------
BOOK TABLE 65536
IDX_BOOK_BOOKNAME INDEX 65536
PK_BOOK_BOOKID INDEX 65536

2.2.9. 查看表占空间大小
SQL> select segment_name,segment_type,bytes from user_segments where
segment_type='TABLE';
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ---------------- --------
BOOK TABLE 65536 


 

经典的SQL语句

1. 行列转换--普通

假设有张学生成绩表(CJ)如下
Name    Subject     Result
张三    语文        80
张三    数学        90
张三    物理        85
李四    语文        85
李四    数学        92
李四    物理        82

想变成    
姓名   语文   数学   物理
张三   80     90     85
李四   85     92     82

declare @sql varchar(4000)
set @sql = 'select Name'
select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
 from (select distinct Subject from CJ) as a
select @sql = @sql+' from test group by name'
exec(@sql)

2. 行列转换--合并

有表A,
 id pid
 1   1
 1   2
 1   3
 2   1
 2   2
 3   1
如何化成表B:
 id pid
  1  1,2,3
  2  1,2
  3  1

创建一个合并的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+','+cast(pid as varchar) from 表A where id=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go

--调用自定义函数得到结果
select distinct id,dbo.fmerg(id) from 表A

3. 如何取得一个数据表的所有列名

方法如下:先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。
SQL语句如下:
declare @objid int,@objname char(40)
set @objname = 'tablename'
select @objid = id from sysobjects where id = object_id(@objname)
select 'Column_name' = name from syscolumns where id = @objid order by colid

是不是太简单了? 呵呵 不过经常用阿.

4. 通过SQL语句来更改用户的密码

修改别人的,需要sysadmin  role    
EXEC  sp_password  NULL,  'newpassword',  'User'

如果帐号为SA执行EXEC  sp_password  NULL,  'newpassword',  sa 

5. 怎么判断出一个表的哪些字段不允许为空?

select  COLUMN_NAME  from  INFORMATION_SCHEMA.COLUMNS  where  IS_NULLABLE='NO'  and  TABLE_NAME=tablename 

6. 如何在数据库里找到含有相同字段的表?
a. 查已知列名的情况
SELECT  b.name  as  TableName,a.name  as  columnname  
From  syscolumns    a  INNER  JOIN    sysobjects  b    
ON  a.id=b.id    
AND  b.type='U'    
AND  a.name='你的字段名字' 

b. 未知列名查所有在不同表出现过的列名
Select  o.name  As  tablename,s1.name  As  columnname  
From  syscolumns  s1,  sysobjects  o  
Where  s1.id  =  o.id  
   And  o.type  =  'U'  
   And  Exists  (  
       Select  1  From  syscolumns  s2    
       Where  s1.name  =  s2.name    
       And  s1.id  <>  s2.id  
       )

7. 查询第xxx行数据

假设id是主键:  
select  *  
from  (select  top  xxx  *  from  yourtable)  aa  
where  not  exists(select  1  from  (select  top  xxx-1  *  from  yourtable)  bb  where  aa.id=bb.id)
  
如果使用游标也是可以的  
fetch  absolute  [number]  from  [cursor_name]  
行数为绝对行数

8. SQL Server日期计算
a. 一个月的第一天
SELECT  DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0)  
b. 本周的星期一
SELECT  DATEADD(wk,  DATEDIFF(wk,0,getdate()),  0) 
c. 一年的第一天
SELECT  DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)  
d. 季度的第一天
SELECT  DATEADD(qq,  DATEDIFF(qq,0,getdate()),  0)  
e. 上个月的最后一天 
SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0))  
f. 去年的最后一天
SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)) 
g. 本月的最后一天
SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0))  
h. 本月的第一个星期一
select  DATEADD(wk,  DATEDIFF(wk,0,                                                          
                               dateadd(dd,6-datepart(day,getdate()),getdate())        
                                                                                                 ),  0)      
i. 本年的最后一天
SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate())+1,  0))。

1. 说明:复制表(只复制结构,源表名:a,新表名:b)

SQL: select * into b from a where 1<>1;

2. 说明:拷贝表(拷贝数据,源表名:a,目标表名:b) 

SQL: insert into b(a, b, c) select d, e, f from b;

3. 说明:显示文章、提交人和最后回复时间

SQL: select a.title, a.username, b.adddate 
     from table a,(
          select max(adddate) adddate 
          from table where table.title=a.title) b 
 

4. 说明:外连接查询(表名1:a,表名2:b)

SQL: select a.a, a.b, a.c, b.c, b.d, b.f 
     from a LEFT OUT JOIN b ON a.a = b.c;  

5. 说明:日程安排提前五分钟提醒

SQL: select * 
     from 日程安排 
     where datediff(''minute'', f开始时间, getdate())>5   
  

6. 说明:两张关联表,删除主表中已经在副表中没有的信息

SQL: delete from info 
     where not exists(
           select * 
           from infobz 
           where info.infid=infobz.infid );


7. 说明:——

SQL: SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE 
     FROM TABLE1,(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE 
                  FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND 
                        FROM TABLE2 
                        WHERE TO_CHAR(UPD_DATE,''YYYY/MM'') = 
                              TO_CHAR(SYSDATE, ''YYYY/MM'')) X, 
                       (SELECT NUM, UPD_DATE, STOCK_ONHAND 
                        FROM TABLE2 
                        WHERE TO_CHAR(UPD_DATE,''YYYY/MM'') = 
                              TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, ''YYYY/MM'') 
                              || ''/01'',''YYYY/MM/DD'') - 1, ''YYYY/MM'') ) Y, 
                   WHERE X.NUM = Y.NUM (+)AND X.INBOUND_QTY 
                                 + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B 
                   WHERE A.NUM = B.NUM; 
8. 说明:——

SQL: select * 
     from studentinfo 
     where not exists(select * from student where studentinfo.id=student.id) 
           and 系名称=''"&strdepartmentname&"''
           and 专业名称=''"&strprofessionname&"''


TAG:

 

评分:0

我来说两句

Open Toolbar