1. 程式人生 > >oracle命令列登入 + 簡單命令 + 基礎查詢 + 單行函式 (學習筆記)

oracle命令列登入 + 簡單命令 + 基礎查詢 + 單行函式 (學習筆記)

使用oracle之前,先開啟兩個服務。計算機-》管理-》服務

OracleOraDb11g_home1TNSListener、OracleServiceORCL

開啟
 · 執行——》cmd——》sqlplus
· win+R -> sqlplus

格式化指令 (命令不區分大小寫)
 ·  set pagesize 30;//設定每頁長度。
 ·  set linesize 300;//設定每行長度。

oracle命令建立記事本檔案:  ed+空格+檔名
·  (如果不寫字尾,預設為*.sql    找不到檔案時就建立新的*.sql檔案)  檔案預設的路徑:C:\Users\Administrator
·  儲存檔案後必須關閉才可以繼續使用。
·  隨後要想執行檔案中的命令,使用“@檔名稱”(預設找到*.sql的字尾)

使用者切換語法
:"  conn 使用者名稱/密碼 [as sysdba]  "
   ·  如果是使用sys登入,必須加上as sysdba,否則無法登入。
共有四個使用者    ·超級管理員: sys/change_on_install
          ·普通管理員: system/manager
         ·普通使用者:    scott/tiger
         ·大資料使用者 :sh/sh

" show user  "命令,輸出當前的登入的管理使用者。emp表屬於scott使用者.
嚴格來講,emp表的名稱是“模式名稱.表名稱”,(使用者名稱.表名稱),即:scott.emp

在sqlplus命令裡面,除了可以使用Oracle自己定義的命令之外,也可以使用host指令呼叫本機作業系統命令 
·呼叫"echo"  命令:"host echo helloworld"
·呼叫"copy"  命令:"copy 原始檔路徑 拷貝檔案路徑 " 如: host copy e:\a.txt e:\b.txt
·DML:資料操作語言。主要是資料庫的查詢與更新。開發中使用的語言。
·DDL:資料定義語言。主要是指物件的建立。開發前的設計。
·DCL:資料控制語言。主要進行許可權的管理操作。系統人員的工作。

select* from tab; 查詢一個使用者下所有的資料表。

desc 表名稱;  查詢一個表的結構。
根據每一列單獨進行格式化操作。
例如: · col ename for a10; 
          · col job for a10;


 簡單查詢基本語法:(首先執行的是from子句,確定資料來源)
select [distinct]* | 列名稱 [別名],列名稱 [別名],...
from 表名稱 [別名];
eg:   select job,empno from emp;
("*"指的是全部記錄,所有的行和列,distinct關鍵字用於消除重複內容,distinct只能放在select後面)
(如果查詢的資料是多個列,只有當多個列的資料都相同的情況下才可以消除)

可以對查詢的結果進行四則運算,eg:select sal*12 from emp;
加別名:select sal*12 income from emp;(別名不建議使用中文)

在使用SELECT子句查詢資料的時候,除了查詢還可以設定一些常量:

·如果常量是字串,使用單引號宣告,例如'hello',別名不需要引號:
·如果常量是數字,則直接編寫;
·如果常量是日期,則按照日期風格格式編寫,"xx日-xx月-xx年".
·eg: select  '僱員'ename from emp;
select子句中使用||可將兩個列合併為一個列進行顯示:
·eg1: select empno||ename from emp;
·eg2; select '僱員編號:'|| empno || ',姓名:'|| ename from emp;

