Oracle資料庫語言——結構化查詢語言 (SQL)SQL

來源:互聯網
上載者:User

Oracle資料庫語言——結構化查詢語言 (SQL)SQL

一、資料定義語言 (Data Definition Language)DDL

1.建立資料表空間:CREAT TABLESPACE lyy DATAFILE 'C:/app/lyy.dbf' SIZE 10M;(建立一個10M的資料表空間,存放在C盤app檔案夾中)

刪除資料表空間:DROP TABLESPACE lyy;

2.建立使用者和賦權:CREAT USER lyy PROFILE DEFAULT IDENTIFIED BY 123456 DEFAULT TABLESPACE lyy TEMPORARY TABLESPACE temp ACCOUNT UNLOCK; (建立使用者lyy,預設密碼為123456,預設資料表空間為lyy,暫存資料表空間為temp,帳號開啟狀態)

GRANT CONNECT TO lyy;
GRANT RESOURCE TO lyy;(賦予使用者lyy connect和resource許可權)

3.建立表

文法格式:CREAT TABLE 表名(屬性名稱1 資料類型(長度),屬性名稱2 資料類型......屬性名稱n 資料類型);

例:建立以下三個表:
--學生表 student:學號 sid、姓名 sname、性別 ssex、年齡 sage、電話 sphone
--課程表 course: 課程編號 cid、課程名稱 cname、老師名稱 tname、課時 chour
--成績表 score: 成績編號 scid、學號 sid、課程編號 cid、分數 grade

在Oracle中,表的全名是:方案名.表名;方案名就是使用者名稱,方案名不寫,表示方案名就是目前使用者自己;

——建立學生表

CREAT TABLE student(
  sid CHAR(10),
  sname VARCHAR2(50) NOT NULL,
  ssex CHAR(1),
  sage NUMBER,
  sphone INTEGER 
);

——建立課程表

CREAT TABLE course(
    cid CHAR(10),
    cname VARCHAR2(50),
    tname VARCHAR2(50),
    chour NUMBER
);

——建立成績表

CREAT TABLE score(
  scid CHAR(10),
  sid CHAR(10),
  cid CHAR(10),
  grade NUMBER
);

刪除表: DROP TABLE student;

4.約束條件

  約束是由使用者添加,用來保證儲存到資料庫的資料的實體完整性和參照完整性;

約束種類一般有五種:

--主鍵約束:Primary key,要求被定義為主鍵的欄位的值具有唯一性和非空性;
                 constraint p1_sid primary key(sid)              --定義sid為主鍵。
--外鍵約束:Foreign key,要求被定義為外鍵的欄位的值必須來源於所引用欄位的值, 外鍵欄位和所引用的欄位,名稱可以不一樣,但是兩者的資料類型和長度必須一致;
                 constraint f1_sid foreign key(sid) references student(sid)  --定義sid為外鍵,值來源於student表的sid
--唯一約束:Unique  ,要求具有唯一性;
                  unique(sid,cid)                           --定義sid和cid的組合有唯一性。
--非空約束:not null,要求必須有值;
                  sname varchar2(50) not null              --定義sname欄位非空
--檢查約束:check,使用者可以根據業務的需要,對欄位的值進行自訂限制。
                  constraint c1_ssex check(ssex in ('M','F'))  --定義檢查約束,要求ssex欄位的取值必須為M或者F 

5.修改表ALTER

ALTER TABLE SCOTT.TEST RENAME TO TEST1--修改表名
ALTER TABLE SCOTT.TEST RENAME COLUMN NAME TO NAME1 --修改表列名
ALTER TABLE SCOTT.TEST MODIFY NAME1 NUMBER(20)  --修改欄位類型
ALTER TABLE SCOTT.TEST ADD ADDRESS VARCHAR2(40) --添加表列
ALTER TABLE SCOTT.TEST DROP NAME CASCADECONSTRAINTS --刪除表列

二、資料操作語言DML

      DML是資料操作語言,主要可以完成三個操作:insert插入、update更新、delete刪除;DML語句是一種事務動作陳述式,需要做commit確認、rollback復原操作才能最終完成的。如果不做確認或者復原操作,則會鎖定當前的表,導致針對該表的DDL等操作都會失敗。

1.insert插入資料

文法格式1: insert into 表名 values(值1,值2......,值n);

注意事項:在SQL語句中,一般來說,除了值得部分(資料),其他部分都是不區分大小寫,資料部分,字元類型需要單引號,其他類型不需要單引號;該格式下,要保證值得數量、類型、長度、順序都要和表的欄位保持一致。

樣本:SELECT * FROM student;
        INSERT INTO student VALUES('S001','張三',‘M’,30,13089247856) ;

文法格式2: insert into 表明(欄位名1,欄位名2,......,欄位名n) values(值1,值2,......,值n);

注意事項:註定值和欄位的對應關係(按順序對應),好處是可以根據自身的值和欄位的對應關係,有選擇性進行插入操作。

