系列文章目錄
1.數(shù)據庫介紹
2.SQL介紹
【免責聲明】文章僅供學習交流,觀點代表個人,與任何公司無關。
編輯|SQL和數(shù)據庫技術(ID:SQLplusDB)
3. SQL標準
為了確保不同廠商數(shù)據庫系統(tǒng)之間的兼容性和互操作性,用于控制SQL查詢的行為和數(shù)據存儲結構等方面的統(tǒng)一性,由國際組織或者國家標準化組織制定和發(fā)布了一系列的標準規(guī)范。
3.1 ISO SQL和ANSI SQL
ISO SQL和ANSI SQL都是國際上公認的SQL標準,該標準定義了SQL語言的語法、規(guī)則以及對數(shù)據庫訪問的方法。
-
ISO SQL:全稱是“International Organization for Standardization Structured
Query Language”,由國際標準化組織(ISO)/國際電工委員會(IEC)制定的國際SQL標準。它廣泛應用于歐洲和亞洲等地區(qū)的數(shù)據庫管理系統(tǒng)中。ISO SQL是一個更嚴格的標準,它強制規(guī)定了數(shù)據庫管理系統(tǒng)必須具備哪些特征和能力,使得數(shù)據庫知識可以更加通用。 -
ANSI SQL:全稱是 “American National Standard Institute Structured Query
Language”, 由美國國家標準協(xié)會制定的美國SQL標準。它主要用于在美國和加拿大地區(qū)的數(shù)據庫管理系統(tǒng)中。
ISO SQL是全球范圍內的SQL規(guī)范,目的是確保SQL語言的一致性和交互性。ANSI是ISO和International Electrotechnical Commission(IEC)的成員之一,ANSI 會發(fā)布與國際標準組織相應的美國標準。因此,ANSI SQL和ISO SQL并不是完全等同的,但從某種角度而言,可以說ANSI SQL是ISO SQL的一個子集。
雖然ANSI SQL和ISO SQL之間可能存在一些差異或細微的不同,但通常來說它們的區(qū)別并不大。它們之間通常會建立聯(lián)系和合作,以確保它們的標準可以互相認可和接受,所以不會影響SQL的核心概念和基本規(guī)則。
3.2 SQL標準的歷史
1. SQL-86
SQL-86的全稱是"American National Standard for Information Systems–Database Language–SQL",是由美國國家標準學會(ANSI)于1986年制定了第一個SQL標準“ANSI/INCITS 135-1986”。當時ISO并未參與SQL-86的制定,因此該標準只是一份美國國家標準(ANSI標準),而非ISO標準。幾個月之后,ISO發(fā)表了一個技術上相同的標準,ISO 9075-1987,將SQL從早期僅限于IBM數(shù)據庫的狹窄領域帶到了國際舞臺上。
標準主要規(guī)定了SQL語言的基本語法:
- SELECT、INSERT、UPDATE和DELETE語句的語法
- SELECT語法允許使用WHERE進行過濾,使用GROUP BY對多個列(但不是按表達式)進行分組,并使用HAVING對組進行過濾
- SELECT語法允許子查詢
- 沒有明確的JOIN語法
- 可以創(chuàng)建表(只支持UNIQUE和NOT NULL限制)
- 引入字符字符串和數(shù)字(NUMERIC、DECIMAL、INTEGER、SMALLINT、FLOAT、REAL和DOUBLE PRECISION)的數(shù)據類型
- 創(chuàng)建視圖和授予權限
- 沒有ALTER、DROP或REVOKE語句
雖然SQL-86在后來的SQL標準中被逐漸淘汰,但在SQL的發(fā)展歷史中具有重要的里程碑意義。
下面是一個SQL-86的示例:
創(chuàng)建表seller:
CREATE TABLE seller (
seller_id INT,
seller_name VARCHAR(50),
seller_address VARCHAR(200),
seller_phone VARCHAR(20)
);
插入數(shù)據:
INSERT INTO seller VALUES (1, 'Tom', 'New York', '123456');
選擇數(shù)據:
SELECT seller_name FROM seller WHERE seller_id = 1;
2. SQL-89 (SQL1)
SQL-89由ISO/IEC(國際標準化組織和國際電工委員會)聯(lián)合制定的標準,編號為 ISO/IEC 9075:1989,同時美國國家標準學會(ANSI)制定為ANSI標準,編號為 ANSI/INCITS 135-1992,是SQL-86的更新版本,SQL-89 又稱為SQL1。
SQL-89最重要的新功能是引入了完整性約束。這意味著可以在創(chuàng)建表時定義列的約束條件,以保證數(shù)據的完整性和一致性。
例如,下面是一個創(chuàng)建了一個具有主鍵和外鍵約束的表的示例:
CREATE TABLE employees (
employee_id INTEGER PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
department_id INTEGER,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
在這個例子中,employees表中的employee_id被定義為主鍵,這意味著每個記錄都必須具有唯一的employee_id值。department_id被定義為外鍵,它必須與departments表中的department_id列中的值匹配。通過這些約束條件,可以確保employees表中的數(shù)據是完整和一致的。
3. SQL-92 (SQL2)
SQL-92 由ISO/IEC(國際標準化組織和國際電工委員會)聯(lián)合制定的標準,編號為 ISO/IEC 9075-1:1992。同時,SQL-92也被美國國家標準學會(ANSI)采納為ANSI標準,編號為 ANSI/INCITS 135-1992,SQL-92 又稱為SQL2。
SQL-92是SQL的一個重要標準版本,它引入了許多新特性,例如:
- 明確的JOIN語法和引進外連接:LEFT JOIN、RIGHT JOIN、FULL JOIN。
- 引入NATURAL JOIN和CROSS JOIN。
- 引入集合操作(集合并、集合交和集合差)。
- 引入條件表達式CASE WHEN。
- 新增標量操作:字符串串聯(lián)、字串提取以及日期和時間計算。
- CAST運算符,允許將值顯式轉換為類型。
- 新的數(shù)據定義語句:ALTER和DROP表和視圖
- 新的數(shù)據類型:日期、時間、時間戳、interval、二進制串、字符串和國家字符串。
- 信息模式(Information schema):獲取數(shù)據庫元數(shù)據的標準方法,如表名、表列、列類型和表約。
- 引入了臨時表
- 事務隔離級別
- 動態(tài)SQL
下面是一個SQL-92的JOIN語法示例:
SELECT *
FROM Employee
JOIN Department
ON Employee.DepartmentID = Department.DepartmentID;
4. SQL:1999 (SQL3)
全稱是“ISO/IEC 9075:1999”,也稱為SQL3 ,是在ISO和ANSI共通指導下對SQL標準進行的第四次修改。
從這個版本開始,標準名稱使用冒號而不是連字符,以保持與其他ISO標準名稱的一致性。
SQL:1999它引入了許多新特性和現(xiàn)代SQL的重要功能,例如:
4.1 公共表達式(CTEs)
SQL:1999引入了公共表達式( Common Table Expressions,CTEs),這是一個非常有用的功能,可以讓你組織并簡化長而復雜的SQL查詢,并使其更易讀。在使用WITH語法時,CTEs可以在查詢中聲明并引用,從而消除了重復代碼和多余的子查詢。
CTE的用法如下:
WITH cte_name (column_list) AS (
SELECT ...
FROM ...
WHERE ...
),
...
SELECT ...
FROM table1
JOIN cte_name ON ...
WHERE ...
其中,cte_name是CTE的名稱,column_list是列名列表,SELECT語句是常規(guī)的查詢,與常規(guī)查詢一樣,可以使用聚合函數(shù)、JOIN、子查詢等功能。然后,通過將查詢定義為CTE,可以在查詢中使用簡化的語法引用查詢。
此外,當使用WITH RECURSIVE語法時,CTEs還可以遞歸處理分層數(shù)據。以下是一個示例,演示如何使用CTE來查找遞歸樹中某個節(jié)點的所有祖先:
WITH RECURSIVE ancestors AS (
SELECT id, parent_id
FROM table1
WHERE id = 10
UNION ALL
SELECT table1.id, table1.parent_id
FROM table1
JOIN ancestors ON table1.id = ancestors.parent_id
)
SELECT *
FROM ancestors;
在這個示例中,CTE的名稱是ancestors,定義了兩個查詢,第一個查詢用于查找開始節(jié)點,第二個查詢用于查找節(jié)點的所有祖先,使用JOIN將所有祖先連接在一起。
4.2 GROUP BY語句擴展
SQL:1999標準引入了在線分析處理(OLAP)功能,這包括在準備業(yè)務報告時使用的功能。其中,GROUP BY語句進一步擴展了ROLLUP、CUBE和GROUPING SETS等聚合操作,這些聚合操作非常有用。
以下是SQL:1999中使用GROUP BY擴展操作的一個示例。
首先,我們創(chuàng)建一個名為sales_table的表,該表包含了銷售數(shù)據:
CREATE TABLE sales_table (
region VARCHAR(50),
product VARCHAR(50),
sales INT
);
接下來,我們在sales_table表中插入一些示例數(shù)據:
INSERT INTO sales_table (region, product, sales) VALUES ('North', 'Product A', 100);
INSERT INTO sales_table (region, product, sales) VALUES ('South', 'Product B', 200);
INSERT INTO sales_table (region, product, sales) VALUES ('East', 'Product C', 300);
INSERT INTO sales_table (region, product, sales) VALUES ('West', 'Product D', 400);
INSERT INTO sales_table (region, product, sales) VALUES ('North', 'Product B', 500);
INSERT INTO sales_table (region, product, sales) VALUES ('South', 'Product C', 600);
INSERT INTO sales_table (region, product, sales) VALUES ('East', 'Product D', 700);
INSERT INTO sales_table (region, product, sales) VALUES ('West', 'Product A', 800);
現(xiàn)在,我們可以使用GROUP BY的擴展操作來查詢sales_table表中的數(shù)據。
- 使用ROLLUP操作
ROLLUP操作可以生成分層匯總報告,以便分析數(shù)據的不同維度,例如時間、地區(qū)、產品等。以下是一個ROLLUP操作的示例,該示例計算了不同地區(qū)和產品的銷售總額:
SELECT region, product, SUM(sales) AS total_sales
FROM sales_table
GROUP BY ROLLUP(region, product);
- 使用CUBE操作
CUBE操作是ROLLUP的變種,可以生成組合式的匯總報告,可以對所有可能的組合進行聚合操作。以下是一個CUBE操作的示例,該示例計算了不同地區(qū)和產品的銷售總額,但是不僅限于特定組合:
SELECT region, product, SUM(sales) AS total_sales
FROM sales_table
GROUP BY CUBE(region, product);
- 使用GROUPING SETS操作
GROUPING SETS操作類似于CUBE操作,但它僅生成指定的匯總組合。以下是一個GROUPING SETS操作的示例,該示例計算了不同地區(qū)和產品的銷售總額,但僅限于特定的地區(qū)組合:
SELECT region, product, SUM(sales) AS total_sales
FROM sales_table
GROUP BY GROUPING SETS((region), (region, product));
以上就是SQL:1999中使用GROUP BY擴展操作的一些例子,這些擴展操作提供了更好的靈活性,以實現(xiàn)復雜的匯總報告需求。
5. SQL:2003
全稱是“ISO/IEC 9075:2003”,是SQL標準的重要更新版本。它于2003年發(fā)布,是SQL:1999之后的更新版本,旨在進一步完善SQL的功能和語法。
其最重要的新增功能是OLAP 功能擴展,支持窗口函數(shù),這些函數(shù)大大簡化了對多維數(shù)據集進行復雜分析和匯總的過程。
窗口函數(shù)
以下是QL:2003中使用窗口函數(shù)操作的一個示例。
建表SQL:
CREATE TABLE sales (
region VARCHAR(20),
country VARCHAR(20),
city VARCHAR(20),
year INTEGER,
month INTEGER,
amount DECIMAL(10,2)
);
插入數(shù)據SQL:
INSERT INTO sales VALUES ('North America', 'USA', 'New York', 2020, 1, 1000.00);
INSERT INTO sales VALUES ('North America', 'USA', 'New York', 2020, 2, 1500.00);
INSERT INTO sales VALUES ('North America', 'USA', 'Los Angeles', 2020, 1, 2000.00);
INSERT INTO sales VALUES ('North America', 'USA', 'Los Angeles', 2020, 2, 2500.00);
INSERT INTO sales VALUES ('North America', 'Canada', 'Toronto', 2020, 1, 3000.00);
INSERT INTO sales VALUES ('North America', 'Canada', 'Toronto', 2020, 2, 3500.00);
INSERT INTO sales VALUES ('Europe', 'UK', 'London', 2020, 1, 4000.00);
INSERT INTO sales VALUES ('Europe', 'UK', 'London', 2020, 2, 4500.00);
INSERT INTO sales VALUES ('Europe', 'France', 'Paris', 2020, 1, 5000.00);
INSERT INTO sales VALUES ('Europe', 'France', 'Paris', 2020, 2, 5500.00);
查詢SQL:
SELECT
region,
country,
city,
year,
month,
amount,
SUM(amount) OVER (PARTITION BY region, country ORDER BY year, month) AS running_total
FROM sales;
這個SQL語句計算了每個區(qū)域、國家、城市、年份、月份的銷售總額,并且計算了每個區(qū)域、國家的銷售總額隨時間的變化(running_total)。
輸出結果:
region | country | city | year | month | amount | running_total
----------------+----------+-------------+------+-------+----------+---------------
North America | USA | New York | 2020 | 1 | 1000.00 | 1000.00
North America | USA | New York | 2020 | 2 | 1500.00 | 2500.00
North America | USA | Los Angeles | 2020 | 1 | 2000.00 | 2000.00
North America | USA | Los Angeles | 2020 | 2 | 2500.00 | 4500.00
North America | Canada | Toronto | 2020 | 1 | 3000.00 | 3000.00
North America | Canada | Toronto | 2020 | 2 | 3500.00 | 6500.00
Europe | UK | London | 2020 | 1 | 4000.00 | 4000.00
Europe | UK | London | 2020 | 2 | 4500.00 | 8500.00
Europe | France | Paris | 2020 | 1 | 5000.00 | 5000.00
Europe | France | Paris | 2020 | 2 | 5500.00 | 10500.00
以上代碼演示了窗口函數(shù)的使用,特別是“SUM(amount) OVER”,它使用“PARTITION BY”分割結果集,根據銷售區(qū)域和國家分組,并按年月排序計算銷售總額;“ORDER BY”指定聚合的順序。
6. SQL:2006
SQL:2006全稱是“ISO/IEC 9075:2006”。
SQL:2003引入了與XML相關的函數(shù),允許數(shù)據庫和XML技術之間的互操作。SQL:2006 定義了 SQL 操作 XML 的方式。
支持XML
以下是一個示例SQL腳本,用于創(chuàng)建一個表、插入XML數(shù)據并從中提取信息:
-- 創(chuàng)建一個 XML 類型表
CREATE TABLE book_table (
id NUMBER PRIMARY KEY,
title VARCHAR2(100),
authors XMLTYPE,
publication_date DATE,
price NUMBER
);
-- 向表中插入一條XML數(shù)據
INSERT INTO book_table VALUES (
1,
'XML Programming',
XMLTYPE('<authors><author>Jane Doe</author><author>John Smith</author></authors>'),
TO_DATE('2021-06-10', 'YYYY-MM-DD'),
99.99
);
-- 從表中獲取XML數(shù)據,并從中提取信息
SELECT
id,
title,
extractvalue(authors, '/authors/author[1]') AS author1, -- 提取第一個作者
extractvalue(authors, '/authors/author[2]') AS author2, -- 提取第二個作者
publication_date,
price
FROM
book_table;
在這個例子中,我們首先創(chuàng)建了一個名為 book_table
的表,它包含了 id
、title
、authors
、publication_date
和 price
字段。其中 authors
字段使用 XMLType
類型來存儲一個XML類型的數(shù)據,它包含了一組作者信息。
接著,我們向表中插入了一條數(shù)據,其中包含了XML類型的作者信息。
查詢中,我們使用了 extractvalue
函數(shù)從 authors
字段中提取 XML 數(shù)據。extractvalue
函數(shù)需要兩個參數(shù):第一個是要提取的 XML 字符串,第二個是 XPath 表達式。在我們的查詢中,我們使用 XPath 表達式 /authors/author[n]
提取作者信息,其中 n
是第幾個作者的編號。注意,XPath 表達式中的索引從 1 開始,而不是從 0 開始。
通過對XML 的支持,使得 SQL 更加靈活和適應多樣化的數(shù)據處理需求。
7. SQL:2008
SQL:2008新增了很多功能,下面是部分新增的功能及SQL說明例子。
7.1. 增強了MERGE和DIAGNOSTIC語句
MERGE語句用于將INSERT、UPDATE和DELETE操作組合成單個語句,提高了數(shù)據操作的效率和靈活性。DIAGNOSTIC語句則用于存儲和返回SQL錯誤和警告信息,方便開發(fā)者進行調試。
-- MERGE語句
MERGE INTO Sales AS target
USING (SELECT product_id, SUM(amount) AS total_sales
FROM SalesDetail
GROUP BY product_id) AS source (product_id, total_sales)
ON (target.product_id = source.product_id)
WHEN MATCHED THEN
UPDATE SET total_sales = source.total_sales
WHEN NOT MATCHED THEN
INSERT (product_id, total_sales)
VALUES (source.product_id, source.total_sales);
-- DIAGNOSTIC語句
BEGIN
UPDATE Sales SET amount_sold = amount_sold + 1 WHERE product_id = 'P1';
EXCEPTION
WHEN OTHERS THEN
GET DIAGNOSTICS @error_num = DB2_RETURNED_SQLCODE,
@error_msg = MESSAGE_TEXT;
RAISE NOTICE 'Error Code: %, Error Message: %', @error_num, @error_msg;
END;
7.2. 引入了TRUNCATE TABLE語句
TRUNCATE TABLE語句可以更快速地清空表數(shù)據,比DELETE語句效率更高。
TRUNCATE TABLE SalesDetail;
7.3. CASE表達式支持逗號分隔的WHEN子句
逗號分隔的WHEN子句可以讓CASE表達式更加靈活,方便開發(fā)者進行條件判斷。
SELECT CASE
WHEN amount > 1000 THEN 'High'
WHEN amount > 500 THEN 'Medium'
ELSE 'Low'
END AS sales_level
FROM Sales;
7.4. 引入了INSTEAD OF觸發(fā)器
INSTEAD OF觸發(fā)器可以在執(zhí)行DML操作前觸發(fā)一些自定義邏輯,更好地控制數(shù)據操作。
CREATE TRIGGER instead_of_insert_sales_detail
INSTEAD OF INSERT ON SalesDetail
FOR EACH ROW
BEGIN
IF NEW.amount > 0 THEN
INSERT INTO SalesDetail (product_id, amount)
VALUES (NEW.product_id, NEW.amount);
END IF;
END;
7.5. 支持JOIN分區(qū)表
JOIN分區(qū)表可以更好地管理分區(qū)表的數(shù)據,提高了數(shù)據查詢和管理的效率。
SELECT *
FROM Sales s
JOIN SalesDetail sd ON s.id = sd.sales_id
WHERE s.date BETWEEN '2021-01-01' AND '2021-01-31';
7.6. 引入了FETCH子句
FETCH子句可以更加精確地控制數(shù)據檢索結果,同時提升檢索性能。
SELECT *
FROM Sales
ORDER BY date DESC
FETCH FIRST 10 ROWS ONLY;
7.7. 允許在游標定義之外使用ORDER BY
允許在游標定義之外使用ORDER BY,提供更加靈活的數(shù)據排序功能。
-- 游標定義
DECLARE cur_sales CURSOR FOR
SELECT *
FROM Sales;
-- 在游標之外使用ORDER BY
SELECT *
FROM Sales
ORDER BY date DESC;
7.8. 支持各種XQuery正則表達式/模式匹配
XQuery正則表達式/模式匹配可以更好地處理復雜的數(shù)據匹配需求。
SELECT *
FROM Sales
WHERE XMLCAST(XMLQUERY('$d/address' PASSING customer_doc AS "d") AS VARCHAR(200))
LIKE '%CA%';
9. 派生字段名增強
派生字段名增強可以提供更加靈活的數(shù)據處理和分析能力。
SELECT product_id, amount, amount * price AS total_price
FROM SalesDetail;
8. SQL:2011
SQL:2011全稱是"ISO/IEC 9075:2011", 最主要的新功能之一是增強了對時態(tài)數(shù)據庫的支持,并對MERGE語句、窗口函數(shù)和FETCH子句等進行了一些改進。
下面是SQL代碼,下面是部分新增的功能及SQL說明例子。
8.1. DELETE IN MERGE(在合并語句中使用刪除)
DELETE IN MERGE語句可以同時執(zhí)行合并操作和刪除操作。下面的示例使用了一個名為emp(員工)的表格和另一個名為emp_old(舊員工)的表格,其中emp_old表格的記錄需要從emp表格中刪除。
MERGE INTO emp USING emp_old
ON emp.emp_id=emp_old.emp_id
WHEN MATCHED THEN DELETE;
上面代碼中,MERGE INTO語句將emp_old表格中的記錄合并到了emp表格中,當兩個表格中的emp_id字段匹配時,將在emp表格中刪除記錄。
8.2. Pipeline DML(管道DML)
Pipeline DML是一種在客戶端和服務器之間直接傳輸數(shù)據的方法,此方法可以更快地執(zhí)行數(shù)據操作并減少對網絡的依賴。下面的示例使用了PIPELINED關鍵字。
CREATE OR REPLACE FUNCTION process_emp_data (lname VARCHAR2)
RETURN emp_type_table PIPELINED
IS
emp_data emp%ROWTYPE;
CURSOR c_emp_data IS
SELECT * FROM emp WHERE last_name = lname;
BEGIN
OPEN c_emp_data;
LOOP
FETCH c_emp_data INTO emp_data;
EXIT WHEN c_emp_data%NOTFOUND;
... --對記錄進行處理
PIPE ROW(emp_data);
END LOOP;
CLOSE c_emp_data;
RETURN;
END;
上面代碼中,我們定義了一個名為process_emp_data的函數(shù),它可以按姓名(lname)返回emp表格中所有的記錄。這個函數(shù)是PIPELINED的,這表示函數(shù)將返回多行記錄,這些記錄將被直接傳輸?shù)娇蛻舳硕皇窃诜掌鞫松梢粋€臨時表格。
8.3. Limited Fetch Capability(有限的提取能力)
LIMITED FETCH語句可以限制在查詢中返回的行數(shù)。下面的示例僅返回第一行記錄。
SELECT * FROM emp FETCH FIRST ROW ONLY;
上面代碼中,F(xiàn)ETCH FIRST ROW ONLY語句告訴數(shù)據庫在查詢中只返回第一行記錄。如果我們想要查詢前10行記錄,可以像下面這樣寫:
SELECT * FROM emp FETCH FIRST 10 ROWS ONLY;
上面代碼中,F(xiàn)ETCH子句指定了要返回的前10行記錄。
8.4. 窗口函數(shù)增強
8.4.1. LAG和LEAD函數(shù)
LAG和LEAD函數(shù)是SQL:2011中新增的窗口函數(shù),用于訪問當前行之前或之后的行的數(shù)據。
SELECT employee_id, last_name, salary, LAG(salary) OVER (ORDER BY salary) AS prev_salary,
LEAD(salary) OVER (ORDER BY salary) AS next_salary FROM employees;
上面代碼中,我們使用了LAG和LEAD函數(shù)來獲取當前員工的薪資及其前一個和后一個員工的薪資。我們使用了ORDER BY語句來按照薪資從低到高排序。
8.4.2. Navigation within a window
SQL:2011還引入了Navigation within a window,它允許用戶在窗口內導航并進行計算。例如,我們可以使用ROW_NUMBER()函數(shù)來給每個員工分配一個數(shù)字,然后使用RANGE或ROWS子句指定窗口大小并識別一個員工的上下文。
SELECT employee_id, last_name, salary,
AVG(salary) OVER (ORDER BY ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary)) AS avg_salary
FROM employees;
上面代碼中,我們將每個員工按工資排序,并以每個部門為分組設置窗口。然后,我們使用AVG窗口函數(shù)來計算排名上下文中員工的平均工資。
9. SQL:2016
全稱是"ISO/IEC 9075:2016",增加了許多新特性,包括JSON支持、多種類型的表值函數(shù)、多列的基于匹配的搜索和分組集聚操作等特性。下面介紹其中的兩個新功能:JSON支持和表值函數(shù)。
9.1. JSON支持
在2010年代,JSON逐漸取代XML成為常見的數(shù)據交換格式。現(xiàn)代互聯(lián)網應用程序使用JSON而不是XML作為它們的數(shù)據格式。越來越多的數(shù)據庫也開始支持JSON,例如文檔數(shù)據庫可以存儲JSON文件,鍵值存儲可以兼容JSON格式。
因此,SQL標準添加對JSON的支持,擴展了SQL的應用范圍,也使得SQL可以更好地與現(xiàn)代應用程序以及基于JSON的數(shù)據庫進行交互。這也讓SQL更具有靈活性和可擴展性,可以處理越來越復雜的數(shù)據結構。
SQL:2016新增了對JSON(JavaScript Object Notation)格式的查詢支持。它支持使用SQL語法處理JSON數(shù)據類型,這使得從JSON數(shù)據中讀取和查詢數(shù)據變得更加方便。
SELECT c.customer_id, JSON_VALUE(c.info, '$.address.city') AS city,
JSON_VALUE(c.info, '$.address.state') AS state FROM customers c;
在上面的例子中,我們使用了JSON_VALUE函數(shù)來查詢存儲在JSON格式中的客戶信息。我們指定了JSON路徑($ .address.city和$ .address.state),并將正確的值提取出來,作為城市和州的名稱。
9.2. 表值函數(shù)(Table-Valued Functions)
SQL:2016引入了表值函數(shù)的概念。它是一種特殊類型的存儲過程,可以生成一個表作為結果。
CREATE FUNCTION getEmployees(@deptId INT)
RETURNS TABLE AS RETURN
SELECT employee_id, first_name, last_name FROM employees WHERE department_id = @deptId;
在上面的例子中,我們創(chuàng)建了一個名為getEmployees的表值函數(shù)。該函數(shù)接受一個整數(shù)參數(shù),并返回一個包含指定部門中所有員工的表。
可以像查詢表一樣使用表值函數(shù),例如:
SELECT * FROM getEmployees(10);
上面的查詢將返回部門號為10的員工信息。這樣的表值函數(shù)可以在作為子查詢或聯(lián)接的一部分使用,讓查詢更加靈活和高效。
10. SQL:2019
SQL:2019全稱是"ISO/IEC 9075:2019",SQL:2019于2019年11月由國際標準化組織(ISO)和國際電工委員會(IEC)聯(lián)合發(fā)布,是自2016年SQL:2016標準以來的第一次更新。
- 樹形結構數(shù)據:SQL:2019標準支持使用標準的SQL語句處理和查詢樹形結構數(shù)據,例如組織結構、目錄和分類等。
- 增強的空間數(shù)據支持:SQL:2019標準引入了用于存儲和查詢空間數(shù)據(如地理位置數(shù)據)的新數(shù)據類型、函數(shù)和操作符。
- 字符集擴展:SQL:2019標準引入了對日文和韓文等字符集的擴展支持。
- 新的分析功能:SQL:2019標準添加了新的分析功能,例如累積分布函數(shù)、指數(shù)平滑等。
- 改進的JSON支持:SQL:2019標準在前一版本的JSON支持基礎上進行改進,包括更多的功能和更規(guī)范的語法。
此外,SQL:2019標準還修復了一些早期版本的漏洞和不一致性,提高了數(shù)據庫的安全性和可靠性。
多維數(shù)組(SQL/MDA)
該標準引入了一些新的功能和改進,其中最顯著的是多維數(shù)組(SQL/MDA)支持。多維數(shù)組是一個在行和列之外添加一個指定數(shù)量的維度的數(shù)據結構,通常在數(shù)據倉庫和數(shù)據分析中使用。SQL/MDA的引入使SQL可以更有效地處理多維數(shù)據,例如:網絡數(shù)據、傳感器數(shù)據、圖像和視頻數(shù)據等。
- 創(chuàng)建多維數(shù)組
在SQL:2019標準中,可以使用以下語法創(chuàng)建多維數(shù)組:
CREATE ARRAY <array name> [ <array specification> ]
例如,以下SQL代碼創(chuàng)建一個具有三個維度的數(shù)組:
CREATE ARRAY my_array [3, 4, 5];
- 插入數(shù)組數(shù)據
使用以下語法向數(shù)組中插入數(shù)據:
INSERT INTO <array name> [(<dimension list>)] VALUES (<value list>)
例如,以下SQL代碼插入了一些數(shù)據到多維數(shù)組中:
INSERT INTO my_array[2, 3, 4] VALUES ('Test data');
3.查詢數(shù)組數(shù)據
使用以下語法查詢數(shù)組中的數(shù)據:
SELECT <expression> FROM <array name> [(<dimension specification>)]
例如,以下SQL代碼查詢了my_array中第三個維度所有為4的數(shù)據:
SELECT * FROM my_array[ , , 4];
SQL:2019新功能-多維數(shù)組的引入擴展了SQL在數(shù)據分析和處理上的功能,使得SQL在處理更加復雜和多維數(shù)據結構時更加高效和靈活。文章來源:http://www.zghlxwxcb.cn/news/detail-449665.html
總結
SQL標準是一系列定義了關系型數(shù)據庫管理系統(tǒng)所應遵循的規(guī)范和標準,包括SQL-86、SQL-89、SQL-92、SQL:1999、SQL:2003、SQL:2008、SQL:2011、SQL:2016和SQL:2019等多個版本。其重點是提供一種統(tǒng)一的語言,用于在關系型數(shù)據庫中訪問和操作數(shù)據。SQL標準包括數(shù)據定義、數(shù)據操作、數(shù)據查詢、數(shù)據控制和事務管理等方面內容,以及定義了一系列的數(shù)據類型、函數(shù)、操作符等各種元素,這些元素能夠在不同的實現(xiàn)中進行通用性的應用。SQL標準的實現(xiàn)是不同的數(shù)據庫管理系統(tǒng)的重要基礎,也是數(shù)據處理的重要工具之一。文章來源地址http://www.zghlxwxcb.cn/news/detail-449665.html
參考
https://learnsql.com/blog/history-of-sql-standards/
https://blog.ansi.org/2018/10/sql-standard-iso-iec-9075-2016-ansi-x3-135/
https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/Oracle-and-Standard-SQL.html
https://www.wiscorp.com/SQLStandards.html
https://sigmodrecord.org/publications/sigmodRecord/1209/pdfs/07.industry.kulkarni.pdf
https://crate.io/docs/sql-99/en/latest//index.html
https://modern-sql.com/blog/2017-06/whats-new-in-sql-2016
https://zhuanlan.zhihu.com/p/110882130
http://peter.eisentraut.org/blog/2023/04/04/sql-2023-is-finished-here-is-whats-new
到了這里,關于SQL全方位攻略:3.SQL標準的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!