在Oracle資料庫中,所有的資料是要區分大小寫的,
·eg:  select * from emp where ename='SMITH';和小寫的smith不一樣,只有大寫有查詢結果。
空的操作只能是IS NULL 或者IS NOT NULL;
·eg: 查詢所有領取佣金的僱員資訊(佣金存在,不為空)
select * from emp where comm is not null;
select * from emp where not comm is null;
select句子要落後與where子句執行
·關係運算符:>、<、>=、<>(!=);
·邏輯運算子:AND、OR、NOT;
·範圍運算子:BETWEEN...AND;
·謂詞判斷:IN、NOT IN;
·空判斷:IS NULL、IS NOT NULL;
·模糊查詢:LIKE;
使用LIKE模糊查詢時,如果不設定關鍵字(%%"),則表示查詢全部
LIKE可以應用在各種資料型別上,不一定是字串。
·eg: select * from emp where sal like '%9%';
使用NOT IN 查詢時,查詢範圍裡面不允許出現NULL,否則不會有任何查詢結果。
·  eg: select * from emp where empno not in(7369,7788,null); 結果未選定行
SECLECT子句落後於WHERE子句執行,所以在SELECT定義的別名,無法在WHERE中使用。

在整個的SQL查詢結構之中,只有ORDER BY可以呼叫SELECT中定義的別名。

ORDER BY 子句是在SELECT子句之後執行,則order by可以使用在SELECT之中定義的別名:
eg:  查詢每個僱員的編號,姓名,年薪,按照年薪由低到高排序:
  select empno,ename,sal*12 as 年薪 from emp order by 年薪;
·ASC (預設,不寫也是ASC):按照升序排列
·DESC : 降序。
同時設定多個排序欄位:
按照工資由高到低,如果工資相同,則按照僱傭日期由早到晚:
 ·eg:  SELECT * from emp ORDER BY sal DESC,hiredate ASC; (ASC是預設的)

···字串函式:
返回值 函式(引數列表)                                                     函式功能描述
·字串 UPPER(列 | 字串)                              將傳入的字串變為大寫字母形式
·字串 LOWER(列 | 字串)                             將傳入的字串變為小寫字母形式
·字串 INITCAP(列 | 字串)                            開頭首字母大寫,其他字母全部小寫
·字串 LENGTH(列 | 字串)                            取得字串的長度
·字串 SUBSTR(列|字串,開始索引,[長度])      進行字串的擷取,如果沒有設定長度,表示從開始索引一直擷取到結尾  
·字串 REPLACE(列|字串,舊內容,新內容)       將指定字串資料由新內容替代舊內容

~在Oracle裡面,所有額函式如果要進行驗證,也必須編寫sql語句,為了方便,專門提供了一個dual虛擬表。
eg:SELECT upper('hello') from dual;
~在程式之中,所有字串的首字母索引都是0,但是在Oracle裡面,所有字串首字母索引設定為1,如果寫的0,那麼也會按照1的方式進行處理。 
~範例:取每位僱員姓名的後三位字母:SELECT ename,substr(ename,-3) FROM emp;
  長度可以設定為負數,表示後面第幾位索引,此類設定方式只有Oracle資料庫才有。


···數值函式:
返回值 函式(引數列表)                                                     函式功能描述
·數字 round(列 | 數字 [,小數位])          實現資料的四捨五入.沒有設定小數點的保留位數,預設不保留小數位進行進位;設定為負數,表示進行整數位的四捨五入
·數字 trunc(列 | 數字  [,小數位])          實現小數位資料的擷取,擷取時不進位。
·數字 mod(列 | 數字,列 | 數字)            求模(計算餘數)

··日期公式:
日期 + 數字 = 日期(表示若干天之後的日期)
日期 - 數字 = 日期(表示若干天之前的日期)
日期 - 日期 = 數字(天數)
若果直接使用天數來進行年或者月的計算,最終的結果不準確。所以Oacle提供了以下準確計算日期的操作函式:
···日期函式:
select next_day(sysdate,'星期三') from dual;數功能描述
·日期 add_months(列 | 日期,月數)                        返回在指定日期上增加月數後的日期
·數字 month_between(列 | 日期,列 | 日期)          返回兩個日期之間的天數
·日期 last_day(列 | 日期)                                     取得指定日期所在月份的最後一天
·日期 next_day(列 | 日期,'星期X')                         返回下一個指定的一週時間數對應的日期
Oracle裡面提供了2個偽列 "sysdate" 和 "systimestamp" 來獲得當前的日期。SELECT sysdate from dual;
eg:查詢所有在僱傭所在月倒數第三天僱傭的僱員資訊:
SELECT empno,hiredate,last_day(hiredate)-2 from emp where hiredate=last_day(hiredate)-2;
 查詢當前日期的下一個星期三:select next_day(sysdate,'星期三') from dual;


 ···轉換函式:
返回值 函式(引數列表)                                        函式功能描述
·字串 to_char(列 | 日期 | 數字,轉換格式)          將日期或數字格式化為指定結構的字串
·日期 to_date(列 | 字串,轉換格式)                    按照指定的轉換格式編寫字串或將其變為日期型資料
·數字 to_number(列 | 字串)                             將字串變為數字


eg一1:·select to_char(sysdate,'yyyy-mm-dd') from dual; 年-月-日
·select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;  年-月-日 時:分:秒
·select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;表示按照24小時顯示
to_char()函式可以實現日期的拆分:·select to_char(sysdate,'yyyy'),to_char(sysdate,'mm'),to_char(sysdate,'dd') from dual; 
  : 查詢2月份僱傭的僱員:select* from emp where to_char(hiredate,'mm')='02';
      或者select* from emp where to_char(hiredate,'mm')=2; oracle提供有自動轉型操作,自動完成型別匹配。
eg一2:·select to_char(187816257272672,'L999,999,999,999,999,999') from dual; L表示貨幣,9表示任意數字。
eg二1:·select to_date('1888-12-3','yyyy-mm-dd') from dual;一般意義不大
eg三1:·select to_number('1')+to_number('2') from dual;和select '1'+'2' from dual;結果一樣,因為Oracle裡面有自動轉型操作。


···通用函式(Oracle特色函式):
返回值 函式(引數列表)                                        函式功能描述
·數字 nvl(列 | NULL,預設值)                 如果傳入的是null,則使用預設數值處理,否則使用原始數值處理。
·資料型別 decode(列|字串|數值,比較內容1,顯示內容1,比較內容2,顯示內容2,...[,預設顯示內容])
(設定的內容會與每一個比較內容進行比較,如果內容相同,則使用顯示內容進行輸出,如果都不相同,則使用最後的預設資訊輸出)

eg1:    select empno,ename,sal,comm,(sal+nvl(comm,0))*12 as 年薪 from emp;

alter table Student modify Sage int;修改列定義

一次性插入多條記錄,直接拷貝多條資訊:
insert into SC values(9512101,'c01',90);
insert into SC values(9512101,'c02',86);
insert into SC values(9512101,'c06',null);
insert into SC values(9512102,'c02',78);
insert into SC values(9512102,'c04',66);
insert into SC values(9521102,'c01',82);
insert into SC values(9521102,'c02',75);


delect from myemp where  EMPNO in (
select myemp.EMPNO
from myemp join mydept on mydept.DEPTNO = myemp.DEPTNO
where JOB = 'MANAGER'
and sal<1000
);
delect from myemp1 where  EMPNO in (select EMPNO from mydept where JOB = 'MANAGER') and sal<1000;