當前位置:首頁 » 編程語言 » SQL模型例子
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

SQL模型例子

發布時間: 2023-04-12 20:41:10

① 求一份openGauss常用sql示例 做個簡單的入門練手測試~

如下羅列了一些創建、增、刪、改、查相關,請參考(涉及的具體語法及參數自行查閱官方文檔):
--1.CREATE USER
--創建用戶jim,登錄密碼為xxxxxxxxx。
openGauss=# CREATE USER jim PASSWORD 'xxxxxxxxx';

--下面語句與上面的等價。
openGauss=# CREATE USER kim IDENTIFIED BY 'xxxxxxxxx';

--如果創建有「創建資料庫」許可權的用戶,則需要加CREATEDB關鍵字。
openGauss=# CREATE USER dim CREATEDB PASSWORD 'xxxxxxxxx';

--將用戶jim的登錄密碼由xxxxxxxxx修改為Abcd@123。
openGauss=# ALTER USER jim IDENTIFIED BY 'Abcd@123' REPLACE 'xxxxxxxxx';

--為用戶jim追加CREATEROLE許可權。
openGauss=# ALTER USER jim CREATEROLE;

--將enable_seqscan的值設置為on, 設置成功後,在下一會話中生效。
openGauss=# ALTER USER jim SET enable_seqscan TO on;

--重置jim的enable_seqscan參數。
openGauss=# ALTER USER jim RESET enable_seqscan;

--鎖定jim帳戶。
openGauss=# ALTER USER jim ACCOUNT LOCK;

--刪除用戶。
openGauss=# DROP USER kim CASCADE;
openGauss=# DROP USER jim CASCADE;
openGauss=# DROP USER dim CASCADE;

--2.創建和管理資料庫

--使用如下命令創建一個新的資料庫db_tpcc。
openGauss=# CREATE DATABASE db_tpcc;

註:
•資料庫名稱遵循SQL標識符的一般規則。當前角色自動成為此新資料庫的所有者。
•如果一個資料庫系統用於承載相互獨立的用戶和項目,建議把它們放在不同的資料庫里。
•如果項目或者用戶是相互關聯的,並且可以相互使用對方的資源,則應該把它們放在同一個資料庫里,但可以規劃在不同的模式中。模式只是一個純粹的邏輯結構,某個模式的訪問許可權由許可權系統模塊控制。
•創建資料庫時,若資料庫名稱長度超過63位元組,server端會對資料庫名稱進行截斷,保留前63個位元組,因此建議資料庫名稱長度不要超過63個位元組。

--查看資料庫
•使用\l元命令查看資料庫系統的資料庫列表。
openGauss=# \l

•使用如下命令通過系統表pg_database查詢資料庫列表。
openGauss=# SELECT datname FROM pg_database;

--修改資料庫
用戶可以使用如下命令修改資料庫屬性(比如:owner、名稱和默認的配置屬性)。
•使用以下命令為資料庫設置默認的模式搜索路徑。
openGauss=# ALTER DATABASE db_tpcc SET search_path TO pa_catalog,public;

--使用如下命令為資料庫重新命名。
openGauss=# ALTER DATABASE db_tpcc RENAME TO human_tpcds;

--刪除資料庫
用戶可以使用DROP DATABASE命令刪除資料庫。這個命令刪除了資料庫中的系統目錄,並且刪除了磁碟上帶有數據的資料庫目錄。用戶必須是資料庫的owner或者系統管理員才能刪除資料庫。當有人連接資料庫時,刪除操作會失敗。刪除資料庫時請先連接到其他的資料庫。
使用如下命令刪除資料庫:
openGauss=# DROP DATABASE human_tpcds;

--3.CREATE TABLE
--表是建立在資料庫中的,在不同的資料庫中可以存放相同的表。甚至可以通過使用模式在同一個資料庫中創建相同名稱的表。創建表前請先規劃存儲模型。
openGauss=# CREATE TABLE customer_t1
(
c_customer_sk integer,
c_customer_id char(5),
c_first_name char(6),
c_last_name char(8)
);