樣本:  INSERT INTO student(sname,ssex,sid,sage) VALUES('李四','F','s0002',20);

2.update更新資料

文法格式:update 表名 set 賦值運算式 [where 條件]

注意事項:update本身是一個列操作的語句,即不加條件,操作的是表中的整列資料;如果加了條件,因為條件限定是行,則表示操作的是選中的行所對應的列。

樣本: SELECT * FROM student;
          UPDATE student SET sage=40;
          UPDATE student SET sage=(sage+sphone)-sage,sphone=(sage+sphone)-sphone;
          UPDATE student SET sage=sage+1;
          UPDATE student SET sage=sage+1 where ssec='F';
          UPDATE student SET sname=replace(sname,'張','陳');

3.delete刪除資料

文法格式:delete from 表 [where 條件]

注意事項:delete是一個行操作,最小操作單位是一條記錄,切記delete沒有*號;如果不加where條件,則表示刪除整個表中的所有記錄。

樣本:DELETE FROM student WHERE sid='s0002';
        INSERT INTO course VALUES('c0001','oracle','teacher 1',32);
        INSERT INTO score VALUES('sc0001','s0001','c0001',100);
        SELECT * FROM student;
         SELECT * FROM course;
        SELECT * FROM score;

4.truncate:是DDL語句,但也可以實現刪除整表的資料的效果

文法格式:truncate table  表名

樣本:  truncate table score;

三、資料查詢語言DQL

1. select 用來對資料進行查詢,擷取使用者想要的資訊。

文法格式:

select : 查詢的內容,是必選關鍵字,後面跟要查詢的內容,一般以欄位為主、也可以是常量、運算式(包含欄位)。
  --from: 查詢內容的來源,是必選關鍵字,來源可以是表格、多個表格、其他的查詢語句等;
  --where:條件,可選關鍵字,一般用來指定查詢的條件,即用來過濾資料;
  --group by:欄位,可選關鍵字,用來實現分組查詢;
  --having:條件,可選關鍵字,是用來對分組之後的結果進行過濾;
  --order by:欄位,可選關鍵字,用來實現排序操作;

注意事項:不帶條件的查詢,即列查詢,查詢內容可以是表中的一個欄位、多個欄位、常量或者運算式。

樣本:

--查詢學生表的所有內容
        SELECT * FROM student;
--查詢所有學生的姓名和年齡
        SELECT sname,sage  FROM student;
--查詢常量
        SELECT sname,sage,'teacher 1'  FROM student;
--查詢內容是運算式
        SELECT sname,sage,sage+1 FROM student;

2. ||  用來實現字串、變數的拼接操作的

樣本:SELECT sname,sage,sage||'歲' FROM student;
         SELECT sname,ssex FROM student;
         SELECT sname,ssex,case WHEN ssex='M' THEN '男' ELSE '女' END FROM student;

3.條件

  加查詢條件是用來過濾資料的,過濾的基本單位是行,常見的關鍵字有:(> /< /= />= /<=/ !=/ <> /between..and.. /like/ in /all /any /exists/not exists等;多個條件的串連符有:and\or\!

樣本:

--查詢年齡大於28歲的所有學生的資訊
      SELECT * FROM student WHERE sage>28;
--查詢年齡大於等於28歲的所有學生的資訊;
     SELECT * FROM student WHERE sage>=28;
--查詢所有男生資訊
      SELECT * FROM student WHERE ssex='M';
      SELECT * FROM student WHERE ssex!='F';
      SELECT * FROM student WHERE ssex<>'F';
--查詢學號比s0010靠前的學生的資訊。
      SELECT * FROM student WHERE sid<'s0010';

1)between..and..

文法格式:欄位 between 值1 and 值2  等價於 欄位>=值1 and 欄位<=值2;是一個獨立、完整的欄位,不可拆分。

樣本:--查詢年齡在23-28歲之間(包含)的學生資訊。
             SELECT * FROM student WHERE sage>=23 AND sage<=28;
             SELECT * FROM student WHERE sage BETWEEN 23 AND 28;
        --查詢年齡在23-28歲之間(包含)的女生資訊。
             SELECT * FROM student WHERE sage BETWEEN 23 AND 28 AND ssex='F';
             SELECT * FROM student WHERE sage>=23 AND ssex='F'AND sage<=28;

2)like:實現的是模糊查詢,一般來說會結合兩個特殊符號使用,%萬用字元,匹配任意多個字元;_表示匹配一個字元。

樣本:--查詢所有姓張的同學資訊。
            SELECT *  FROM student WHERE sname LIKE '張%';
        --查詢所有姓張,姓名總共為2個字的同學資訊。
            SELECT *  FROM student WHERE sname LIKE '張_';
        --查詢所有姓張,姓名總共為3個字的同學資訊。
           SELECT *  FROM student WHERE sname LIKE '張__';
           SELECT *  FROM student WHERE sname LIKE '%張';

