QUERY | Desc |
---|---|
基礎查詢 | - |
SELECT | 字段列表 |
FROM | TABLE名 |
條件查詢 | - |
WHERE | 條件 |
分組查詢 | - |
GROUP BY | 分組組名 |
HAVING | 分組後條件 |
排序查詢 | - |
ORDER BY | 排序 |
分頁查詢 | - |
LIMIT | 分頁 |
改結構
ALTER TABLE 'name' ADD 'column name' type (length);
ALTER TABLE student ADD 'dept' VARCHAR(20);
改名改type
ALTER TABLE 'name' CHANGE 'old name ' new name
type (length)
ALTER TABLE stucent CHANGE 'dept' department VARCHAR(30);
DELETE Column
ALTER TABLE 'name' DROP 'colunm'
ALTER TABLE student DROP department;
改TABLE名
RENAME TABLE 'old name' TO new name;
RENAME TABLE 'student' TO stu;
數據插入
INSERT INTO 'table name' (colunm1,column 2,…) VALUES (1,2,…);
INSERT INTO 'table name' (value1,value2,..);
INSERT INTO student (sid,name,gender) VALUES (v1,v2,v3);
INSERT INTO student (v1,v2,v3);
數據修改
UPDATE 'name' SET 'cloumn=value',…;
UPDATE 'name' SET 'cloumn=value',… WHERE condition ;
UPDATE student SET address = 'sth';
UPDATE student SET address = 'sth' WHERE id = 001;
UPDATE student SET address = 'sth', B = b , WHERE id = 002;
數據刪除
1.DELETE FROM 'table' WHERE condition; -> delete內容
2.TRUNCATE TABLE 'name'; ->類似DROP TABLE , 先DROP再CREATE
3.TRUNCATE 'name';
DELETE FROM student WHERE id = 1004;
DELETE FROM student;
TRUNCATE TABLE student;
TRUNCATE student;
CREATE TABLE emp1(
id INT PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE emp2(
id INT,
name VARCHAR(20),
CONSTRAINT pk_tableName PRIMARY KEY(id)
);
CREATE TABLE emp4(
id INT,
…
);
ALTER TABLE emp4 ADD PRIMARY KEY(id);
ALTER TABLE emp1 DROP PRIMARY KEY;
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
)AUTO_INCREMENT=100; -> define the start number yourself
CREATE TABLE USER(
ID INT NOT NULL
);
指定column默許值
ZEROFILL默認為int(10)
小於(10),係前面補上相應的零
自動加上UNSIGNED(無符號)屬性,有符號-128~+127,無符號0~256
不能重覆,唯一
CREATE TABLE user(
id INT,
NAME VARCHAR(20),
PHONE_NUMBER VARCHAR(20)UNIQUE
);
ALTER TABLE user ADD CONSTRAINT UNIQUE_PN UNIQUE(PHONE_NUMBER);
SELECT *
FROM
WHERE
GROUP BY
HAVING
ORDER BY (DESC)
LIMIT
Operation | Rows | Columns | Table |
---|---|---|---|
DELETE |
Can specify a WHERE clause to delete specific rows. | Can specify which columns to delete. | Does not delete the table itself. |
TRUNCATE |
Cannot specify a WHERE clause. | Deletes all columns in the table. | Deletes the table itself. |
DROP |
Cannot specify a WHERE clause. | Does not delete any columns. | Deletes the table itself. |
Here are some additional details about each operation:
DELETE: The DELETE
operation can be used to delete specific rows from a table. The WHERE clause is used to specify which rows to delete. The DELETE
operation does not delete the table itself.
TRUNCATE: The TRUNCATE
operation deletes All rows from a table. It cannot be used with a WHERE clause. The TRUNCATE
operation also deletes the table's auto-increment value, so the next row inserted into the table will have an auto-increment value of 1.
DROP: The DROP
operation deletes a table from the database. It cannot be used with a WHERE clause. The DROP
operation also deletes the table's data and structure.
In general, the TRUNCATE
operation is faster than the DELETE
operation, because it does not have to iterate over each row in the table to delete it. However, the TRUNCATE
operation cannot be used with a WHERE clause, so it cannot be used to delete specific rows.
The DROP
operation is the most destructive operation, because it deletes the table itself, including its data and structure. The DROP
operation should only be used when you are sure that you no longer need the table.
INSERT INTO table2 (field1,field2,…) SELECT value1,value2…FROM table1
count()
sum()
min()
ma()
avg()
group_concat()
將data分拆成多組
INSERT INTO 語句用於向Table中插入新記錄。
INSERT INTO user
VALUES (10, 'root', 'root', 'xxxx@163.com');
INSERT INTO user(username, password, email)
VALUES ('admin', 'admin', 'xxxx@163.com');
INSERT INTO user(username)
SELECT name
FROM account;
UPDATE 語句用於更新Table中的記錄。
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
DELETE 語句用於刪除Table中的記錄。
TRUNCATE TABLE 可以清空Table,也就是刪除所有行。
DELETE FROM user
WHERE username = 'robot';
TRUNCATE TABLE user;
SELECT 語句用於從數據庫中查詢數據。
DISTINCT 用於返回唯一不同的值。它作用於所有列,也就是說所有列的值都相同才算相同。
LIMIT 限制返回的行數。可以有兩個參數,第一個參數為起始行,從 0 開始;第二個參數為返回的總行數。
ASC :升序(默認)
DESC :降序
SELECT prod_name
FROM products;
SELECT prod_id, prod_name, prod_price
FROM products;
SELECT *
FROM products;
SELECT DISTINCT
vend_id FROM products;
– 返回前 5 行
SELECT * FROM mytable LIMIT 5;
SELECT * FROM mytable LIMIT 0, 5;
– 返回第 3 ~ 5 行
SELECT * FROM mytable LIMIT 2, 3;
SELECT * FROM CUSTOMER WJERE ifnull(score,0)>=0 and ifnull(score,0)<1000;
子查詢是嵌套在較大查詢中的 SQL 查詢。子查詢也稱為內部查詢或內部選擇,而包含子查詢的語句也稱為外部查詢或外部選擇。
子查詢可以嵌套在 SELECT,INSERT,UPDATE 或 DELETE 語句內或另一個子查詢中。
子查詢通常會在另一個 SELECT 語句的 WHERE 子句中添加。
您可以使用比較運算符,如 >,<,或 =。比較運算符也可以是多行運算符,如 IN,ANY 或 ALL。
子查詢必須被圓括號 () 括起來。
內部查詢首先在其父查詢之前執行,以便可以將內部查詢的結果傳遞給外部查詢。執行過程可以參考下圖:
運算符 | 描述 |
---|---|
= | 等於 |
<> | 不等於。註釋:在 SQL 的一些版本中,該操作符可被寫成 != |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
BETWEEN | 在某個範圍內 |
LIKE | 搜索某種模式 |
IN | 指定針對某個列的多個可能值 |
SELECT * FROM Customers
WHERE cust_name = 'Kids Place';
UPDATE Customers
SET cust_name = 'Jack Jones'
WHERE cust_name = 'Kids Place';
DELETE FROM Customers
WHERE cust_name = 'Kids Place';
SELECT *
FROM products
WHERE vend_id IN ('DLL01', 'BRS01');
SELECT *
FROM products
WHERE prod_price BETWEEN 3 AND 5;
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
SELECT *
FROM products
WHERE prod_price NOT BETWEEN 3 AND 5;
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '%bean bag%';
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '__ inch teddy bear';
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM customers c1, customers c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';
SELECT *
FROM Products
NATURAL JOIN Customers;
SELECT customers.cust_id, orders.order_num
FROM customers LEFT JOIN orders
ON customers.cust_id = orders.cust_id;
SELECT customers.cust_id, orders.order_num
FROM customers RIGHT JOIN orders
ON customers.cust_id = orders.cust_id;
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_name = 'Fun4All';
JOIN vs UNION
JOIN 中連接Table的列可能不同,但在 UNION 中,所有查詢的列數和列順序必須相同。
UNION 將查詢之後的行放在一起(垂直放置),但 JOIN 將查詢之後的列放在一起(水平放置),即它構成一個笛卡爾積。
type | 大小 | Range | 格式 |
---|---|---|---|
DATE | 3 | 1000-01-01 / 9999-12-31 | YYYY-MM-DD |
TIME | 3 | '-828:59:59' / '838:59:59' | HH:MM:SS |
YEAR | 1 | 1901 / 2155 | YYYY |
DATETIME | 8 | 1000-01-01 00:00:00 / 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS |
TIMESTAMP | 4 | 1970-01-01 00:00:00 / 2038-01-19 03:14:07 | YYYYMMDD HHMMSS |
函數 | Defination |
---|---|
AddDate() | 增加一個日期(天、周等) |
AddTime() | 增加一個時間(時、分等) |
CurDate() | 返回當前日期 |
CurTime() | 返回當前時間 |
Date() | 返回日期時間的日期部分 |
DateDiff() | 計算兩個日期之差 |
Date_Add() | 高度靈活的日期運算函數 |
Date_Format() | 返回一個格式化的日期或時間串 |
Day() | 返回一個日期的天數部分 |
DayOfWeek() | 對於一個日期,返回對應的星期幾 |
Hour() | 返回一個時間的小時部分 |
Minute() | 返回一個時間的分鐘部分 |
Month() | 返回一個日期的月份部分 |
Now() | 返回當前日期和時間 |
Second() | 返回一個時間的秒部分 |
Time() | 返回一個日期時間的時間部分 |
Year() | 返回一個日期的年份部分 |
IntevalDay() | 表示一段時間間隔,INTERVAL 間隔值 單位,INTERVAL 1 |
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行數 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
排序和分組
ORDER BY
ORDER BY 用於對結果集進行排序。
ASC :升序(默認)
DESC :降序
可以按多個列進行排序,並且為每個列指定不同的排序方式
指定多個列的排序方向
SELECT * FROM products
ORDER BY prod_price DESC, prod_name ASC;
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name;
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name
ORDER BY cust_name DESC;
SELECT … FROM … LIMIT N
N:表示查詢幾多條data
SELECT … FROM … LIMIT M,N
M:由第幾條開始查,計算方法(M-1)
視圖是基於 SQL 語句結果集的可視化表格。
視圖是虛擬的表格,本身不包含數據,因此不能進行索引操作。
對視圖的操作與普通表格相同。
作用
簡化複雜的 SQL 操作,例如復雜的連接操作。
僅使用實際表格的部分數據。
通過僅為用戶授予訪問視圖的權限,保障數據的安全性。
更改數據的格式和表示。
Now, let's create a view named order_details that combines data from the orders table and the customers table to show order details with customer names.
通過索引可以更加快速高效地查詢數據。
用戶無法直接看到索引,它們僅用於加速查詢。
更新包含索引的表格需要更多時間,因為索引本身也需要更新。因此,最好只在常常被搜索的列(以及表格)上創建索引。
Unique Index | Non-Unique Index | |
---|---|---|
Ensures uniqueness of values in indexed column(s). - Prevents duplicate values. - Enforces data integrity. |
Does not enforce uniqueness; duplicates allowed. - Improves query performance. |
|
Typically used for primary keys or unique constraints. - One unique index per table for enforcing primary key. - Multiple unique indexes for unique constraints. |
Used to speed up searches on frequently queried columns. - Multiple non-unique indexes possible. |
|
Usage | Primary keys, business identifiers. - Ensures uniqueness in indexed column(s). |
- Optimize SELECT operation speed. - Does not guarantee uniqueness. |
使用 View 的好處 | View 與 Table 的比較 | |
---|---|---|
概述 | View是基於 SQL 查詢的結果集的可視化虛擬表格。 | Table是數據庫中的實際數據存儲單元。 |
用途 | - 簡化複雜的查詢操作。 - 將復雜的聯結操作封裝為View,減少編寫重複的代碼。 - 隱藏底層數據結構,提供更簡單、更具可讀性的數據訪問方式。 |
- 存儲實際數據。 - 提供主要數據操作,如插入、更新、刪除記錄。 - 表格內的數據具有持久性。 |
數據存儲 | - View本身不存儲數據,而是基於查詢生成的。 - 不佔用物理存儲空間。 |
- 表格實際存儲數據記錄。 - 佔用物理存儲空間。 |
數據更新 | - 對View的修改不會直接影響底層數據表,只是影響查詢結果。 | - 對Table的修改會直接影響存儲的數據。 |
安全性 | - 可以限制用戶只能訪問特定列的數據,保護敏感數據。 - 隱藏底層表的結構,減少數據暴露風險。 |
- 數據可以根據Table的權限直接控制。 - 表內的數據可能更容易受到直接訪問的威脅。 |
性能 | - 可以提供預先計算的數據結果,加速查詢操作。 | - 基於VIew的查詢可以減少複雜的 JOIN 操作。 - 表格的查詢性能取決於索引和數據量。 - 複雜的查詢可能需要手動編寫 JOIN 操作。 |
示例 | 假設有一個名為 "銷售訂單" 的VIew, 匯總了訂單信息和客戶名稱。通過查詢該View, 可以直接獲得訂單和客戶的信息。 | 假設有一個名為 "產品" 的Table,存儲了產品的詳細信息,如名稱、價格和庫存數量。 |
First, the PARTITION BY clause divides the result set returned from the FROM clause into partitions.
The PARTITION BY clause is optional. If you omit it, the whole result set is treated as a single partition.
Then, the ORDER BY clause sorts the rows in each partition.
Because the ROW_NUMBER() is an order sensitive function, the ORDER BY clause is required.
Finally, each row in each partition is assigned a sequential integer number called a row number. The row number is reset whenever the partition boundary is crossed.
Create a Tempory Table:
String function in sql:
concatenate
substring
trim
upper
lower
output:
|CompanyName|ContactName|CompanyName '('|| ContactName')' |
|-|-|-|
Alfreds Futterkiste|Maria Anders|Alfreds Futterkiste(Maria Anders)|
Date
format YYYY-MM-DD
DateTime
format YYYY-MM-DD HH:MI:SS
TIMESTAMP
format YYYY-MM-DD HH:MI:SS