Oracle數據庫知識和SQL語句總結

Oracle數據庫:存放數據的倉庫

1)保存數據
file是輕量級保存數據。
數據庫是重量級保存數據需要安裝軟件。

2)管理數據
有效增刪改查(CRUD),使用SQL語句來操作。

3)在項目開發中,運行在項目的後臺。
項目分前臺和後臺。前臺做界面。
如:前臺註冊界面
後臺保存數據—保存到數據庫中

數據庫分爲
**大型數據庫:**oracle,db2 銀行系統(數據量大,安全性高,需要付費)
**中型數據庫:**sql server,mysql 網站開發(數據量大,安全性相對不高,免費的)
小型數據庫: access,sqlite(數據量小,安全性低,免費的)

Oracle是一門數據庫,
數據庫:存放數據,有效的管理數據CRUD。 重量級保存數據的方式,需要安裝軟件。
總結一下簡單的CRUD的操作

sql命令分類:
數據操作語言:DML
select,insert,update,delete

數據定義語言:DDL
create,alter,drop,rename,truncate

事務控制語句
commit,rollback,savepoint

數據控制語言:DCL
grant(授權),revoke(回收權限)

數據庫中的對象:
表:數據庫最基本的結構

視圖:一張虛表,從一張表或多張表查詢的數據組成的一張虛表。

序列:主要用來生成主鍵的值

索引:主要用來提供檢索的效率

同義詞:爲對象取別名

存儲單元:PL/SQL,將一條或者多條SQL語句通過一些語句(判斷,循環)連接起來。


基本指令:

1)使用sys用戶登錄到數據庫

sqlplus "/as sysdba"

2)使用system用戶登錄到數據庫

 sqlplus 

用戶名:system

口令:安裝oracle數據庫時的口令

使用briup用戶登錄到數據庫

**3)**sqlplus briup/briup

show user

安裝oracle後,默認提供兩個管理員的用戶sys,system

sys:相當於總裁

system:相當於總經理

briup:普通用戶

4)切換到其他用戶下

conn 用戶名/密碼

//創建用戶:用戶名爲briup,密碼爲briup

create user briup identified by briup;

//授權命令

grant connect,resource to briup;

//切換用戶

conn briup/briup

//修改日期的語言格式

alter session set nls_date_language=english;

//執行腳本文件

start D:/oracle.sql

oracle.sql的路徑:D:/oracle.sql

//查詢當前用戶下所有的表

select table_name from user_tables;

重點部分,SQL語句
sql執行流程:sql引擎解析sql語句
select———-5
from————1 //from後起的別名是可以作用到其他所有語句上的
where———–2
group by——–3
having———-4
order by——–6
查詢表select
1、格式:select [distinct] {*|字段名1,字段名2..}
from 表名
[where 字段名=? and …]

項目中不建議寫*,效率低
1)先查詢表中所有的字段名
2)再根據字段名去查詢數據
2、 可以使用算術符 + - * /
a)針對數字類型number(+-*/)
例如:查年薪

         select salary*12
         from s_emp;

b)針對日期類型date(+-)
select start_date,start_date+1
from s_emp;
3、取別名
a)在需要取別名的字段後空格,然後加上別名

    select last_name,(salary+100)*12 sal
    from s_emp;

b)使用as關鍵字

   select last_name,(salary+100)*12 as Sal

   from s_emp;

c)使用”“,可以區分大小寫和特殊字符

select last_name,(salary+100)*12 "Sal"

   from s_emp;
   select last_name,(salary+100)*12 "年薪"

   from s_emp;

4、數據庫處理空值

nvl(可能出現空值的字段,默認值)
如果可能出現空值的字段爲空,nvl函數處理的結果爲默認值。
如果可能出現空值的字段不爲空, nvl函數處理的結果爲本身的值。

5、字段拼接:||

查詢last_name,first_name取別名name

```
select last_name||','||first_name name
from s_emp;
```

注意:字符串使用單引號

**6、**sql*plus工具中編輯命令

**a)**list/l : 顯示buffer中sql命令

b)/ : 執行buffer中的sql命令

c)替換內容:c

