随笔-159  评论-114  文章-7  trackbacks-0

Data retrieval
-Select

Data manipulation language (DML)
-INSERT,UPDATE,DELETE

Data definition language(DDL
-CREATE,ALTER,DROP,RENAME,TRUNCATE

Transacation control
-COMMIT, ROLLBACK,SAVEPOINT

Data control language(DCL)
-GRANT,REVOKE

使用SQL *Plus进行数据库操作。

openlab.tarena.ca% sqlplus tarena/tarena@TARENADB

用户名/密码

注意这样登录是强烈不推荐的,因为这样别人能看到你的用户名和密码。

SQL> !ps -ef|grep sqlplus
    lujl   966   955  0 08:43:17 pts/1    0:00 sqlplus tarena/tarena@TARENADB
    lujl   969   966  1 08:45:45 pts/1    0:00 /bin/csh -c ps -ef|grep sqlplus
    lujl   971   969  0 08:45:45 pts/1    0:00 grep sqlplus

由于本人已有很多编写SQL语句的经验,所以只记录重点信息。

SQL中可以使用数学表达式

+
-
*
/

先乘除后加减。

SQL> select last_name,salary, 12*salary + 100
  2  from s_emp

注意每一个子句最好单独占一行。这样以便以后的修改,要想写完就执行,最后添加  ‘;’

1。可以给列取别名 Aliase,
2。可以级联两列,作为整体,输出结果。

SQL> select first_name||last_name "Employees"
  2  from s_emp;

Employees
------------------------------
benqu
hui
lgf
liganfeng
lgf
BenDumas
AntoinetteDumas


使用单引号,将字符括起来。

select first_name||' '||last_name
from s_emp;

NULL是一个不确定的值!

对空的任何操作,返回都是空。

使用nvl函数,处理空值,为空就使用默认值。

NVL(salary,1000)

select distinct name
from s_dept;



sqlplus有很多命令。


SQL> help index

Enter Help [topic] for help.

 @             COPY         PAUSE                    SHUTDOWN
 @@            DEFINE       PRINT                    SPOOL
 /             DEL          PROMPT                   SQLPLUS
 ACCEPT        DESCRIBE     QUIT                     START
 APPEND        DISCONNECT   RECOVER                  STARTUP
 ARCHIVE LOG   EDIT         REMARK                   STORE
 ATTRIBUTE     EXECUTE      REPFOOTER                TIMING
 BREAK         EXIT         REPHEADER                TTITLE
 BTITLE        GET          RESERVED WORDS (SQL)     UNDEFINE
 CHANGE        HELP         RESERVED WORDS (PL/SQL)  VARIABLE
 CLEAR         HOST         RUN                      WHENEVER OSERROR
 COLUMN        INPUT        SAVE                     WHENEVER SQLERROR
 COMPUTE       LIST         SET
 CONNECT       PASSWORD     SHOW


DESCRIBE s_dept

SQL> describe s_dept
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(7)
 NAME                                      NOT NULL VARCHAR2(25)
 REGION_ID 

NUMBER(p,s)p为整数位,s为小数位数
VARCHAR2(s)
DATE  (Oracle中只有一种日期格式!)
CHAR(s)

SQL Plus  提供了很强的编辑SQL语句的能力。

SQL> l 
  1  select first_name||last_name "Employees"
  2* from s_emp
SQL> 1
  1* select first_name||last_name "Employees"
SQL>

list(简写l)
列出缓存中的SQL语句。

1(数字)就是将当前编辑行

看前面有*的,为当前编辑行,再才使用行编辑命令,就需要确定是否是想编辑的行。

A[PPEND] text
C[HANGE] /old/new
CL[EAR]BUFF[ER]
DEL
I[NPUT] text
L[IST] n
n text

由于有时会查出很多记录,这时,需要分页停顿。

SET PAUSE {[OFF|ON] text}

SAVE file写缓存到文件
GET file读入缓存

START filename读文件到缓存,并执行。
@filename = START filename
EDIT filename
SPOOL filename 开始记录,并将执行的命令和结果都写入相应文件。
SPOOL OFF,这时会写入文件。EXIT,正常退出,也会写入文件。

关键命令

COL[UNM] [{column|alias} [option]]

FOR[MAT] format

9
0
$
L
.
,

col last_name format a15   调整last_name为15字符长度,默认为last_name数据类型的长度。(VARCHAR2(35),那就是35),调整列宽。


HEA[DING] text
设置表头

JUS[TIFY] {align}
left center right

column last_name HEADING 'Employee|Name' FORMAT A15
column salary JUSTIFY LEFT FORMAT $099,999,99    保证位数,$012,345,00
column start_date FORMAT A8 NULL 'Not hired'    等同于nvl函数

column last_name
显示某列的格式

column last_name CLEAR





select last_name
from s_emp
order by last_name;
升序默认

desc降序

select last_name,salary*12
from s_emp
order by 2;

按照select子句中的第二项 排序

select last_name,dept_id,salary
from s_emp
order by dept_id,salary DESC;

先按部门排序,如果相同,再按salary降序排。

-------------------------------------------------
where 子句,last_name='Megee',单引号!

日期格式默认为日日-月月月-年年  DD-MON-RR(RR不同于YY,它只取1950到2049年的年,是为解决千年虫问题设定的)

逻辑比较符
= > >= < <=

SQL比较符
BETWEEN...AND...
IN(LIST)  IN(1,3) 1和3
LIKE
IS NULL

逻辑操作符
AND
OR
NOT

不等于!= <> ^=

NOT BETWEEN
NOT IN
NOTLIKE
ISNOTNULL

===============================

LIKE

select last_name from s_emp where last_name like '_M%'

'_' 代表有且只有一格字符

---------------------------

这时,老师发现缓存不够,察看老师的几条命令,应用性很强哦。记下来,以后自己用!

du -sk *|sort
当前目录按照大小的数字排序,

df -k .
察看当前目录的文件系统使用情况。

rm -rf *
不提示删除文件

---------------------------

select table_name
from user_tables
where table_name like 'S\_%' ESCAPE '\';

以S_开头的表名,escape定义了转义字符\


IS NULL  

IS NOT NULL

不要 = null    不出错,但是逻辑不对!

执行顺序

比较操作符〉AND〉OR



==============================

函数

单行函数,输入一个值,输出一个值

多行函数,多输入,单输出。

LOWER('SQL Course')=sqlcourse

UPPER

INITCAP('SqL COurse')=SqL COurse

CONCAT级联

SUBSTR('String',1,3)=Str

LENGTH

NVL


ROUND(45.923,2)=45.92
ROUND(45.923,-1)=50

TRUNC(45.923,2)=45.92
TRUNC(45.923,-1)=50

MOD(1600,300)=100  余数

===========================================

Oracle Date Format是重点

日期包括世纪、年、月、日、小时、分钟、秒几类数

Oracle时间可以保存10负9次方妙

默认显示日期格式为DD-MON-RR

SYSDATE一个能返回当前系统时间的函数

select sysdate from dual;

dual是了保证select语句完整性,设置的,没有实际意义。我认为是个测试函数的好帮手。

YY   05
YYYY   2005
RR   05
RRRR   2005
YEAR   two thousand and five
MM   12
MON   NOV
MONTH   NOVEMBER
DD   18
DDTH   18TH
DDSP   EIGHTEEN
DDSPTH   EIGHTEENTH
HH   03   (12小时)
HH24   15
MI   31   分钟
SS   48   秒
AM   PM
D   5
DY   FRI
DAY   FRIDAY


SQL> select to_char(sysdate,'yyyy mm ddhh miss')
  2  from dual;

TO_CHAR(SYSDATE,'
-----------------
2005 11 1904 1946



时期+/-数字,可以得到一个新的日期。(加在日子上)
两个日期相减,得到一个数字。
如果想加小时到日期上,必须先除以24,在与对应日期相加。

  1  select to_char(sysdate+0.25,'yyyy mm dd hh miss')
  2* from dual

当前时间+6小时的时间。

日期相关函数

MONTHS_BETWEEN('01-SEP-95','11-JAN-94')
19.774194

1  select ROUND(MONTHS_BETWEEN('01-SEP-95','11-JAN-94'))
  2* from dual
  3  ;

20

返回两个日期之间的月差值。

ADD_MONTHS('11-JAN-94',6)

NEXT_DAY('01-SEP-95','FRIDAY')

注意:下一个星期几,但不一定下一周的星期几,找到第一个为准。

LAST_DAY('01-SEP-98')

'30-SEP-98'

ROUND('25-MAY-95','MONTH')
01-JUN-95

TRUNC('25-MAY-95','MONTH')
01-MAY-95




TO_CHAR(date,'fmt')

fm是一个去除前置0或者空格的开关,fm....fm....

fm作用域,是从当前到下一个fm之间的范围。第二个fm后面表示不去除前置0,奇偶变。


TO_CHAR(number,'fmt')

9
0
$
L
.
,


TO_NUMBER(char)

char必须是一个‘数字’



TO_DATE(char[,'fmt'])
不给定日期转换格式,就按照默认的dd-mon-rr,进行转换。



函数可以嵌套

  1  select last_name,
  2  NVL(TO_CHAR(MANAGER_ID),'No Manager')
  3  from s_emp
  4* where manager_id IS NULL




Join方法

等值
非等值
外连接
自连接


必须有连接键,否则就是迪卡尔连接。

  1  select s.last_name,s.dept_id,d.id,d.name
  2  from s_emp s,s_dept d
  3* where s.dept_id=d.id

LAST_NAME          DEPT_ID         ID NAME
--------------- ---------- ---------- -------------------------
Dumas                   31         31 Sales
Dumas                   32         32 Sales
Dumas                   33         33 Sales
payn                      34         34 Sales

外连接是一种特殊的等值连接,用于有空值出现时,寻找到所有记录。

  1  select s.last_name,s.id,c.sal,c.name
  2  from s_emp s,s_customer c
  3* where s.id(+) = c.sal

LAST_NAME        ID        SAL      NAME
--------------- ---------- ---------- -------------------------
Dumas                   12         12         athletes attic
Dumas                   12         12         great athletes
Dumas                   12         12         bj athletics
Dumas                   12         12         athletic for all
Dumas                   12         12         sports,inc
                                          14         athletics two
                                          14         athletics one
                                          14         shhes for sports
                                          14         athletic attire
那个+ 表示有一侧可能没有对应数据。

表示有部分客户没有销售代表。

如果+ 在另外一侧,表示查找所有销售的客户情况。




posted on 2005-11-19 16:29 北国狼人的BloG 阅读(668) 评论(0)  编辑  收藏 所属分类: 达内学习总结

只有注册用户登录后才能发表评论。


网站导航: