Mysql中的經常使用sql語句彙總

若是你對NodeJs系列感興趣,歡迎關注微信公衆號:前端神盾局或 github NodeJs系列文章html

本文整理自MySQL Tutorial和SQL必知必會前端

表(Table)

建立表

MySQL CREATE TABLE Statement By Examplesmysql

  • 語法
CREATE TABLE [IF NOT EXISTS] table_name(
    column_list
) ENGINE=storage_engine
複製代碼
  1. IF NOT EXISTS是可選的,但推薦使用,它會先檢查是否有有同名表,若是沒有則建立。git

  2. storage_engine MySql 支持多種存儲引擎: MyISAMInnoDBMERGEMEMORY (HEAP)ARCHIVECSVFEDERATED,若是沒有指定,默認值是InnoDBgithub

在建立表的時候須要給定字段(或列名),格式以下:sql

column_name data_type(length) [NOT NULL] [DEFAULT value] [AUTO_INCREMENT]
複製代碼

若是須要使用主鍵,可使用如下語法:express

PRIMARY KEY (col1,col2,...)
複製代碼
  • 例子
CREATE TABLE IF NOT EXISTS tasks (
    task_id INT AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    start_date DATE,
    due_date DATE,
    status TINYINT NOT NULL,
    priority TINYINT NOT NULL,
    description TEXT,
    PRIMARY KEY (task_id)
)  ENGINE=INNODB;
複製代碼

數據檢索(SELECT)

  • 語法
SELECT 
    [alias1.]column_1, [alias1.]column_2, ...
FROM
    table_1 [AS alias1],table_2 [AS alias2]
[INNER | LEFT |RIGHT] JOIN table_3 ON conditions
WHERE
    conditions
GROUP BY column_1
HAVING group_conditions
ORDER BY column_1
LIMIT offset, length;
複製代碼

WHERE子句

MySQL WHEREbash

WHERE子句除了用在SELECT中還能夠在UPDATEDELETE中使用微信

比較運算符

Operator Description
= 等於
<> or != 不等於
< 小於
> 大於
<= 小於等於
>= 大於等於

AND 操做符

MySQL AND Operator函數

  • 語法
WHERE boolean_expression_1 AND boolean_expression_2
複製代碼
AND TRUE FALSE NULL
TRUE TRUE FALSE NULL
FALSE FALSE FALSE FALSE
NULL NULL FALSE NULL

OR 操做符

MySQL OR Operator

boolean_expression_1 OR boolean_expression_2
複製代碼
OR TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL

須要注意的是AND操做符的優先級大於OR操做符

BETWEEN

MySQL BETWEEN

表示的是區間條件

  • 語法
expr [NOT] BETWEEN begin_expr AND end_expr;
複製代碼

expr在/不在區間begin_exprend_expr之間

exprbegin_exprend_expr的數據類型必須相同

  • 例子
SELECT 
    productCode, 
    productName, 
    buyPrice
FROM
    products
WHERE
    buyPrice BETWEEN 90 AND 100;
複製代碼

LIKE

MySQL LIKE

  • 語法
expr LIKE 'pattern'
複製代碼

LIKE 支持如下通配符

  1. 百分號%:匹配任何字符出現的任意次數(0次或屢次)
  2. 下劃線_:匹配當個任意字符

IN

MySQL IN

  • 語法
SELECT 
    column1,column2,...
FROM
    table_name1
WHERE 
 (expr|column_1) [NOT] IN ('value1','value2',...);
複製代碼

若是column_1或表達式的結果在集合中有匹配,將返回1不然返回0

  • 例子
SELECT 
    officeCode, 
    city, 
    phone, 
    country
FROM
    offices
WHERE
    country IN ('USA' , 'France');
複製代碼

IS NULL

A Comprehensive Look at MySQL IS NULL Operator

  • 語法
value IS [NOT] NULL
複製代碼

注意:NULL表示無值,它與0、空字符、false不一樣

GROUP BY

根據一個或多個列對結果集進行分組,一般而言,GROUP BY 會和SUMAVGMAXMIN等函數使用

  • 語法
SELECT 
    c1, c2,..., cn, aggregate_function(ci)
FROM
    table
WHERE
    where_conditions
GROUP BY c1 , c2,...,cn;
複製代碼

使用GROUP BY須要注意如下幾點:

  1. GROUP BY子句能夠包含任意數目的列,於是能夠對分組進行嵌套,更細緻地進行數據分組。
  2. GROUP BY必須在FROMWHREE以後,ORDER BY以前
  3. 通常狀況下,SELECT中出現的非聚合函數字段,GROUP BY語句中也應該存在,好比
SELECT name, address, MAX(age) 
FROM t 
GROUP BY name;
複製代碼

運行此sql會報錯:

ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
BY clause and contains nonaggregated column 'mydb.t.address' which
is not functionally dependent on columns in GROUP BY clause; this
is incompatible with sql_mode=only_full_group_by
複製代碼

爲了修復這個錯誤,咱們應該把address字段從SELECT中去掉或者在GROUP BY中添加address

SELECT name, address, MAX(age) 
FROM t 
GROUP BY name,address;
複製代碼

不過有一些特例,具體能夠參考MySQL Handling of GROUP BY 4. 若是分組列中包含具備NULL值的行,則NULL將做爲一個分組返回。若是列中有多行NULL值,它們將分爲一組。 5. 若是在GROUP BY子句中嵌套了分組,數據將在最後指定的分組上進行彙總。換句話說,在創建分組時,指定的全部列都一塊兒計算(因此不能從個別的列取回數據)。 GROUP BY子句中列出的每一列都必須是檢索列或有效的表達式(但不能是彙集函數)。若是在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用別名。

HAVING

MySQL HAVING

GROUP BY配合使用,用於過濾分組

  • 語法