當結果顯示為如下信息,則表示創建成功。
CREATE TABLE

其中c_customer_sk 、c_customer_id、c_first_name和c_last_name是表的欄位名,integer、char(5)、char(6)和char(8)分別是這四欄位名稱的類型。

--4.向表中插入數據
--向表中插入數據前,意味著表已創建成功。
向表customer_t1中插入一行:
數據值是按照這些欄位在表中出現的順序列出的,並且用逗號分隔。通常數據值是文本(常量),但也允許使用標量表達式。
openGauss=# INSERT INTO customer_t1(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace');

如果用戶已經知道表中欄位的順序,也可無需列出表中的欄位。例如以下命令與上面的命令效果相同。
openGauss=# INSERT INTO customer_t1 VALUES (3769, 'hello', 'Grace');

如果用戶不知道所有欄位的數值,可以忽略其中的一些。沒有數值的欄位將被填充為欄位的預設值。例如:
openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, 'Grace');
openGauss=# INSERT INTO customer_t1 VALUES (3769, 'hello');

用戶也可以對獨立的欄位或者整個行明確預設值:
openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', DEFAULT);
openGauss=# INSERT INTO customer_t1 DEFAULT VALUES;

如果需要在表中插入多行,請使用以下命令:
openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES
(6885, 'maps', 'Joes'),
(4321, 'tpcds', 'Lily'),
(9527, 'world', 'James');
如果需要向表中插入多條數據,除此命令外,也可以多次執行插入一行數據命令實現。但是建議使用此命令可以提升效率。

如果從指定表插入數據到當前表,例如在資料庫中創建了一個表customer_t1的備份表customer_t2,現在需要將表customer_t1中的數據插入到表customer_t2中,則可以執行如下命令。
openGauss=# CREATE TABLE customer_t2
(
c_customer_sk integer,
c_customer_id char(5),
c_first_name char(6),
c_last_name char(8)
);

openGauss=# INSERT INTO customer_t2 SELECT * FROM customer_t1;

從指定表插入數據到當前表時,若指定表與當前表對應的欄位數據類型之間不存在隱式轉換,則這兩種數據類型必須相同。

刪除備份表
openGauss=# DROP TABLE customer_t2 CASCADE;
在刪除表的時候,若當前需刪除的表與其他表有依賴關系,需先刪除關聯的表,然後再刪除當前表。

--5.更新表中數據
修改已經存儲在資料庫中數據的行為叫做更新。用戶可以更新單獨一行,所有行或者指定的部分行。還可以獨立更新每個欄位,而其他欄位則不受影響。

使用UPDATE命令更新現有行,需要提供以下三種信息:
•表的名稱和要更新的欄位名
•欄位的新值
•要更新哪些行

SQL通常不會為數據行提供唯一標識,因此無法直接聲明需要更新哪一行。但是可以通過聲明一個被更新的行必須滿足的條件。只有在表裡存在主鍵的時候,才可以通過主鍵指定一個獨立的行。

建立表和插入數據的步驟請參考創建表和向表中插入數據。

需要將表customer_t1中c_customer_sk為9527的地域重新定義為9876:
openGauss=# UPDATE customer_t1 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527;

這里的表名稱也可以使用模式名修飾,否則會從默認的模式路徑找到這個表。SET後面緊跟欄位和新的欄位值。新的欄位值不僅可以是常量,也可以是變數表達式。

比如,把所有c_customer_sk的值增加100:
openGauss=# UPDATE customer_t1 SET c_customer_sk = c_customer_sk + 100;

在這里省略了WHERE子句,表示表中的所有行都要被更新。如果出現了WHERE子句,那麼只有匹配其條件的行才會被更新。

在SET子句中的等號是一個賦值,而在WHERE子句中的等號是比較。WHERE條件不一定是相等測試,許多其他的操作符也可以使用。

