国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SQL全方位攻略:3.SQL標準

這篇具有很好參考價值的文章主要介紹了SQL全方位攻略:3.SQL標準。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

系列文章目錄

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ù)據。

  1. 使用ROLLUP操作

ROLLUP操作可以生成分層匯總報告,以便分析數(shù)據的不同維度,例如時間、地區(qū)、產品等。以下是一個ROLLUP操作的示例,該示例計算了不同地區(qū)和產品的銷售總額:

SELECT region, product, SUM(sales) AS total_sales
FROM sales_table
GROUP BY ROLLUP(region, product);
  1. 使用CUBE操作

CUBE操作是ROLLUP的變種,可以生成組合式的匯總報告,可以對所有可能的組合進行聚合操作。以下是一個CUBE操作的示例,該示例計算了不同地區(qū)和產品的銷售總額,但是不僅限于特定組合:

SELECT region, product, SUM(sales) AS total_sales
FROM sales_table
GROUP BY CUBE(region, product);
  1. 使用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、titleauthors、publication_dateprice 字段。其中 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ù)據等。

  1. 創(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];
  1. 插入數(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ù)據結構時更加高效和靈活。

總結

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模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 全方位解析 pinia

    全方位解析 pinia

    前言 Vue3已經推出很長時間了,它周邊的生態(tài)也是越來越完善了。之前我們使用Vue2的時候,Vuex可以說是必備的,它作為一個狀態(tài)管理工具,給我們帶來了極大的方便。Vue3推出后,雖然相對于Vue2很多東西都變了,但是核心的東西還是沒有變的,比如說狀態(tài)管理、路由等等。再

    2024年04月25日
    瀏覽(17)
  • Kotlin全方位-簡單解析

    Kotlin是一種現(xiàn)代化的靜態(tài)類型編程語言,由JetBrains公司開發(fā)。它可以在Java虛擬機(JVM)上運行,并且可以與Java代碼無縫地進行互操作。Kotlin旨在提供更簡潔、更安全、更具表達力和更高效的編程語言。 Android開發(fā):Kotlin被廣泛用于Android應用程序的開發(fā)。它可以與Java代碼互操

    2024年02月10日
    瀏覽(23)
  • Java——線程睡眠全方位解析

    Java——線程睡眠全方位解析

    在 Java 中,讓線程休眠的方法有很多,這些方法大致可以分為兩類,一類是設置時間,在一段時間后自動喚醒,而另一個類是提供了一對休眠和喚醒的方法,在線程休眠之后,可以在任意時間對線程進行喚醒。 線程睡眠的方法有以下 5 個: Thread.sleep TimeUnit wait Condition LockSu

    2024年02月04日
    瀏覽(16)
  • kafka知識點全方位講解

    kafka知識點全方位講解

    Apache Kafka是一個開源消息系統(tǒng),由Scala寫成。是由Apache軟件基金會開發(fā)的一個開源消息系統(tǒng)項目。 Kafka最初是由LinkedIn開發(fā),并于2011年初開源。2012年10月從Apache Incubator畢業(yè)。該項目的目標是為處理實時數(shù)據提供一個統(tǒng)一、高通量、低等待的平臺。 Kafka是一個分布式消息隊列:

    2023年04月25日
    瀏覽(25)
  • 精彩解讀:短鏈接應用全方位探究

    精彩解讀:短鏈接應用全方位探究

    1. 短鏈接的定義和原理 短鏈接是一種將長網址轉換為短網址的服務,通過簡化網址長度,方便用戶分享和傳播鏈接。短鏈接服務通過將長網址映射到短標識符的方式,實現(xiàn)對原始網址的壓縮和簡化。用戶在訪問短鏈接時,系統(tǒng)會將短鏈接還原為原始長網址,實現(xiàn)跳轉到目標網

    2024年04月08日
    瀏覽(27)
  • ?前端進階:SEO 全方位解決方案

    ?前端進階:SEO 全方位解決方案

    SEO 代表搜尋引擎最佳化/搜尋引擎優(yōu)化(英文全名Search Engine Optimization,簡稱SEO),是指通過了解搜尋引擎的自然排名的算法邏輯,以提高目標網站在有關搜尋引擎內排名的方式。 網站的 SEO 至關重要,它可以讓你的網站獲得更好的排名和流量,從而提高網站知名度。對于一些盈

    2024年02月09日
    瀏覽(18)
  • 全方位了解VR全景展示與制作

    全方位了解VR全景展示與制作

    引言: 虛擬現(xiàn)實(VR)技術正在以驚人的速度改變我們的生活方式和體驗方式。其中,VR全景展示與制作作為虛擬現(xiàn)實的重要應用之一,為用戶提供了身臨其境的視聽體驗。 ?一、了解VR全景展示與制作 1.VR全景展示 VR全景展示是一種通過虛擬現(xiàn)實技術,將用戶帶入真實或虛構

    2024年02月13日
    瀏覽(26)
  • Android Jetpack組件的全方位分析

    Jetpack是一個用于簡化Android應用程序開發(fā)的工具包,包含了一系列的組件和工具。Jetpack包含了很多組件,如LiveData、ViewModel、Room、Data Binding、Navigation等。 Jetpack組件是一種更高級別的抽象,它們可以提供更簡潔、更易于使用的API。支持庫是Jetpack組件的底層實現(xiàn)。 基本概念和

    2024年02月11日
    瀏覽(22)
  • 全方位對比 Postgres 和 MySQL(2023 版)

    全方位對比 Postgres 和 MySQL(2023 版)

    根據 2023 年的 Stack Overflow 調研 (https://survey.stackoverflow.co/2023/) ,Postgres 已經取代 MySQL 成為最受敬仰和渴望 (the most admired, desired) 的數(shù)據庫。 ? ? 隨著 Postgres 的發(fā)展勢頭愈發(fā)強勁,在 Postgres 和 MySQL 之間做選擇變得更難了。 ? 如果看安裝數(shù)量,MySQL 可能仍是全球最大的開源數(shù)

    2024年02月13日
    瀏覽(28)
  • 全方位對比 Postgres 和 MongoDB (2023 版)

    全方位對比 Postgres 和 MongoDB (2023 版)

    本文為「數(shù)據庫全方位對比系列」第二篇,該系列的首部作品為「全方位對比 Postgres 和 MySQL (2023 版)」 根據 2023 年 Stack Overflow 調研,Postgres 已經成為最受歡迎和渴望的數(shù)據庫了。 MongoDB 曾連續(xù) 4 年 (2017 - 2020) 蟬聯(lián)此頭銜。根據 DB-Engines 排名,Postgres 和 MongoDB 都是排名前 5 的

    2024年02月15日
    瀏覽(62)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包