先定位:1

後替換:c/oldStr/newStr

 如: c/names/name

select last_name

from s_emp;

d)追加內容:a

先定位:1

後追加:a ,salary

執行:/

select last_name,salary

from s_emp

where dept_id=42;

e)插入一行:i / input

先定位:2

後插入:i where dept_id=42

執行:/

f)刪除一行:del

先定位:3

後刪除:del

g)重寫一行

select last_name,salary

from s_emp;

重寫的行號 重寫的內容

如:1 select first_name,dept_id
    執行:/

**h)**sql*plus在文件的命令
save filename:把buffer中命令保存到文件中
如:save D:/test.sql
get filename:把文件中命令顯示在工具上
如:get D:/test.sql
@ filename/start filename:執行腳本文件
如:start D:/test.sql
@ D:/test.sql
edit filename:將文件以編輯的方式打開
如:edit D:/test.sql
spool filename:將工具中所有內容都寫入到文件中
如: spool D:/test1.sql
select last_name from s_emp;
show user
select * from s_dept;
spool off;
注意:spool必須和spool off一起使用。
exit:退出
I)設置字段的顯示格式:col
select last_name,first_name,salary,start_date
from s_emp;
col last_name format a15;
col first_name format a15;
fomat 可以用 for 來代替
注意:format不能通過a來設置數字類型
col salary format a10;
select salary from s_emp;
清除salary顯示格式:
col salary clear;

排序order by

    a)升序排序ASC,降序排序DESC
    b)order by放在select語句最後的位置
    c)order by後面跟需要排序的字段名再加排序規則
        1)如果沒有指定排序規則則按照默認排序(升序)
        2)需要排序的字段,字段可以寫字段名也可以寫別名也可以寫select後的序列號
            如: select last_name,salary
                from s_emp
                order by 2 ASC;
    d)字符串的比較規則是第一個字母比 相同則比第二個 以此類推 比較的是ASCII碼
    e)多個字段同時排序 用,隔開 先按照第一個字段排序 在第一個字段的值相同
      則把相同數據按照第二個字段排序 以此類推
    f)對於空值的排序規則:
        空值被看成---無窮大
    1.查詢所有員工的last_name和工資,並對工資進行升序排列
        select last_name,salary
        from s_emp
        order by salary ASC;
    2.查詢所有員工的last_name和工資,並對last_name進行升序排列
        select last_name,salary
        from s_emp
        order by 1 ASC;
    3.查詢所有員工的last_name和工資,先按照salary進行降序排序,再按照last_name
      進行升序排序
        select last_name,salary
        from s_emp
        order by 2 DESC,1 ASC;
    4.查詢所有員工的last_name和提成,並對提成進行升序排序
        select last_name,commission_pct
        from s_emp
        order by 2 ASC;

限定性的查詢where

    a)將數據進行過濾篩選
    b)where放在select語句的from後面
    c)where後跟表達式
        字段名 比較符 常量值
    d)比較符
        邏輯比較符= < >           不等於:  != <> ^=
        SQL比較符
            between..and..  :在小數和大數之間
            in(list)        :在集合中  in(1,54,66,4,2)
            like            :模糊匹配,包含某個東西
            is null         :是空的
        邏輯操作符
            and
            or
            not
    select name
    from s_dept;
    where
    1.查看41號部門員工的信息
        select last_name,salary,dept_id
        from s_emp
        where dept_id=41;
    2.查詢Ngao這個員工的信息
        select last_name,salary,dept_id
        from s_emp
        where last_name='Ngao';
    注意 : sql命令不區分大小寫 字符串是區分大小寫的
    3.查詢工資在1000到1500之間的員工信息
    4.查詢41號或者42號部門員工信息
    5.查詢提成爲空的員工信息
    6.查詢last_name包含N員工的信息
        通配符: %:匹配0或者多個字符
                _:匹配單個字符
        select last_name,salary
        from s_emp
        where last_name like '%N%';

    7.查詢出所有不分大小寫的N
        upper()將括號內容變爲大寫
        lower()將括號內容變爲小寫
        select last_name,salary
        from s_emp
        where upper(last_name) like '%N%';

        select last_name,salary
        from s_emp
        where lower(last_name) like '%n%';
    8.查詢last_name第二個字符爲a的員工的信息
        select last_name,salary
        from s_emp
        where last_name like '_a%';
    9.查詢last_name以_開頭的員工信息
        先插入一列進行測試
        insert into s_emp(id,last_name)
        values(999,'_briup');
        commit;

        escape '任意字符'  :組合成了一個轉義字符 自定義轉義字符

        select last_name
        from s_emp
        where last_name like '/_%' escape '/';