用戶可以在一個UPDATE命令中更新更多的欄位,方法是在SET子句中列出更多賦值,比如:
openGauss=# UPDATE customer_t1 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421;

批量更新或刪除數據後,會在數據文件中產生大量的刪除標記,查詢過程中標記刪除的數據也是需要掃描的。故多次批量更新/刪除後,標記刪除的數據量過大會嚴重影響查詢的性能。建議在批量更新/刪除業務會反復執行的場景下,定期執行VACUUM FULL以保持查詢性能。

--6.查看數據
使用系統表pg_tables查詢資料庫所有表的信息。
openGauss=# SELECT * FROM pg_tables;

使用gsql的\d+命令查詢表的屬性。
openGauss=# \d+ customer_t1;

執行如下命令查詢表customer_t1的數據量。
openGauss=# SELECT count(*) FROM customer_t1;

執行如下命令查詢表customer_t1的所有數據。
openGauss=# SELECT * FROM customer_t1;

執行如下命令只查詢欄位c_customer_sk的數據。
openGauss=# SELECT c_customer_sk FROM customer_t1;

執行如下命令過濾欄位c_customer_sk的重復數據。
openGauss=# SELECT DISTINCT( c_customer_sk ) FROM customer_t1;

執行如下命令查詢欄位c_customer_sk為3869的所有數據。
openGauss=# SELECT * FROM customer_t1 WHERE c_customer_sk = 3869;

執行如下命令按照欄位c_customer_sk進行排序。
openGauss=# SELECT * FROM customer_t1 ORDER BY c_customer_sk;

--7.刪除表中數據
在使用表的過程中,可能會需要刪除已過期的數據,刪除數據必須從表中整行的刪除。

SQL不能直接訪問獨立的行,只能通過聲明被刪除行匹配的條件進行。如果表中有一個主鍵,用戶可以指定準確的行。用戶可以刪除匹配條件的一組行或者一次刪除表中的所有行。

使用DELETE命令刪除行,如果刪除表customer_t1中所有c_customer_sk為3869的記錄:
openGauss=# DELETE FROM customer_t1 WHERE c_customer_sk = 3869;

如果執行如下命令之一,會刪除表中所有的行。
openGauss=# DELETE FROM customer_t1;

openGauss=# TRUNCATE TABLE customer_t1;
全表刪除的場景下,建議使用truncate,不建議使用delete。

刪除創建的表:
openGauss=# DROP TABLE customer_t1;

② 經驗分享:8種常見SQL錯誤用法

1、LIMIT 語句

分頁查詢是最常用的場景之一,但也通常也是最容易出問題的地方。比如對於下面簡單的語句,一般 DBA 想到的辦法是在 type, name, create_time 欄位上加組合索引。這樣條件排序都能有效的利用到索引,性能迅速提升。

好吧,可能90%以上的 DBA 解決該問題就到此為止。但當 LIMIT 子句變成 「LIMIT 1000000,10」 時,程序員仍然會抱怨:我只取10條記錄為什麼還是慢?

要知道資料庫也並不知道第1000000條記錄從什麼地方開始,即使有索引也需要從頭計算一次。出現這種性能問題,多數情形下是程序員偷懶了。

前端數據瀏覽翻頁,或者大數據分批導出等場景下,是可以將上一頁的最大值當成參數作為查詢條件的。SQL 重新設計如下:

在新設計下查詢時間基本固定,不會隨著數據量的增長而發生變化。

2、隱式轉換

SQL語句中查詢變數和欄位定義類型不匹配是另一個常見的錯誤。比如下面的語句:

其中欄位 bpn 的定義為 varchar(20),MySQL 的策略是將字元串轉換為數字之後再比較。函數作用於表欄位,索引失效。

上述情況可能是應用程序框架自動填入的參數,而不是程序員的原意。現在應用框架很多很繁雜,使用方便的同時也小心它可能給自己挖坑。