3)in:是一種枚舉用法,欄位in(值1,值2,......,值n)等價於 欄位=值1 or 欄位=值2 or ... or 欄位=值n。

樣本:--查詢年齡等於27歲或者28歲的學生的資訊。
            SELECT * FROM student WHERE sage=27 OR sage=28;
            SELECT * FROM student WHERE sage IN (27,28);

4)distinct:用來修飾欄位,表示唯一查詢、去除重複值。

樣本:--查詢所有選課了的學生的學號。
            SELECT  sid FROM score;
            SELECT  DISTINCT sid FROM score;

5)別名:可以應用在查詢內容和來源中。

文法格式: 原名 as 別名,一般來說,as是省略的, 原名 別名。

樣本:SELECT  sname,sage FROM student;
         SELECT  sname as 姓名,sage 年齡 FROM student;
         SELECT  sname,sage+1 sage FROM student;
         SELECT  sname sage FROM student; --文法沒問題,從應用程式層面是有問題的。查詢學生姓名,但結果是列名改為了sage。

6)嵌套

  SQL語句中,查詢語句是可以被嵌套使用。嵌套是通過括弧()實現。每一條查詢語句的結果本身就是一個表、是一些值的集合,可以被嵌套使用在值或者來源的部分。

--查詢所有選修oracle課程的學生的姓名。
  SELECT sname FROM student WHERE sid IN (SELECT sid FROM score WHERE cid=(SELECTcid FROM course WHERE cname='oracle'));

--查詢某一位同學所選修的課程的名稱。(已經學生姓名)
  SELECT cname FROM course WHERE cid IN (SELECT cid FROM score WHERE sid in (SELECT sid FROM student WHERE sname='張三'));

7)all: 使用and來對錶達式進行分解

--欄位 > all(值1,值2,。。。,值N)  等價於: 欄位>值1 and 欄位>值2 and... and 欄位>值N。
--欄位 < all(值1,值2,。。。,值N)  等價於: 欄位<值1 and 欄位<值2 and... and 欄位<值N。

樣本:查詢比所有女生年齡都大的男生資訊。
         SELECT * FROM student WHERE ssex='M' AND sage>39;
         SELECT sage FROM student WHERE ssex='F'; --21\25\39
         SELECT * FROM student WHERE ssex='M' AND sage>ALL(SELECT sage FROM student WHERE ssex='F');
        --等價於  SELECT *FROM student WHERE ssex='M' AND sage>21 AND sage>25 AND sage>39;

8)any: 就是用or來對錶達式進行分解

--欄位 > any(值1,值2,。。。,值N)  等價於: 欄位>值1 or 欄位>值2 or ... or 欄位>值N。

樣本:--查詢比任一女生年齡都大的男生資訊。
           SELECT * FROM student WHERE ssex='M' AND sage>ANY(SELECT sage FROM student WHERE ssex='F');

4.彙總函式(分組函數/組函數)

  常見的彙總函式有:count()\avg()\min()\max()\sum(), 括弧裡加欄位或欄位運算式。

樣本:--查詢男生的數量
            SELECT count(*) FROM student WHERE ssex='M';
         --查詢有成績的學生的數量
            SELECT count(distinct sid) FROM score;
        --查詢女生的最小年齡
            SELECT min(sage) FROM student WHERE ssex='F';
         --查詢某一位學生的平均成績
            SELECT avg(grade) FROM score WHERE sid='s0001';
          --查詢年齡最大的學生的姓名
            SELECT* FROM student WHERE sage=(SELECT max(sage) FROM student);

5.分組查詢

文法格式: group by 分組欄位

作用:表示會將表格中所有的資料按照分組欄位進行分組處理、分組欄位的值相同的行會被合并為一條記錄、即一組;分組欄位以外的欄位是無法再被獨立查詢,只能通過彙總函式來實現查詢,分組欄位可以是多個,用逗號分隔。

樣本:--查詢男生和女生的數量
          SELECT ssex,COUNT(*) FROM student GROUP BY ssex;
        --查詢男生和女生的平均年齡、最大年齡、最小年齡
           SELECT ssex,AVG(sage),MAX(sage),min(sage) FROM student GROUP BY ssex;
        --查詢每一門課程被選的數量
           SELECT cid,COUNT(DISTINCT sid) FROM score GROUP BY cid;

注意:where是發生在分組之前,having是發生在分組之後,意味分組函數是不能直接作為條件的值出現在where之後,但是可以出現在having之後。
樣本:--查詢所有科目都及格的學生的sid。
            SELECT sid FROM score WHERE grade>=60 GROUP BY sid; --錯誤的寫法,實現的是任意科目及格的學生。
            SELECT sid FROM score GROUP BY sid HAVING MIN(grade)>=60; --先按學生分組,設定條件每個學生的最低分要大於等於60.       

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.