函數

單值函數: 不會影響數據的個數 如果有n條數據處理之後還是n條數據
多值函數(組函數): 會影響數據的個數 如果有n條數據處理之後可能是1條數據
1.在字符串上的單值函數
    LOWER/lower:將字符串轉換成小寫
    UPPER/upper:將字符串轉換成大寫
    INITCAP/initcap:將字符串轉換成首字母大寫,其他字母小寫
    CONCAT/concat:將兩個字符串拼接成一個字符串
    SUBSTR/substr:求子串
    LENGTH/length:求字符串的長度
    NVL/nvl:處理空值的函數

        dual:一張啞表
            1)用來滿足select語句的格式
            2)用來測試函數
        select concat('hello','world')
        from dual;

        //第一個是母串
        //第二個是子串的起始位置
        //第三個是子串的長度
        select substr('hell world',3,7)
        from dual;

        練習:查詢員工全名,使用,隔開 
                全名以大寫方式顯示,並且要求first_name的長度爲6,
                按照全名進行降序排序
                select upper(concat(last_name,first_name)) as name
                from s_emp
                where length(first_name)=6
                order by name DESC;
    2.在數值上的單值函數
        ROUND/round:四捨五入
        TRUNC/trunc:只舍不取
        MOD/mod:取餘

        select round(45.89) from dual;  //46
        select round(45.89,1) from dual;  //45.9
        select round(45.89,2) from dual;  //45.89
        select round(45.89,-1) from dual;  //50
        select round(45.89,-2) from dual;  //0
        select round(55.89,-2) from dual;  //100
    3.在日期上的單值函數,注意:在進行日期函數之前 需要轉換語言alter session set nls_date_language=english;
        select sysdate from dual;
        日期的默認格式:  DD-MON-YY
        MONTHS_BETWEEN/months_between:兩個日期之間相差的月數
        ADD_MONTHS/add_months:在一個日期上加上月數之後的日期
        NEXT_DAY/next_day:即將來臨的星期幾是多少號
        select next_day(sysdate,6) from dual;
        注意:以爲Oracle是國外推出的,所以日期中  一週的第六天  是星期五
        LAST_DAY/last_day:一個日期所在這個月的最後一天的日期
        ROUND:四捨五入
            根據month進行 應該看day
            根據year進行 應該看month
        TRUNC:只舍不取
            根據month進行 應該看day
            根據year進行 應該看month
            select round(to_date('15-JUN-17'),'month')
            from dual;
            15日舍 16入 6月舍 7月入
    4.轉換函數
        to_char:將數字或者日期轉換成字符串
            1)將數字類型轉換爲字符串類型(錢)
                to_char(number,'格式')
                $:西方人顯示貨幣的符號
                L:顯示本地貨幣符號
                ,:進行分割
                .:小數點
                9:不滿位數時不強制補齊
                0:不滿位數時強制補齊
                fm:清除前面的空格或者0(某些時候清除0)
            注意:定義字符串的長度大於或等於數值的長度 否則會顯示#
                select to_char(salary,'$99,999.00')
                from s_emp;
            2)將日期類型轉換成字符串類型
                select to_char(sysdate,'YYYY MM D DD DDD YEAR MONTH MON DAY DY ddsp ddspth')
                from dual;

                select to_char(system,'YYYY-MM-DD HH24-MI-SS AM')
                from dual;
            日期格式模型的元素
                year: 英文年份(例如:two thousand seven(2007年))
                month: 英文月份(例如:march(3月))
                mon:英文月份的縮寫(例如:mar)
                DAY: 星期幾的英文單詞(例如:monday(星期一))
                DY: 星期幾的前三個字母(例如:mon)
                ddsp:英文拼寫的天(例如:five(5號))
                ddspth:英文拼寫的第幾天(例如:fifth(第五天))
                d: 一個星期的數字表示,星期天爲1,星期六爲7
                dd: 一個月的第幾天
                ddd: 一年的第幾天
                yyyy:四位數的年
                mm:二位數的月
                hh24:24小時制
                mi:分鐘
                ss:秒
                AM:上午
                PM:下午
        to_number:將字符串類型轉換成數字類型
        to_date:將字符串類型轉換成日期類型

