Mysql中的经常使用sql语句汇总

若是你对NodeJs系列感兴趣,欢迎关注微信公众号:前端神盾局或 github NodeJs系列文章

本文整理自MySQL Tutorial和SQL必知必会html

表(Table)

建立表

MySQL CREATE TABLE Statement By Examples
  • 语法
CREATE TABLE [IF NOT EXISTS] table_name(
    column_list
) ENGINE=storage_engine
  1. IF NOT EXISTS是可选的,但推荐使用,它会先检查是否有有同名表,若是没有则建立。
  2. storage_engine MySql 支持多种存储引擎: MyISAMInnoDBMERGEMEMORY (HEAP)ARCHIVECSVFEDERATED,若是没有指定,默认值是InnoDB

在建立表的时候须要给定字段(或列名),格式以下:前端

column_name data_type(length) [NOT NULL] [DEFAULT value] [AUTO_INCREMENT]

若是须要使用主键,可使用如下语法:mysql

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 WHERE

WHERE子句除了用在SELECT中还能够在UPDATEDELETE中使用git

比较运算符

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操做符github

BETWEEN

MySQL BETWEEN

表示的是区间条件sql

  • 语法
expr [NOT] BETWEEN begin_expr AND end_expr;

expr在/不在区间begin_exprend_expr之间express

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不然返回0this

  • 例子
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

[]( http://www.mysqltutorial.org/...

根据一个或多个列对结果集进行分组,一般而言,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

  1. 若是分组列中包含具备NULL值的行,则NULL将做为一个分组返回。若是列中有多行NULL值,它们将分为一组。
  2. 若是在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

相关文章
相关标签/搜索