oracle sql 基礎(四):數據定義語言(創建和管理表、視圖)

来源:http://www.cnblogs.com/sjzh/archive/2017/05/01/6694989.html
-Advertisement-
Play Games

數據定義語言 (Data Definition Language, DDL) 是SQL語言集中負責數據結構定義與資料庫對象定義的語言,由CREATE、ALTER與DROP三個語法所組成。資料庫對象包括表、視圖、索引、同義詞、序列等(TABLE/VIEW/INDEX/SYN/SEQUENCE)。我們先 ...


        數據定義語言 (Data Definition Language, DDL) 是SQL語言集中負責數據結構定義與資料庫對象定義的語言,由CREATE、ALTER與DROP三個語法所組成。資料庫對象包括表、視圖、索引、同義詞、序列等(TABLE/VIEW/INDEX/SYN/SEQUENCE)。我們先對創建和管理表和視圖進行一個介紹。

         一、創建和管理表

        數據表是資料庫中一個非常重要的對象,是其他對象的基礎。可分為用戶表和數據字典兩類。

        1、創建表(CREATE TABLE)

        CREATE TABLE 語句創建表

CREATE TABLE table                 --table:表名   column:列名
            (column datatype       --列的數據類型和長度
            [DEFAULT expr]         --指定預設值,防止插入時輸入空值到列中
            [,...]);

        最為常見的數據類型有三種,分別為字元型,數值型,日期型。

數據類型 說明
VARCHAR2(size) 可變長度字元數據(必須指定最大字元數:最小字元數是 1;最大字元數是 4000)
CHAR [(size)] 固定長度字元數據,長度的大小以位元組為單位(預設和最小字元數為 1;最大字元數為 2000)
NUMBER [(p,s)] 數字,精度為p,小數為s (p是數字總長度,s是小數點右邊的數字長度;p的範圍從1到38,s的範圍從-84到127)
DATE 日期和時間值,從公元前4712.1.1到公元9999.12.31

        用子查詢語法創建表(CTAS)

CREATE TABLE table
             [(column, column...)]
          AS subquery              --使用子查詢

       如果給出了指定的列,列的數目必須等於子查詢的SELECT列表的列數目。如果沒有給出了指定的列,表的列名應和子查詢中的列名是相同的。完整性規則不會被傳遞到新表中,僅列的數據類型被定義。

       2、修改表(ALTER TABLE)

ALTER TABLE table ADD (column datatype [DEFAULT expr][,column datatype]...);    --添加列
ALTER TABLE table MODIFY (column datatype [DEFAULT expr][,column datatype]...); --修改
ALTER TABLE table DROP (column);                                                --刪除
ALTER TABLE table SET UNUSED (column);                                          --隱藏列
ALTER TABLE table DROP UNUSED COLUMNS; --刪除隱藏的列

       添加列時不能指定新添加的列出的位置,新列將成為最後一列;修改列時可以修改數據類型大小和預設值,當列中只包含空值時才能減少一個列的寬度和改變數據類型,對預設值的改變僅改變影響以後插入的列;刪除列時一次只能有一列被刪除。表被修改後必須至少保留一列。一旦一列被刪除,它不能再恢復;當一列從表中被刪除時,該表中任何其他的被用SET UNUSED選項標記列也被刪除,設置UNUSED的作用是為了在cpu、記憶體等資源不充足的時候,先做上UNUSED標記再等資料庫資源空閑的時候用DROP UNUSED COLUMNS刪除。

       3、刪除表(DROP TABLE)

DROP TABLE table [PURGE];

       當你刪除一個表時,資料庫丟失表中所有的數據,並且所有與其相關的索引也被刪除,任何視圖和同義詞被保留但無效。ORACLE 10g中由於引入了回收站,因此要徹底刪除一個表需要加PURGE關鍵字。

       4、截斷表(TRUNCATE TABLE)

TRUNCATE TABLE table;

       截斷表用於從表中刪除所有的行,並且釋放該表所使用的存儲空間。DELETE語句也可以從表中刪除所有的行,但它不能釋放存儲空間。TRUNCATE命令更快一些,原因如下:TRUNCATE語句是數據定義 (DDL) 語句,不產生回滾信息;截斷一個表不觸發表的刪除觸發器。

       二、定義和管理約束

       約束 (constraints)用來防止無效數據輸入到表中。你可以使用約束做下麵的事:在插入、更新行或者從表中刪除行的時候強製表中的數據遵循規則;對於成功的操作,約束必須被滿足,如果表之間有依賴關係,防止表的刪除;為 Oracle工具提供規則,例如Oracle Developer。

       約束可以在創建表時定義,也可以在表創建之後定義。你可以用USER_CONSTRAINTS和USER_CONS_COLUMNS數據字典表查看對一個表約束的定義。

       1、定義約束