多表查詢

多表查詢:第一件事將多張表連接成一張表
連接:每張表的每條數據都要連接另一張表的每條數據

實質:是一張表的查詢
多張表連接成一張表時會產生笛卡爾積
如何消除笛卡爾積:
如果有n張表的連接,至少需要多少個連接
條件纔可以完全消除笛卡爾積?
    使用連接條件放在where中
    如果有n張表的連接,至少需要n-1個連接
連接方式:
1)等連接:連接條件使用=連接
    等連接:主鍵的值等於外鍵的值
            外鍵值爲空的數據是查詢不出來的
例一:查詢所有員工的ID,名字和所在部門的名稱
     步驟一:分析查詢的表
             s_emp s_dept
     步驟二:連接條件
           s_emp.dept_id=s_dept.id
     步驟三:寫sql語句
          select s_emp.id,last_name,name
          from s_emp,s_dept
          where s_emp.dept_id=s_dept.id;

        注意:多表查詢時,重名的字段需要表名指定
             多表查詢時,建議給表取別名
             多表查詢時,不要忘了寫連接條件
例二:查詢員工的姓名和部門所在地區的名稱(3張表) 
     步驟一:查詢的表  
         s_emp s_dept s_region
     步驟二:連接條件
          s_emp.dept_id=s_dept.id
          s_dept.region_id=s_region.id
     步驟三:拼接sql語句
         select s_emp.id,last_name,s_region.name
         from s_emp e,s_dept d,s_region r
         where e.dept_id=d.id and d.region_id=r.id;

練習一:查詢部門名稱包含sa的員工姓名薪水


練習二:查詢歐洲銷售部門的薪水在1000到2000的員工信息  


練習三:查詢部門名稱是5位,該部門員工的薪
   水不等於1500,並按員工的薪水降序排序
        select e.last_name,e.salary,d.name
  2  from s_emp e,s_dept d
  3  where e.dept_id=d.id and length(d.name)=5 and e.salary!=1500
  4  order by e.salary DESC;


2)不等連接:連接條件使用的不是等號的連接
            >,<,...between..and 
drop table s_gender;
create table s_gender(
    id number(5) primary key,
    minSal number(7),
    maxSal number(7),
    name varchar2(20));
insert into s_gender
values(1,0,1000,'藍領');
insert into s_gender 
values(2,1000,1500,'白領');
insert into s_gender 
values(3,1500,2500,'金領');
commit;
查詢所有員工的工資等級?



3)外連接:把外鍵爲空的數據一併查詢出來
   使用:(+)  放在連接條件上
   規則:把(+)放在查詢數據少的一方
例一:查詢所有員工所在部門的名稱,但是
需要把所有部門給查詢出來
insert into s_dept
values(1000,'teaching',2);
commit;

SQL> select e.last_name,d.name
  2  from s_emp e,s_dept d
  3  where e.dept_id(+)=d.id;
右外連接:
標準的sql:..right join...on....右外連接
SQL> select e.last_name,d.name
  2  from s_emp e right join s_dept d
  3  on e.dept_id=d.id;

例二:查詢員工所在部門的名稱,
包括沒有部門號的員工(所有員工)

SQL> select e.last_name,d.name
  2  from s_emp e,s_dept d
  3  where e.dept_id=d.id(+);

注意:等連接不能查詢外鍵值爲空的數據。
左外連接:
標準的sql:left join ...on...左外連接

    select e.last_name,d.name 
    from s_emp e left join s_dept d 
    on e.dept_id=d.id;


