若是你对NodeJs系列感兴趣,欢迎关注微信公众号:前端神盾局或 github NodeJs系列文章本文整理自MySQL Tutorial和SQL必知必会html
MySQL CREATE TABLE Statement By Examples
CREATE TABLE [IF NOT EXISTS] table_name( column_list ) ENGINE=storage_engine
IF NOT EXISTS
是可选的,但推荐使用,它会先检查是否有有同名表,若是没有则建立。storage_engine
MySql 支持多种存储引擎: MyISAM
、InnoDB
、MERGE
、MEMORY (HEAP)
、ARCHIVE
、CSV
、FEDERATED
,若是没有指定,默认值是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 [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;
MySQL WHERE
WHERE子句除了用在SELECT
中还能够在UPDATE
、DELETE
中使用git
Operator | Description |
---|---|
= | 等于 |
<> or != | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
= | 大于等于
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 |
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
MySQL BETWEEN
表示的是区间条件sql
expr [NOT] BETWEEN begin_expr AND end_expr;
expr
在/不在区间begin_expr
和end_expr
之间express
expr
、begin_expr
和end_expr
的数据类型必须相同微信
SELECT productCode, productName, buyPrice FROM products WHERE buyPrice BETWEEN 90 AND 100;
MySQL LIKE
expr LIKE 'pattern'
LIKE 支持如下通配符函数
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');
A Comprehensive Look at MySQL IS NULL Operator
value IS [NOT] NULL
注意:NULL表示无值,它与0、空字符、false不一样
[]( http://www.mysqltutorial.org/...
根据一个或多个列对结果集进行分组,一般而言,GROUP BY
会和SUM
、AVG
、MAX
、MIN
等函数使用
SELECT c1, c2,..., cn, aggregate_function(ci) FROM table WHERE where_conditions GROUP BY c1 , c2,...,cn;
使用GROUP BY
须要注意如下几点:
GROUP BY
子句能够包含任意数目的列,于是能够对分组进行嵌套,更细致地进行数据分组。GROUP BY
必须在FROM
和WHREE
以后,ORDER BY
以前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
MySQL HAVING
与GROUP BY
配合使用,用于过滤分组
HAVING condition
HAVING
支持全部WHERE
操做符(AND
、OR
、IN
、BETWEEN
、LIKE
)
MySQL ORDER BY: Sort a Result Set
SELECT column1, column2,... FROM tbl ORDER BY column1 [ASC|DESC], column2 [ASC|DESC],...
注意:
column1
排序再按column2
排序,这里只有当column1
中的值相同时才按照column2
排序ASC
或DESC
,默认ASC
MySQL LIMIT
SELECT column1,column2,... FROM table LIMIT offset , count;
LIMIT
有两个参数:
offset
: 指定开始的位置,从0开始count
: 表明要返回的行数MySQL Subquery
使用子查询的几种形式:
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);
FROM
中使用SELECT MAX(items), MIN(items), FLOOR(AVG(items)) FROM (SELECT orderNumber, COUNT(orderNumber) AS items FROM orderdetails GROUP BY orderNumber) AS lineitems;
MySQL Join Made Easy For Beginners
在实际业务中,咱们常常把数据分表存放,那如何把多个表里的数据用一个SELECT
语句查询出来呢?这就须要联结。联结分红如下几种类型:Cross join、Inner join、Left join和Right join
下面经过一个例子来说解它们之间的区别。
首先咱们建立两个表t1
和t2
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 );
t1
和t2
表都有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的用法:
SELECT t1.id, t2.id FROM t1 CROSS JOIN t2;
运行结果以下:
Cross join采用笛卡尔积的规则,其实是将两个表相乘,获得一个组合表(3*3条数据)
SELECT t1.id, t2.id FROM t1 INNER JOIN t2 ON t1.pattern = t2.pattern;
Inner join 其实是对Cross join的条件过滤,它将不知足t1.pattern = t2.pattern
的纪录过滤掉:
获取左表全部记录,即便右表没有对应匹配的记录
SELECT t1.id, t2.id FROM t1 LEFT JOIN t2 ON t1.pattern = t2.pattern ORDER BY t1.id;
与Left join相反,用于获取右表全部记录,即便左表没有对应匹配的记录。
SELECT t1.id, t2.id FROM t1 RIGHT JOIN t2 on t1.pattern = t2.pattern ORDER BY t2.id;
MySQL UNION
用于组合多个SELECT
查询
SELECT column_list UNION [DISTINCT | ALL] SELECT column_list UNION [DISTINCT | ALL] SELECT column_list
注意:
// 插入单行数据 INSERT INTO table(c1,c2,...) VALUES (v11,v12,...); // 插入多行数据 INSERT INTO table(c1,c2,...) VALUES (v11,v12,...), (v21,v22,...), ... (vnn,vn2,...);
注意:
MySQL UPDATE
UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, ... [WHERE condition];
UPDATE支持两种修饰符:
LOW_PRIORITY
:延迟更新操做直到当前表没有读取操做,不过只有部分存储引擎支持该修饰符,好比:MyISAM, MERGE, MEMORYIGNORE
:容许Mysql在发生错误时继续更新操做MySQL DELETE
DELETE FROM table_name WHERE condition;
WHERE
条件没有指定,就会删除该表全部纪录