3、關聯更新、刪除

雖然 MySQL5.6 引入了物化特性,但需要特別注意它目前僅僅針對查詢語句的優化。對於更新或刪除需要手工重寫成 JOIN。

比如下面 UPDATE 語句,MySQL 實際執行的是循環/嵌套子查詢(DEPENDENT SUBQUERY),其執行時間可想而知。

執行計劃:

重寫為 JOIN 之後,子查詢的選擇模式從 DEPENDENT SUBQUERY 變成 DERIVED,執行速度大大加快,從7秒降低到2毫秒。

執行計劃簡化為:

4、混合排序

MySQL 不能利用索引進行混合排序。但在某些場景,還是有機會使用特殊方法提升性能的。

執行計劃顯示為全表掃描:

由於 is_reply 只有0和1兩種狀態,我們按照下面的方法重寫後,執行時間從1.58秒降低到2毫秒。

5、EXISTS語句

MySQL 對待 EXISTS 子句時,仍然採用嵌套子查詢的執行方式。如下面的 SQL 語句:

執行計劃為:

去掉 exists 更改為 join,能夠避免嵌套子查詢,將執行時間從1.93秒降低為1毫秒。

新的執行計劃:

6、條件下推

外部查詢條件不能夠下推到復雜的視圖或子查詢的情況有:

如下面的語句,從執行計劃可以看出其條件作用於聚合子查詢之後:

確定從語義上查詢條件可以直接下推後,重寫如下:

執行計劃變為:

關於 MySQL 外部條件不能下推的詳細解釋說明請參考文章:

7、提前縮小范圍

先上初始 SQL 語句:

該SQL語句原意是:先做一系列的左連接,然後排序取前15條記錄。從執行計劃也可以看出,最後一步估算排序記錄數為90萬,時間消耗為12秒。

由於最後 WHERE 條件以及排序均針對最左主表,因此可以先對 my_order 排序提前縮小數據量再做左連接。SQL 重寫後如下,執行時間縮小為1毫秒左右。

再檢查執行計劃:子查詢物化後(select_type=DERIVED)參與 JOIN。雖然估算行掃描仍然為90萬,但是利用了索引以及 LIMIT 子句後,實際執行時間變得很小。

8、中間結果集下推

再來看下面這個已經初步優化過的例子(左連接中的主表優先作用查詢條件):

那麼該語句還存在其它問題嗎?不難看出子查詢 c 是全表聚合查詢,在表數量特別大的情況下會導致整個語句的性能下降。

其實對於子查詢 c,左連接最後結果集只關心能和主表 resourceid 能匹配的數據。因此我們可以重寫語句如下,執行時間從原來的2秒下降到2毫秒。

但是子查詢 a 在我們的SQL語句中出現了多次。這種寫法不僅存在額外的開銷,還使得整個語句顯的繁雜。使用 WITH 語句再次重寫:

總結

資料庫編譯器產生執行計劃,決定著SQL的實際執行方式。但是編譯器只是盡力服務,所有資料庫的編譯器都不是盡善盡美的。

上述提到的多數場景,在其它資料庫中也存在性能問題。了解資料庫編譯器的特性,才能避規其短處,寫出高性能的SQL語句。

程序員在設計數據模型以及編寫SQL語句時,要把演算法的思想或意識帶進來。

編寫復雜SQL語句要養成使用 WITH 語句的習慣。簡潔且思路清晰的SQL語句也能減小資料庫的負擔 。

③ 在sql中,關系模型的操作包括哪些

常用的關系操作包括查詢操作和插入、刪除、修改操作兩大部分。其中查詢操作的表達能力最重要,包括:選擇、投影、連接、除、並、交、差等。

④ sql資料庫的關系模型有哪些原始運算