例三:查詢員工所在部門的名稱,
沒有部門號的員工
所有的部門都查詢出來

    select e.last_name,d.name 
    from s_emp e full join s_dept d 
    on e.dept_id=d.id;

標準的sql語句:...full join...on...(全連接)
    所有數據庫語言通用的SQL語句

4)自連接:連接的時候來自同一張表
           同一張表可以當作多張表使用。
           from s_emp,s_dept,s_region 
           from s_emp ,s_emp, s_emp...   
查詢所有員工的經理的last_name,salary
包括沒有經理的員工。
select m.last_name,m.salary
from s_emp e,s_emp m
where e.manager_id=m.id;


5)集合連接
union:並集,重複的列只顯示一行
union all:並集,不會消除重複的行
minus:差集
intersect:交集
rownum:僞列,可以分頁技術,邏輯位置
      只能等於1
      不能大於或者大於等於任何正整數
      可以小於或者小於等於任何正整數
rowid:數據保存到文件中的物理位置

部門表中前5條記錄?
    select *
    from s_dept
    where rownum<=5;

部門表中第3條到第5條數據?
    select *
    from s_dept
    where rownum <=5
    minus
    select *
    from s_dept
    where rownum >=2;

    page:當前頁
    count:每一頁的數據        

Group Function

    AVG/avg:平均
    COUNT/count:求非空數據的個數
    MAX/max:最大
    MIN/min:最小
    SUM/sum:和
例一:查詢所有員工的平均工資,最高工資最低工資,工資總和,以及有多少個員工?
    select avg(salary),max(salary),min(salary),sum(salary),count(last_name)
    from s_emp;

例二:查詢每個部門的平均工資?對平均工資降序排序.平均工資大於1400.
簡化1:求41號部分員工的平均工資?
簡化2:求每個部門的平均工資?

簡化3:平均工資大於1400.
SQL> select avg(salary),dept_id
  2  from s_emp
  3  having avg(salary)>1400
  4  group by dept_id;

簡化4:平均工資降序排序
SQL> select avg(salary),dept_id
  2  from s_emp
  3  having avg(salary)>1400
  4  group by dept_id
  5  order by avg(salary) DESC;
分組注意: a)group by 進行分組
         b)將值相同的數據分爲一組
         c)group by 放在where 後面
         *d)組函數不能放在where中,對組函數進行過濾用having. having放在group by後面
         e)出現在select後的字段 如果該字段沒有出現在組函數中那就必須出現在group by中
         f)多個字段同時分組 多個字段的值都相同才分爲一組
練習:
1.查看各個部門的最高工資 
SQL> select max(salary),dept_id
  2  from s_emp
  3  group by dept_id;
2.查看各個部門的員工數
SQL> select count(last_name),dept_id
  2  from s_emp
  3  group by dept_id;
3.查詢各個部門各個職稱的平均薪水和最大薪水,並且平均薪水大於2000的部門id;

SQL> select avg(salary),max(salary),dept_id,title
  2  from s_emp
  3  having avg(salary)>2000
  4  group by dept_id,title;

4.查詢title中不包含vp字符串的每個職位的平均薪水和總薪水,並對平均薪水進行降序排列,並且每個職位的總薪水大於5000?

子查詢

一條sql語句嵌套一個或者多個sql語句
格式:
   select...
   from..
   where 字段名 比較符  (
    select...
    from..
    where..
    group by..
    having...
    order by...
   )
   group by...
   having..
   order by...
什麼情況下使用:比較符中參數不確定的情況
子查詢出現的地方:1)where子句
               2)form子句
               3)having子句
例一:查詢和Ngao在同一個部門的員工id,last_name
    步驟一:分析所用的表
            s_emp
    步驟二:分析子查詢
            查詢和Ngao在哪個部門
            select dept_id
            from s_emp
            where last_name='Ngao';
    步驟三:嵌套sql語句
            select id,last_name
            from s_emp
            where dept_id =(
                select dept_id
                from s_emp
                where last_name='Ngao'
            );
    子查詢的結果要和外圍查詢的條件對應

未完..

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章