柚子快報激活碼778899分享:數(shù)據(jù)庫 mysql語法大全
柚子快報激活碼778899分享:數(shù)據(jù)庫 mysql語法大全
首先來一個全局總覽,后面我會分別對每個命令進(jìn)行說明: 如果你的mysql導(dǎo)入環(huán)境變量,可以在命令行輸入:
mysql -u root -p
然后輸入密碼登錄數(shù)據(jù)庫 否則,打開mysql command line并輸入密碼進(jìn)入數(shù)據(jù)庫
mysql數(shù)據(jù)類型
MySQL支持多種數(shù)據(jù)類型,包括數(shù)值類型、日期和時間類型、字符串類型、二進(jìn)制類型等。下面是MySQL中常用的數(shù)據(jù)類型:
數(shù)值類型: INT:整數(shù)類型,常用于存儲整數(shù)數(shù)據(jù)。 FLOAT:單精度浮點(diǎn)數(shù)類型,用于存儲小數(shù)數(shù)據(jù)。 DOUBLE:雙精度浮點(diǎn)數(shù)類型,用于存儲大數(shù)數(shù)據(jù)。 DECIMAL:定點(diǎn)數(shù)類型,用于存儲精確的小數(shù)數(shù)據(jù),通常用于財務(wù)計算。
日期和時間類型: DATE:日期類型,格式為’YYYY-MM-DD’。 TIME:時間類型,格式為’HH:MM:SS’。 DATETIME:日期時間類型,格式為’YYYY-MM-DD HH:MM:SS’。 TIMESTAMP:時間戳類型,表示從1970年1月1日以來的秒數(shù)。
字符串類型: CHAR:固定長度字符串類型,最多255個字符。 VARCHAR:可變長度字符串類型,最多65535個字符。 TEXT:長文本類型,最多65535個字符。 ENUM:枚舉類型,允許從預(yù)定義的值列表中選擇一個值。 SET:集合類型,允許從預(yù)定義的值集合中選擇一個或多個值。
二進(jìn)制類型: BINARY:固定長度的二進(jìn)制字符串類型。 VARBINARY:可變長度的二進(jìn)制字符串類型。 BLOB:二進(jìn)制大對象類型,用于存儲大塊二進(jìn)制數(shù)據(jù)。
其他類型: BOOL:布爾類型,可以存儲True或False。 JSON:JSON數(shù)據(jù)類型,用于存儲JSON格式的數(shù)據(jù)。
一,基礎(chǔ)數(shù)據(jù)庫操作
1.創(chuàng)建數(shù)據(jù)庫
create database my_database;
2.查詢數(shù)據(jù)庫
show databases;
3.刪除數(shù)據(jù)庫
drop database my_databases;
4.選擇數(shù)據(jù)庫
use my_database;
5.查詢數(shù)據(jù)表
show tables;
6.創(chuàng)建數(shù)據(jù)表
create table student(id int,name char(10),age int,sex char(5));
7.查詢表結(jié)構(gòu)
desc student;
8.刪除表
drop table student;
9.數(shù)據(jù)表添加列
alter table student add height int(10);
10.數(shù)據(jù)表刪除列
alter table student drop height;
11.數(shù)據(jù)列改名
alter table student change column height high int(3);
12.數(shù)據(jù)列修改數(shù)據(jù)類型
alter table student modify column high char(10);
13.修改表名
alter table student rename to student_table;
14.插入數(shù)據(jù)項
insert into student(id,name,age,sex,high) value (001,"張三",10,"男",160);
15.刪除數(shù)據(jù)項
delete from student where high=140;
16.更新數(shù)據(jù)項
update student set age=12;
二,邏輯運(yùn)算符
between 最小值 and 最大值 語法:select * from 表名 where 列名 between 最小值 and 最大值;
select * from student where id between 2 and 5;
作用和使用><是一樣的
select * from student where id>2 and id<5;
2.null 語法:select * from 表名 where 列名 is null;(判斷這一列有空值)
select * from student where high is null;
in (取值范圍) 語法:select * from 表名 where 列名 in (值1,值2,…)
select * from student where age in(9,12);
like 好像 通配符: % 代表任意字符 _ 一個下劃線代替一個字符 語法:select * from 表名 where 列名 like ‘通配符 特征 通配符’;
select * from student where name like '張_';
具體參考:mysql的like語句 5.as 為表名稱或者列名稱指定別名
select id as student_id from student where name like '張_';
6.union 合并兩個或多個select語句結(jié)果集
select id from student as st where st.name like '張_' union select name from student where age=9;
三,排序
關(guān)鍵詞 order by 排序規(guī)則:升序排序 asc (默認(rèn)可省略) 降序排序 desc 語法: 單列 select * from 表名 order by 列名 asc或者 desc; 多列 select * from 表名 order by 列名 asc或者 desc,列名2 asc或者desc,…;
select * from student order by age asc,name desc;
四,去重
GROUP BY 和 DISTINCT 都是用于從數(shù)據(jù)庫中選擇唯一值的 SQL 子句 兩者的不同請參考:mysql的distinct和group by的區(qū)別
select distinct age from student;
select age,count(*) from student group by age;
五,統(tǒng)計函數(shù)
語法:select 統(tǒng)計函數(shù)(列名),統(tǒng)計函數(shù)(列名2)… from 表名; MySQL中的統(tǒng)計函數(shù),也叫聚合函數(shù),用于在查詢中執(zhí)行聚合操作,例如計算總和、平均值、最大值、最小值等。下面是MySQL中常用的聚合函數(shù)及其解釋:
COUNT:計算指定列或表達(dá)式的行數(shù),可以用于統(tǒng)計記錄數(shù)量。 例如:SELECT COUNT(*) FROM table_name; 將返回表中的記錄數(shù)。
SUM:計算指定列或表達(dá)式的總和。 例如:SELECT SUM(salary) FROM employees; 將返回 employees 表中 salary 列的總和。
AVG:計算指定列或表達(dá)式的平均值。 例如:SELECT AVG(age) FROM students; 將返回 students 表中 age 列的平均值。
MAX:返回指定列或表達(dá)式的最大值。 例如:SELECT MAX(price) FROM products; 將返回 products 表中 price 列的最大值。
MIN:返回指定列或表達(dá)式的最小值。 例如:SELECT MIN(quantity) FROM inventory; 將返回 inventory 表中 quantity 列的最小值。
這些聚合函數(shù)可以與其他SQL語句結(jié)合使用,如WHERE子句用于篩選特定條件的行,GROUP BY子句用于按列進(jìn)行分組,并可用于計算每個組的聚合值,ORDER BY子句用于對結(jié)果進(jìn)行排序等。
需要注意的是,聚合函數(shù)通常會生成單個結(jié)果值,并且如果沒有GROUP BY子句,它們將作用于整個結(jié)果集。而在有GROUP BY子句的情況下,聚合函數(shù)將根據(jù)分組進(jìn)行計算,生成每個組的聚合結(jié)果。
此外,還可以使用HAVING子句對分組后的結(jié)果進(jìn)行進(jìn)一步的篩選,類似于WHERE子句對原始數(shù)據(jù)進(jìn)行篩選。通過使用這些聚合函數(shù),可以對數(shù)據(jù)進(jìn)行統(tǒng)計和匯總,從而得出有關(guān)數(shù)據(jù)集的有用信息。 1.count(列名) 統(tǒng)計這一列的非空總行數(shù)
select id,count(*) from student group by id;
2.sum(列名) 統(tǒng)計這一列的總和
select sum(id) from student;
3.avg(列名) 統(tǒng)計這一列的平均值
select avg(id) from student;
4.max(列名) 統(tǒng)計這一列的最大值
select max(id) from student;
5.min(列名) 統(tǒng)計這一列的最小值
select min(id) from student;
6.array_agg 在MySQL中,ARRAY_AGG函數(shù)用于將一列的值聚合為一個數(shù)組。它接受一個表達(dá)式作為輸入,并返回一個包含該表達(dá)式的所有值的數(shù)組。
ARRAY_AGG函數(shù)在MySQL 8.0版本中引入,對于需要將多個行的值合并為一個數(shù)組的情況非常有用。它常用于與GROUP BY子句一起使用,以便在分組的結(jié)果中生成聚合數(shù)組。
ARRAY_AGG(expression)
其中:
expression:要聚合為數(shù)組的表達(dá)式或列。
假設(shè)有一個名為orders的表,包含以下列:order_id、customer_id和product_name。我們希望按customer_id分組,并將每個客戶的所有訂單產(chǎn)品名稱聚合到一個數(shù)組中。
SELECT customer_id, ARRAY_AGG(product_name) AS ordered_products
FROM orders
GROUP BY customer_id;
上面的查詢將返回每個客戶的customer_id和一個包含他們所有訂單產(chǎn)品名稱的數(shù)組。
需要注意的是,ARRAY_AGG函數(shù)只在MySQL 8.0及更高版本中可用。如果MySQL版本較舊,可能無法使用該函數(shù)。在較舊的版本中,可以考慮使用GROUP_CONCAT函數(shù)來實(shí)現(xiàn)類似的功能,它將多個值連接為一個字符串。
SELECT customer_id, GROUP_CONCAT(product_name SEPARATOR ',') AS ordered_products
FROM orders
GROUP BY customer_id;
上述查詢將返回類似的結(jié)果,但是產(chǎn)品名稱將以逗號分隔的字符串形式呈現(xiàn)。
六,多表查詢
1. 查詢的數(shù)據(jù)來自于多張表—— 表連接
表連接有三種情況: 內(nèi)鏈接: inner join 外鏈接: 左外鏈接: left join 獲取左表所有記錄,即使右表沒有對應(yīng)匹配的記錄,則為空 右外鏈接: right join 獲取右表所有記錄,即使左表沒有對應(yīng)匹配的記錄,則為空
在 MySQL 中,JOIN 是一種用于將多個表中的數(shù)據(jù)組合在一起的操作。JOIN 通過在多個表之間比較一個或多個列的值來確定如何組合這些表中的數(shù)據(jù)。 INNER JOIN:INNER JOIN 返回所有在兩個表中都有匹配的行。它是默認(rèn)的 JOIN 類型,如果沒有指定 JOIN 類型,則使用 INNER JOIN。
LEFT JOIN(或 LEFT OUTER JOIN):LEFT JOIN 返回左表中所有的行,以及右表中所有匹配的行。如果右表中沒有匹配的行,則返回 NULL 值。
RIGHT JOIN(或 RIGHT OUTER JOIN):RIGHT JOIN 返回右表中所有的行,以及左表中所有匹配的行。如果左表中沒有匹配的行,則返回 NULL 值。
FULL JOIN(或 FULL OUTER JOIN):FULL JOIN 返回左表和右表中的所有行,并將沒有匹配的行設(shè)置為 NULL 值。
以下是在 MySQL 中使用 INNER JOIN 和 LEFT JOIN 的示例:
– INNER JOIN 示例
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.customer_id;
– LEFT JOIN 示例
SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
在上面的示例中,第一個查詢使用 INNER JOIN 將 orders 表和 customers 表組合在一起,并根據(jù)它們的 customer_id 列進(jìn)行匹配。第二個查詢使用 LEFT JOIN 將 customers 表和 orders 表組合在一起,并根據(jù)它們的 customer_id 列進(jìn)行匹配,返回所有的 customers 表中的行和與之匹配的 orders 表中的行。如果沒有匹配的行,則返回 NULL 值。
INNER JOIN 多表查詢
SELECT orders.order_id, customers.customer_name, products.product_name
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.customer_id
INNER JOIN products
ON orders.product_id = products.product_id;
在上面的示例中,INNER JOIN 用于連接三個表:orders、customers 和 products。通過連接 customer_id 和 product_id 列,我們可以獲取訂單、顧客名稱和產(chǎn)品名稱的數(shù)據(jù)。
LEFT JOIN 多表查詢
SELECT customers.customer_name, COUNT(orders.order_id)
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id
GROUP BY customers.customer_name;
在上面的示例中,LEFT JOIN 用于連接 customers 和 orders 表。通過連接 customer_id 列,我們可以獲取每個顧客名稱以及他們的訂單數(shù)量。由于使用了 LEFT JOIN,如果某個顧客沒有訂單,他們的訂單數(shù)量將顯示為零。
子查詢多表查詢 特征:一對 括號 把 查詢語句給包起來了,一個查詢語句里面 包含了另外一條或多條查詢語句
SELECT orders.order_id, orders.order_date, customers.customer_name
FROM orders
INNER JOIN (
SELECT customer_id, MAX(order_date) AS latest_order
FROM orders
GROUP BY customer_id
) AS latest_orders
ON orders.customer_id = latest_orders.customer_id
AND orders.order_date = latest_orders.latest_order
INNER JOIN customers
ON orders.customer_id = customers.customer_id;
在上面的示例中,子查詢用于獲取每個顧客的最新訂單日期。然后,INNER JOIN 用于連接 orders 表和 customers 表,并將訂單日期與最新訂單日期進(jìn)行比較,以獲取最新訂單的訂單號、訂單日期和顧客名稱。
2. 查詢的條件來自于同一張表—— 子查詢
MySQL的子查詢是指在一個查詢語句內(nèi)部嵌套另一個完整的查詢語句。子查詢通常用作外部查詢的條件、過濾器或計算字段的來源。它可以返回一個結(jié)果集,供外部查詢使用。 子查詢可以出現(xiàn)在SELECT、FROM、WHERE、HAVING和INSERT語句的各個部分。
還可以別名結(jié)合join使用: select * from 表名 as 別名1 join 表名 as 別名2 on 別名1.列名=別名2.列名;
SELECT子查詢:子查詢可以作為SELECT語句的一部分,用于在查詢結(jié)果中生成一個或多個列。例如:
SELECT column1, column2, (SELECT COUNT(*) FROM table2) AS count FROM table1;
在這個例子中,子查詢 (SELECT COUNT(*) FROM table2) 返回 table2 表中的行數(shù),并將其作為別名 count 的列添加到外部查詢的結(jié)果中。
FROM子查詢:子查詢可以作為FROM子句的一部分,用于在外部查詢中引用一個虛擬表。例如:
SELECT * FROM (SELECT column1, column2 FROM table1) AS subquery;
在這個例子中,子查詢 (SELECT column1, column2 FROM table1) 返回一個虛擬表,然后外部查詢可以使用這個虛擬表進(jìn)行進(jìn)一步的操作。
WHERE子查詢:子查詢可以作為WHERE子句的一部分,用于根據(jù)子查詢的結(jié)果過濾外部查詢的行。例如:
SELECT column1, column2 FROM table1 WHERE column1 IN (SELECT column1 FROM table2);
在這個例子中,子查詢 (SELECT column1 FROM table2) 返回一組值,然后外部查詢根據(jù)這些值過濾出符合條件的行。
子查詢使用當(dāng)前過濾條件:
SELECT
id,
COUNT(*) AS xxx,
max(SELECT song_title FROM online_song_onlinesongmodel AS o WHERE o.id = main.id) as bbb
FROM
online_song_onlinesongmodel AS main
WHERE
id LIKE '%3%'
GROUP BY
id;
在這個例子中,子查詢SELECT song_title FROM online_song_onlinesongmodel AS o WHERE o.id = main.id使用外部變量作為過濾條件,使用 o.id = main.id作為匹配條件。
HAVING子查詢:子查詢可以作為HAVING子句的一部分,用于根據(jù)子查詢的結(jié)果過濾外部查詢的行(通常與GROUP BY一起使用)。例如:
SELECT column1, COUNT(*) FROM table1 GROUP BY column1 HAVING COUNT(*) > (SELECT AVG(count) FROM table2);
在這個例子中,子查詢 (SELECT AVG(count) FROM table2) 返回一個平均值,然后外部查詢根據(jù)這個平均值過濾出滿足條件的行。
INSERT子查詢:子查詢可以作為INSERT語句的一部分,用于將子查詢的結(jié)果插入到目標(biāo)表中。例如:
INSERT INTO table1 (column1, column2) SELECT column1, column2 FROM table2;
在這個例子中,子查詢 (SELECT column1, column2 FROM table2) 返回一組值,并將其插入到 table1 表的相應(yīng)列中。 這些示例僅展示了子查詢的一些常見用法。MySQL的子查詢非常靈活,可以用于各種復(fù)雜的查詢和操作。需要注意的是,子查詢的性能可能受到影響,特別是在處理大量數(shù)據(jù)時。因此,在使用子查詢時,需要注意優(yōu)化查詢,確保獲得良好的性能。
七,索引
在 MySQL 中創(chuàng)建索引可以大大提高查詢效率,加快數(shù)據(jù)檢索速度,他的索引包含 普通索引和唯一索引,以及主鍵索引 具體參考:mysql索引
八,約束
SQL 約束用于規(guī)定表中的數(shù)據(jù)規(guī)則,如果存在違反約束的數(shù)據(jù)行為,行為會被約束終止。
約束可以在創(chuàng)建表時規(guī)定(通過 CREATE TABLE 語句),或者在表創(chuàng)建之后規(guī)定(通過 ALTER TABLE 語句)
CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
在 SQL 中,我們有如下約束:
主鍵約束(Primary Key Constraint):主鍵是用于標(biāo)識表中每行記錄的唯一標(biāo)識符。主鍵可以是一個或多個列組成,用于唯一標(biāo)識每一行。主鍵約束確保主鍵的值不為空并且唯一。
唯一約束(Unique Constraint):唯一約束確保一個或多個列中的每個值都是唯一的。與主鍵約束不同,唯一約束可以允許空值。
非空約束(Not Null Constraint):非空約束確保一個或多個列中的值不為空,即不允許 NULL 值。
外鍵約束(Foreign Key Constraint):外鍵約束用于定義兩個表之間的關(guān)系。外鍵約束可以確保一個表中的數(shù)據(jù)與另一個表中的數(shù)據(jù)相匹配,通常用于建立表之間的關(guān)聯(lián)關(guān)系。
檢查約束(Check Constraint):檢查約束用于定義列中允許的值的范圍或條件。例如,可以使用檢查約束確保一個列中的值不超過一定范圍。
創(chuàng)建包含主鍵約束和外鍵約束的表的示例:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
在上面的例子中,orders 表中的 order_id 列被定義為主鍵,customer_id 列定義為外鍵,關(guān)聯(lián)到 customers 表中的 customer_id 列。
可以使用ALTER TABLE語句來給MySQL數(shù)據(jù)表添加約束,以下是一些常用的約束類型及其示例:
主鍵約束: 主鍵是唯一標(biāo)識數(shù)據(jù)表中每個記錄的列或列組合,可以使用以下語句添加主鍵約束:
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
其中,table_name是數(shù)據(jù)表名稱,column_name是要設(shè)置為主鍵的列名。
唯一約束: 唯一約束用于確保數(shù)據(jù)表中的某個列或列組合中的值是唯一的??梢允褂靡韵抡Z句添加唯一約束:
ALTER TABLE table_name ADD UNIQUE (column_name);
其中,table_name是數(shù)據(jù)表名稱,column_name是要設(shè)置為唯一的列名。
外鍵約束: 外鍵約束用于確保數(shù)據(jù)表中的某個列或列組合的值與另一個表中的某個列或列組合的值相匹配??梢允褂靡韵抡Z句添加外鍵約束:
ALTER TABLE table_name ADD FOREIGN KEY (column_name) REFERENCES other_table_name (other_column_name);
其中,table_name是數(shù)據(jù)表名稱,column_name是要設(shè)置為外鍵的列名,other_table_name是關(guān)聯(lián)的其他表名稱,other_column_name是在其他表中要匹配的列名。
索引和約束的區(qū)別
MySQL中的索引和約束是兩個不同的概念,它們雖然都用于確保數(shù)據(jù)的完整性和提高查詢性能,但是具有不同的作用和實(shí)現(xiàn)方式。
索引(Index): 索引是一種數(shù)據(jù)結(jié)構(gòu),用于快速查找表中的數(shù)據(jù)。它可以幫助數(shù)據(jù)庫系統(tǒng)加快數(shù)據(jù)檢索的速度,特別是在大型數(shù)據(jù)表中。 MySQL支持多種類型的索引,包括普通索引、唯一索引、主鍵索引、全文索引等。 在表中創(chuàng)建索引可以提高查詢效率,但是索引也會占用額外的存儲空間,并在數(shù)據(jù)更新時增加額外的開銷。
約束(Constraint): 約束是一種規(guī)則,用于限制表中數(shù)據(jù)的值,以確保數(shù)據(jù)的完整性和一致性。它可以在插入或更新數(shù)據(jù)時自動執(zhí)行檢查。 MySQL支持多種類型的約束,包括主鍵約束、外鍵約束、唯一約束、默認(rèn)約束、非空約束等。 約束可以確保表中數(shù)據(jù)的一致性和正確性,防止插入無效的數(shù)據(jù),同時也可以在一定程度上提高數(shù)據(jù)的查詢效率。
雖然索引和約束都可以提高數(shù)據(jù)庫系統(tǒng)的性能和數(shù)據(jù)完整性,但是它們的作用和實(shí)現(xiàn)方式是不同的。索引主要用于加快數(shù)據(jù)檢索的速度,而約束主要用于限制數(shù)據(jù)的值,確保數(shù)據(jù)的完整性。在實(shí)際應(yīng)用中,通常會同時使用索引和約束來優(yōu)化數(shù)據(jù)庫設(shè)計和提高系統(tǒng)性能。
九,事務(wù)
MySQL 事務(wù)是一組操作的集合,這些操作被視為單個不可分割的工作單元,要么全部完成,要么全部不完成。事務(wù)通常用于保證數(shù)據(jù)庫操作的一致性和完整性,并且在處理高并發(fā)數(shù)據(jù)操作時非常有用。
在 MySQL 中,事務(wù)具有以下四個特性,通常被稱為 ACID 特性:
原子性(Atomicity):事務(wù)是一個不可分割的工作單元,事務(wù)中的所有操作要么全部完成,要么全部不完成。
一致性(Consistency):在事務(wù)開始和結(jié)束時,數(shù)據(jù)庫必須保持一致狀態(tài)。這意味著,在事務(wù)執(zhí)行之前和之后,所有相關(guān)的數(shù)據(jù)必須滿足所有預(yù)定義的規(guī)則。
隔離性(Isolation):每個事務(wù)必須與其他事務(wù)隔離,以避免數(shù)據(jù)損壞。隔離級別定義了多個事務(wù)可以訪問數(shù)據(jù)庫的方式。
持久性(Durability):一旦事務(wù)完成,它所做的更改必須永久保存在數(shù)據(jù)庫中,并且不應(yīng)該被回滾。
在 MySQL 中,可以使用 BEGIN、COMMIT 和 ROLLBACK 語句來控制事務(wù)。BEGIN 語句用于啟動事務(wù),COMMIT 語句用于提交事務(wù),而 ROLLBACK 語句用于撤消事務(wù)。例如,以下是在 MySQL 中使用事務(wù)的示例:
BEGIN; -- 開始事務(wù)
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT; -- 提交事務(wù)
在上面的示例中,BEGIN 語句用于啟動事務(wù),兩個 UPDATE 語句用于更新 accounts 表中的記錄,COMMIT 語句用于提交事務(wù)。如果其中一個 UPDATE 語句失敗,可以使用 ROLLBACK 語句來撤消整個事務(wù):
BEGIN; -- 開始事務(wù)
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 999; -- 無效的ID
ROLLBACK; -- 撤消事務(wù)
COMMIT;
在上面的示例中,第二個 UPDATE 語句無效,因為沒有 ID 為 999 的記錄,所以 ROLLBACK 語句用于撤消整個事務(wù)
十,F(xiàn)ilter語句
在MySQL中,F(xiàn)ILTER子句是一種條件篩選機(jī)制,用于在聚合函數(shù)中對特定條件的行進(jìn)行計算。它允許在聚合函數(shù)中使用條件表達(dá)式,以僅包括符合條件的行進(jìn)行計算。FILTER子句在MySQL 8.0版本中引入,并且通常與聚合函數(shù)(如SUM、COUNT、AVG等)一起使用。
FILTER子句的基本語法:
SELECT
aggregate_function(expression) FILTER (WHERE condition) AS alias
FROM
table
GROUP BY
column;
其中:
aggregate_function:聚合函數(shù),如SUM、COUNT、AVG等。 expression:在聚合函數(shù)中使用的表達(dá)式。 condition:一個條件表達(dá)式,用于篩選要包含在聚合計算中的行。 alias:給計算結(jié)果指定的別名。 table:數(shù)據(jù)源表格。 column:用于分組的列。 通過FILTER (WHERE condition)子句,可以將條件應(yīng)用于聚合函數(shù)的計算過程。只有滿足條件的行才會被包括在聚合計算中,而不滿足條件的行將被忽略。
下面是一個示例,說明如何使用FILTER子句來計算特定條件下的求和:
SELECT
category,
SUM(price) FILTER (WHERE quantity > 0) AS total_price
FROM
products
GROUP BY
category;
在上面的示例中,F(xiàn)ILTER (WHERE quantity > 0)子句用于篩選quantity大于0的行,然后計算滿足條件的行的price之和,并將結(jié)果用total_price別名表示。
請注意,F(xiàn)ILTER子句在MySQL中是一種擴(kuò)展語法,而在標(biāo)準(zhǔn)SQL中并不常見。因此,該語法可能不適用于其他數(shù)據(jù)庫系統(tǒng)。
十一,WHERE 和HAVING
在 MySQL 中,WHERE 和 HAVING 是用于篩選數(shù)據(jù)的兩個關(guān)鍵字。
WHERE WHERE 關(guān)鍵字用于在查詢中篩選數(shù)據(jù),并返回滿足指定條件的行。WHERE 關(guān)鍵字可以使用比較運(yùn)算符(如 =、<、>、<=、>=、<> 等)和邏輯運(yùn)算符(如 AND、OR、NOT 等)來指定篩選條件。
以下是一個使用 WHERE 關(guān)鍵字的示例:
SELECT customer_name, city
FROM customers
WHERE city = 'New York';
在上面的示例中,WHERE 關(guān)鍵字用于篩選出位于紐約市的顧客,并返回其名稱和所在城市。
HAVING HAVING 關(guān)鍵字用于在 GROUP BY 子句中篩選分組數(shù)據(jù)。它與 WHERE 關(guān)鍵字類似,但它是在分組后進(jìn)行篩選的,而不是在查詢的所有行上進(jìn)行篩選的。
以下是一個使用 HAVING 關(guān)鍵字的示例:
SELECT customer_id, COUNT(order_id)
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 2;
在上面的示例中,GROUP BY 關(guān)鍵字用于按顧客 ID 進(jìn)行分組,并計算每個顧客的訂單數(shù)量。然后,HAVING 關(guān)鍵字用于篩選出訂單數(shù)量大于 2 的顧客。請注意,HAVING 關(guān)鍵字只能用于聚合函數(shù)(如 COUNT、SUM、AVG、MIN 和 MAX)所返回的數(shù)據(jù)。
總之,WHERE 和 HAVING 關(guān)鍵字都是用于篩選數(shù)據(jù)的關(guān)鍵字,但 WHERE 關(guān)鍵字用于篩選行,而 HAVING 關(guān)鍵字用于篩選分組數(shù)據(jù)。
柚子快報激活碼778899分享:數(shù)據(jù)庫 mysql語法大全
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。