關系模型有如下優點
1. 數據結構簡單
在關系模型中,數據模型是一些表格的框架,實體通過關系的屬性(即表格的欄目)表示,實體之間的聯系通過這些表格中的公共屬性(可以不同屬性名,但必須同域)表示。結構非常簡單,即使非專業人員也能一看就明白。
2. 查詢與處理方便
在關系模型中,數據的操作較非關系模型方便,它的一次操作不只是一個元組,而可以是一個元組集合。特別在高級語言的條件語句配合下,一次可操作所有滿足條件的記錄。
3. 數據獨立性很高
在關系模型中,用戶對數據的操作可以不涉及數據的物理存儲位置,而只須給出數據所在的表、屬性等有關數據自身的特性即可,具有較高的數據獨立性。
4. 堅實的理論基礎
與網狀模型和層次模型不同,關系模型一開始便注重理論研究。在資料庫領域專家的不懈努力下,關系系統的研究日趨完善,而且也促進了其它軟體分支如軟體工程的發展。

關系模型也存在的不足的地方:
1. 查詢效率低
關系模型的資料庫管理系統提供了較高的數據獨立性和非過程化的查詢功能,因此系統的負擔很重,直接影響查詢速度和查詢效率。
2. 關系DBMS實現較困難
由於關系資料庫管理系統的效率比較低,必須對關系模型的查詢進行優化,這一工作相當復雜,實現難度比較大。

⑤ SQL Server提供的3種恢復模型都是什麼有什麼區別

SQLSERVER2000支持三種恢復模型
1.簡單恢復模型
簡單恢復模型允許將資料庫恢復到最新的備份
簡單恢復的備份包括:
資料庫備份
差異備份
2.完全恢復模型
完全恢復模型允許將資料庫恢復到特定即時點
完全恢復的備份包括:
資料庫備份
差異備份
事務日誌備份
將資料庫還原到故障點步驟:
1.備份當前活動事務日誌
2.還原最新資料庫備份但不恢復資料庫
3.按照創建的順序,還原自資料庫備份後創建的每個事務日誌備份,但不恢復資料庫
4.應用最新的事務日誌備份(步驟1中創建的)並恢復資料庫
3.大容量日誌記錄恢復模型
大容量日誌記錄恢復模型允許大容量日誌記錄操作
創建新資料庫時,繼承model資料庫的恢復模型,默認是簡單恢復模型
可以在企業管理器中切換恢復模型,如下圖所示
完全恢復模型時,可以在企業管理器中備份事務日誌
企業管理器中的備份功能其實就是調用BackUp命令,備份資料庫是Backup Database,備份事務日誌是Backup Log。同樣,企業管理器中的還原功能就是調用Restore命令,還原資料庫是Restore Database,還原事務日誌是Restore Log。可以通過事件查看器跟蹤這些命令。
當在企業管理器還原資料庫時,還原選擇資料庫,企業管理器會自動按照如上所述的步驟將資料庫還原到故障點,可以通過事件查看器跟蹤這些命令

SQL SERVER使用以下的備份歷史表來跟蹤備份活動
backupfile
backupmediafamily
backupmediaset
backupset
這些表都存儲在msdb資料庫

⑥ SQL語言是如何支持關系資料庫的三級模型結構的

SQL全稱是「結構化查詢語言(Structured Query Language)」,最早的是IBM的聖約瑟研究實驗室為其關系資料庫管理系統SYSTEM R開發的一種查詢語言,它的前身是SQUARE語言。SQL語言結構簡潔,功能強大,簡單易學,所以自從IBM公司1981年推出以來,SQL語言,得到了廣泛的應用。如今無論是像Oracle ,Sybase,Informix,SQL server這些大型的資料庫管理系統,還是像Visual Foxporo,PowerBuilder這些微機上常用的資料庫開發系統,都支持SQL語言作為查詢語言。

Structured Query Language包含4個部分:

數據查詢語言DQL-Data Query Language SELECT
數據操縱語言DQL-Data Manipulation Language INSERT, UPDATE, DELETE
數據定義語言DQL-Data Definition Language CREATE, ALTER, DROP
數據控制語言DQL-Data Control Language COMMIT WORK, ROLLBACK WORK