HAVING condition
複製代碼

HAVING支持全部WHERE操做符(ANDORINBETWEENLIKE)

ORDER BY

MySQL ORDER BY: Sort a Result Set

  • 語法
SELECT column1, column2,...
FROM tbl
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC],...
複製代碼

注意:

  1. 先按column1排序再按column2排序,這裏只有當column1中的值相同時才按照column2排序
  2. 若是未指定ASCDESC,默認ASC

LIMIT

MySQL LIMIT

  • 語法
SELECT 
    column1,column2,...
FROM
    table
LIMIT offset , count;
複製代碼

LIMIT有兩個參數:

  1. offset: 指定開始的位置,從0開始
  2. count: 表明要返回的行數

image

子查詢

MySQL Subquery

使用子查詢的幾種形式:

  1. WHERE中使用
SELECT 
    lastName, firstName
FROM
    employees
WHERE
    officeCode IN (SELECT 
            officeCode
        FROM
            offices
        WHERE
            country = 'USA');
複製代碼
SELECT 
    customerNumber, checkNumber, amount
FROM
    payments
WHERE amount = (SELECT 
            MAX(amount)
        FROM
            payments);
複製代碼
  1. FROM中使用
SELECT 
    MAX(items), MIN(items), FLOOR(AVG(items))
FROM
    (SELECT 
        orderNumber, COUNT(orderNumber) AS items
    FROM
        orderdetails
    GROUP BY orderNumber) AS lineitems;
複製代碼

聯結(JOIN)

MySQL Join Made Easy For Beginners

在實際業務中,咱們常常把數據分表存放,那如何把多個表裏的數據用一個SELECT語句查詢出來呢?這就須要聯結。聯結分紅如下幾種類型:Cross join、Inner join、Left join和Right join

下面經過一個例子來說解它們之間的區別。

首先咱們建立兩個表t1t2

CREATE TABLE t1 (
    id INT PRIMARY KEY,
    pattern VARCHAR(50) NOT NULL
);
 
CREATE TABLE t2 (
    id VARCHAR(50) PRIMARY KEY,
    pattern VARCHAR(50) NOT NULL
);
複製代碼

t1t2表都有pattern列,如今咱們插入一些數據

INSERT INTO t1(id, pattern)
VALUES(1,'Divot'),
      (2,'Brick'),
      (3,'Grid');
 
INSERT INTO t2(id, pattern)
VALUES('A','Brick'),
      ('B','Grid'),
      ('C','Diamond');
複製代碼
  • Cross join

咱們先來看一下Cross join的用法:

SELECT 
    t1.id, t2.id
FROM
    t1
CROSS JOIN t2;
複製代碼

運行結果以下:

image

Cross join採用笛卡爾積的規則,其實是將兩個表相乘,獲得一個組合表(3*3條數據)

image

  • Inner join
SELECT 
    t1.id, t2.id
FROM
    t1
        INNER JOIN
    t2 ON t1.pattern = t2.pattern;
複製代碼

Inner join 其實是對Cross join的條件過濾,它將不知足t1.pattern = t2.pattern的紀錄過濾掉:

image

  • Left join

獲取左表全部記錄,即便右表沒有對應匹配的記錄

SELECT 
    t1.id, t2.id
FROM
    t1
        LEFT JOIN
    t2 ON t1.pattern = t2.pattern
ORDER BY t1.id;
複製代碼

image

  • Right join

與Left join相反,用於獲取右表全部記錄,即便左表沒有對應匹配的記錄。

SELECT 
    t1.id, t2.id
FROM
    t1
        RIGHT JOIN
    t2 on t1.pattern = t2.pattern
ORDER BY t2.id;
複製代碼

image

組合查詢(UNION)

MySQL UNION

用於組合多個SELECT查詢

  • 語法
SELECT column_list
UNION [DISTINCT | ALL]
SELECT column_list
UNION [DISTINCT | ALL]
SELECT column_list
複製代碼

注意:

  1. UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關鍵字UNION分隔(所以,若是組合四條SELECT語句,將要使用三個UNION關鍵字)。
  2. UNION中的每一個查詢必須包含相同的列、表達式或彙集函數(不過,各個列不須要以相同的次序列出)。
  3. 列數據類型必須兼容:類型沒必要徹底相同,但必須是能夠隱含轉換的類型(例如,不一樣的數值類型或不一樣的日期類型)。
  4. ORDER BY子句排序。在用UNION組合查詢時,只能使用一條ORDER BY子句,它必須位於最後一條SELECT語句以後。
  5. UNION和JOIN的區別

image

數據插入和更新

INSERT

  • 語法
// 插入單行數據
INSERT INTO table(c1,c2,...)
VALUES 
   (v11,v12,...);

// 插入多行數據
INSERT INTO table(c1,c2,...)
VALUES 
   (v11,v12,...),
   (v21,v22,...),
    ...
   (vnn,vn2,...);
複製代碼

注意:

  1. 列和值須要一一對應

UPDATE

MySQL UPDATE

  • 語法
UPDATE [LOW_PRIORITY] [IGNORE] table_name 
SET 
    column_name1 = expr1,
    column_name2 = expr2,
    ...
[WHERE
    condition];
複製代碼

UPDATE支持兩種修飾符:

  1. LOW_PRIORITY:延遲更新操做直到當前表沒有讀取操做,不過只有部分存儲引擎支持該修飾符,好比:MyISAM, MERGE, MEMORY

  2. IGNORE:容許Mysql在發生錯誤時繼續更新操做

DELETE

MySQL DELETE

  • 語法
DELETE FROM table_name
WHERE condition;
複製代碼
  1. 若是WHERE條件沒有指定,就會刪除該表全部紀錄

image
相關文章
相關標籤/搜索