CREATE TABLE [schema.]table
             (column datatype [DEFAULT expr]                                       --數據類型
             [column [CONSTRAINT constraint_name] constraint_type],...             --列級約束
             [column,...[CONSTRAINT constraint_name] constraint_type] (column,...) --表級約束
             [,...]);

       約束通常在創建表的同時被創建。在表創建後約束能夠被添加,並且約束可以可以被臨時禁用。 約束可以在兩個級別上定義:列級約束,只涉及一個單個的列,對於該列用規範定義,能夠定義完整性約束的任何類型;表級約束,涉及一個或多個列,表中的列被分別定義,除了 NOT NULL,能夠定義任意約束。

       2、約束類型

約束名稱 說明
NOT NULL 約束 確保列無不包含空值。在預設情況下,列沒有NOT NULL約束,可以包含空值。
UNIQUE 約束 完整性約束,要求列或者列的組合中 (鍵) 的每個值是唯一的,既在表中指定的列或列組合中不能有兩行有相同的值。定義UNIQUE鍵約束的列 (或列組合) 被稱為唯一鍵 (unique key)。因為空不等於任何事。在一個列 (或者在一個複合UNIQUE鍵中的所有列) 中的空總是滿足UNIQUE約束。
PRIMARY KEY 約束 為表創建一個主鍵。每個表只能創建一個主鍵。PRIMARY KEY約束是表中的對行唯一標識的一個列或者多個列的組合,該約束強制列或列組合的唯一性,並且確保作為主鍵一部分的列不能包含空值。PRIMARY KEY約束既可以定義在列級也可以定義在表級。用表級定義創建一個組合PRIMARY KEY。一個表只能有一個PRIMARY KEY約束,但可以有多個UNIQUE約束。
FOREIGN KEY 約束 引用完整性約束,指明一個列或者列的組合作為一個外鍵,並且在相同表或者不同表的主鍵或者唯一鍵和外鍵之間建立一個關係。前提是被引用的外鍵必須是另外一個表的主鍵。
CHECK約束 定義一個每行都必須滿足的條件,該條件可以用和查詢條件一樣的結構。

       3、管理約束

ALTER TABLE table ADD [CONSTRAINT constraint] type (column);                       --添加約束
ALTER TABLE table DROP PRIMARY KEY|UNIQUE(column)|CONSTRAINT constraint [CASCADE]; --刪除約束
ALTER TABLE table DISABLE CONSTRAINT constraint [CASCADE];                         --禁用約束
ALTER TABLE table ENABLE CONSTRAINT constraint;                                    --啟用約束

       你可以添加、刪除或禁用一個約束,但你不能修改它的結構。你可以用ALTER TABLE語句的MODIFY子句添加一個NOT NULL約束到一個已經存在的列。只有在表是空的或者每個行的該列都有非空值的情況下,你才可以定義一個NOT NULL列。
       為了刪除約束,你可以先從USER_CONSTRAINTS和USER_CONS_COLUMNS數據字典視圖中確定約束的名字,然後使用帶DROP子句的ALTER TABLE語句。DROP子句的CASCADE選項導致任何與其相依賴的約束也被刪除。
       你可以禁用一個約束而不刪除它,或者用帶DISABLE子句的ALTER TABLE語句重新創建它。我們即可以在CREATE TABLE語句也可以在ALTER TABLE語句中使用 DISABLE子句。CASCADE子句禁用相依賴的完整性約束。禁用唯一或主鍵約束會移除唯一性索引。
       你可以用帶ENABLE子句的ALTER TABLE語句啟用一個禁用的約束,而不需要重新創建它。如果啟用一個約束,約束將應用於表中所有的數據,所有在表中的數據都必須適合該約束。如果你啟用一個UNIQUE鍵或者PRIMARY KEY約束,一個UNIQUE或PRIMARY KEY索引將被自動地創建。你即可以CREATE TABLE語句也可以在ALTER TABLE語句中使用ENABLE子句。啟用一個帶CASCADE選項的被禁用的主鍵約束不會起用任何依賴於該主鍵的外鍵。

       三、創建和管理視圖

       視圖是數據來自一個或者多個表的數據子集的邏輯表示。視圖是基於表或另一個視圖的邏輯表,一個視圖並不包含它自己的數據,它象一個視窗,通過該視窗可以查看或改變表中的數據。視圖基於其上的表稱為基表。
       視圖限制數據的訪問,因為視圖能夠選擇性的顯示表中的列;視圖可以用來構成簡單的查詢以取回覆雜查詢的結果;視圖對特別的用戶和應用程式提供數據獨立性,一個視圖可以從幾個表中取回數據;視圖提供用戶組按照他們的特殊標準訪問數據。

       1、創建視圖

       視圖有兩種分類:簡單視圖和複雜視圖。簡單視圖:數據僅來自一個表,不包含函數或數據分組,能通過視圖執行DML操作。複雜視圖:數據來自多個表,包含函數或數據分組,除查詢外,只能進行少數DML操作。下麵是創建視圖的語法。

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias]...)]
                                      AS subquery
                      [WITH CHECK OPTION [CONSTRAINT constraint]]
                         [WITH READ ONLY [CONSTRAINT constraint]];