SQL的歷史

在70年代初,E.E.Codd首先提出了關系模型。70年代中期,IBM公司在研製 SYSTEM R關系資料庫管理系統中研製了SQL語言,最早的SQL語言(叫SEQUEL2)是在1976 年 11 月的IBM Journal of R&D上公布的。

1979年ORACLE公司首先提供商用的SQL,IBM公司在DB2 和SQL/DS資料庫系統中也實現了SQL。

1986年10月,美國ANSI採用SQL作為關系資料庫管理系統的標准語言(ANSI X3. 135-1986),後為國際標准化組織(ISO)採納為國際標准。

1989年,美國ANSI採納在ANSI X3.135-1989報告中定義的關系資料庫管理系統的SQL標准語言,稱為ANSI SQL 89, 該標准替代ANSI X3.135-1986版本。該標准為下列組織所採納:

● 國際標准化組織(ISO),為ISO 9075-1989報告「Database Language SQL With Integrity Enhancement」
● 美國聯邦政府,發布在The Federal Information Processing Standard Publication(FIPS PUB)127

目前,所有主要的關系資料庫管理系統支持某些形式的SQL語言, 大部分資料庫打算遵守ANSI SQL89標准。

SQL的優點

SQL廣泛地被採用正說明了它的優點。它使全部用戶,包括應用程序員、DBA管理員和終端用戶受益非淺。

(1) 非過程化語言

SQL是一個非過程化的語言,因為它一次處理一個記錄,對數據提供自動導航。SQL允許用戶在高層的數據結構上工作,而不對單個記錄進行操作,可操作記錄集。所有SQL 語句接受集合作為輸入,返回集合作為輸出。SQL的集合特性允許一條SQL語句的結果作為另一條SQL語句的輸入。 SQL不要求用戶指定對數據的存放方法。 這種特性使用戶更易集中精力於要得到的結果。所有SQL語句使用查詢優化器,它是RDBMS的一部分,由它決定對指定數據存取的最快速度的手段。查詢優化器知道存在什麼索引,哪兒使用合適,而用戶從不需要知道表是否有索引,表有什麼類型的索引。

(2) 統一的語言

SQL可用於所有用戶的DB活動模型,包括系統管理員、資料庫管理員、 應用程序員、決策支持系統人員及許多其它類型的終端用戶。基本的SQL 命令只需很少時間就能學會,最高級的命令在幾天內便可掌握。 SQL為許多任務提供了命令,包括:

● 查詢數據
● 在表中插入、修改和刪除記錄
● 建立、修改和刪除數據對象
● 控制對數據和數據對象的存取
● 保證資料庫一致性和完整性

以前的資料庫管理系統為上述各類操作提供單獨的語言,而SQL 將全部任務統一在一種語言中。

(3) 是所有關系資料庫的公共語言

由於所有主要的關系資料庫管理系統都支持SQL語言,用戶可將使用SQL的技能從一個RDBMS轉到另一個。所有用SQL編寫的程序都是可以移植的。
參考資料:

⑦ SQL 中 left join具體的用法,最好能舉出例子.

給個通俗的解釋吧.
例表a
aid adate
1 a1
2 a2
3 a3
表b
bid bdate
1 b1
2 b2
4 b4
兩個表a,b相連接,要取出id相同的欄位
select * from a inner join b on a.aid = b.bid這是僅取出匹配的數據.
此時的取出的是:
1 a1 b1
2 a2 b2
那麼left join 指:
select * from a left join b on a.aid = b.bid
首先取出a表中所有數據,然後再加上與a,b匹配的的數據
此時的取出的是:
1 a1 b1
2 a2 b2
3 a3 空字元
同樣的也有right join
指的是首先取出b表中所有數據,然後再加上與a,b匹配的的數據
此時的取出的是:
1 a1 b1
2 a2 b2
4 空字元 b4