----OR REPLACE 如果視圖已經存在重新創建它
----FORCE 創建視圖,而不管基表是否存在
----NOFORCE 只在基表存在的情況下創建視圖(這是預設值)
----view 視圖的名字
----alias 為由視圖查詢選擇的表達式指定名字(別名的個數必須與由視圖選擇的表達式的個數匹配)
----subquery 是一個完整的SELECT語句(對於在SELECT列表中的欄位你可以用別名)
----WITH CHECK OPTION 指定只有可訪問的行在視圖中才能被插入或修改
----constraint 為CHECK OPTION約束指定的名字
----WITH READ ONLY 確保在該視圖中沒有DML操作被執行

       創建視圖的原則:定義一個視圖的子查詢可以包含複雜的SELECT語法,包括連分組和多個字查詢;定義視圖的子查詢不能包含ORDER BY子句,當你從視圖取回數據時可以指定ORDER BY子句;如果你沒有為用WITH CHECK OPTION選項創建的視圖指定一個約束名字,系統將以SYS_Cn格式指定一個預設的名字。

       2、管理視圖

DROP VIEW view;      --view是視圖的名字

       我們可以用DROP VIEW語句來刪除視圖。該語句從資料庫中刪除視圖定義。刪除視圖不影響用於建立視圖的基表。基於已刪除視圖上的其它視圖或應用程式將無效。

       用OR REPLACE選項,允許創建視圖時同名的視圖已經存在,這樣舊版本的視圖會被替換,這意味著視圖可以在不被刪除、重新創建和再次授予對象許可權的情況下修改。當在CREATE VIEW子句中指定列別名時,不要望了別名的列表順序與子查詢的列順序一樣。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者:Antonio Leiva 時間:Apr 25, 2017 原文鏈接:https://antonioleiva.com/unit-tests-android-kotlin/ 當然,Kotlin也允許我們以非常簡單的方法進行單元測試,它非常類似我們在Java中進行的那樣。 當我們使用想Mocki ...
  • 環境:win10專業版(創意者),Android studio 2.3.1問題描述:安裝玩Android studio之後創建一個項目,建立AVD之後,運行程式時一直不能啟動AVD,具體描述為:”Waiting for target device to come online”。即“等待目標設備線上 ...
  • 最近解決了一個令我頭疼好久的問題,就是三星手機拍照圖片旋轉的問題,項目中有上傳圖片的功能,那麼涉及到拍照,從相冊中選擇圖片,別的手機都ok沒有問題,唯獨三星的手機拍照之後,你會很清楚的看到會把照片旋轉一下,然後你根據路徑找到的圖片就是已經被旋轉的了,解決辦法終於被我找到了。我們可以根據圖片的路徑讀取 ...
  • 之前在做項目的時候,做了一個分享的功能,調用的是友盟的第三方,功能實現的很完美,也完美分享了,但是在測試的時候,我用魅族X4的手機分享彈出的popwindow被手機自身的虛擬鍵擋住了,在網上找了好多資料,說可以把手機的虛擬鍵給關閉,卻是也做到了,但是好像不太符合邏輯。看到qq的就不會被擋到心裡很佩服 ...
  • 如下圖: 要實現上面的功能,需要做到三點: 1、實現矩形框佈局 思路就是矩形框作為整個佈局的一個background,在drawable中創建一個shap.xml樣式文件 在佈局文件中設置 android:background="@drawable/shap" 然後將editText和Textvie ...
  • 開始 這裡我將從最初的開始進行介紹,包括Github上創建項目已經上傳項目,到最後的支持Cocoapods。 步驟如下: 開始 這裡我將從最初的開始進行介紹,包括Github上創建項目已經上傳項目,到最後的支持Cocoapods。 步驟如下: 代碼上傳Github 創建podspec文件,並驗證是否 ...
  • 出現如下提示,錯誤: 找不到或無法載入主類 com.sun.tools.javac.MainMSB6006: 或 閿欒: 紼嬪簭鍖卆ndroid.support.v4.view.ViewPager涓嶅瓨鍦? 刪掉bin,obj文件夾重新生成 還是沒有效果的話參照這裡http://blog.csdn. ...
  • 環境: CentOS6.5_x64 InfluxDB版本:1.1.0 InfluxDB官網暫未提供C語言開發庫,但github提供的有: https://github.com/influxdata/influxdb-c 但這個版本比較早了,到目前為止不支持0.9及其以後的版本。 這裡有我自己開發的I ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...