格式注意事项
命令不区分大小写
分号结尾
空格换行无限制
SELECT "HelloWorld";
#comment
/*comment*/
创建逻辑库
`mysql>CREATE DATABASE database_name;`
`mysql>SHOW DATABASES;`
`mysql>DROP DATABASE database_name;
创建数据表 [中括号里内容可不写]
CREATE TABLE table_name(
column_name1 data_type [约束] [comment],
column_name2 data_type [约束] [comment],
...
)[comment];
DROP TABLE table_name;
数据表其他操作
SHOW table_name;
DESC table_name;
SHOW CREATE TABLE table_name;
DROP TABLE table_name;
Alter 语句
添加字段
ALTER TABLE table_name
ADD column_name1 data_type [约束] [comment],
ADD column_name2 data_type [约束] [comment],
...;
修改字段类型和约束
ALTER TABLE table_name
MODIFY column_name1 data_type [约束] [comment],
MODIFY column_name2 data_type [约束] [comment],
...;
修改字段名称
ALTER TABLE table_name
CHANGE column_name1 data_type [约束] [comment],
CHANGE column_name1 data_type [约束] [comment],
...;
删除字段
ALTER TABLE table_name
DROP column_name1 ,
DROP column_name2 ,
...;
删除主键
ALTER TABLE table_name
DROP primary key;
修改表名
ALTER TABLE table_name RENAME new_name;
创建索引
CREATE TABLE v
...,
INDEX [index_name] (字段)
...
);
添加/删除索引
CREATE INDEX index_name ON table_name(字段);
ALTER TABLE table_name ADD INDEX [index_name] (字段);
SHOW INDEX FROM table_name;
DROP INDEX index_name ON table_name;
记录查询
SELECT * FROM table_name;
使用列别名
SELECT name AS "new_name"
FROM table_name;
数据分页
SELECT ... FROM ... LIMIT start,end;
start默认值为0;
结果集排序
SELECT ... FROM ... ORDER BY 列名 [ASC/DESC];
默认ASC升序,DESC降序必须注明
去除重复记录
SELECT DISTINCT name FROM table_name;
只能查询一列,不可多列
在select中仅能使用一次
条件查询
SELECT ... FROM ... WHERE 条件 [AND/OR] 条件 ...;
条件执行顺序从左到右,把能筛选掉最多纪录的条件写在最左;
聚合函数
sum函数
求和,只能用于数字类型,字符类型结果为0,日期类型结果为毫秒数相加;
SELECT SUM(comm) FROM table_name;
会排除null值;
max函数
获得非空值的最大值;
SELECT MAX(comm) FROM table_name;
取最长的名字;
SELECT MAX(LENGTH(name)) FROM table_name;
Min函数
获得非空值的最小值;
SELECT MIN(comm) FROM table_name;
Avg函数
获得非空值的平均值;
SELECT AVG(comm) FROM table_name;
Count 函数
获得包含空值的记录数;
SELECT COUNT(*) FROM table_name;
获得不包含空值的记录数;
SELECT COUNT(comm) FROM table_name;
分组查询
SELECT name1,name2 FROM table_name
GROUP BY name1;
默认情况是对全表范围;
逐级分组
SELECT name1,name2,name3
FROM table_name
GROUP BY name1, name2
ORDER BY name1;
分组后再做汇总计算
SELECT name1,name2,name3
FROM table_name
GROUP BY name1 WITH ROLLUP;
Group_concat函数
把分组查询中的某个字段拼接成一个字符串;
SELECT name1,GROUP_CONCAT(name2),name3
FROM table_name
GROUP BY name1;
Having 子句
SELECT name1,name2,name3
FROM table_name
GROUP BY name1 HAVING ...;
表连接
SELECT name1,name2,name3
FROM table1 JOIN table2;
内连接
SELECT ... FROM table1 JOIN table2 ON 连接条件;
SELECT ... FROM table1 JOIN table2 WHERE 连接条件;
SELECT ... FROM table1 , table2 WHERE 连接条件;
相同数据表也可以做表连接,起别名;
结果集也可以起别名后作为一张表;
查询条件写on和where里效果相同,只保留符合条件的数据;
外连接
保留不符合条件的记录;
查询条件写where里,不符合条件的会被过滤掉;
左/右连接
保留左表所有记录,如右表无符合条件的,则用null连接左表
右表同理;
SELECT name1,name2,name3
FROM table1 LEFT JOIN table2;
SELECT name1,name2,name3
FROM table1 RIGHT JOIN table2;
union
将多个查询语句的结果集合并;
(查询语句)UNION(查询语句)UNION(查询语句)...
子查询
where,from(最优),select;
where
最简单,效率最低;
用表连接替代,效率高,只查询一次;
使用in,all,any,exists关键字处理多行条件
exists关键字
SELECT ... FROM table_name WHERE [NOT] EXISTS (再套一个子查询);
from
效率高,只查询一次;
select
每输出一次就要执行一次,效率低;
相关子查询
where,select;
要反复执行多次,避免使用;
insert语句
向数据表写入一条或多条记录;
INSERT INTO table_name (name1, name2,...)
VALUES (value1, value2,...);
INSERT INTO table_name (name1, name2,...)
VALUES (value1, value2,...), (value1, value2,...);
Insert 方言
INSERT INTO table_name SET name1=value1, name2=value2, ...;
Ignore 关键字
让insert只插入数据库不存在的数据;
INSERT [IGNORE] INTO table_name...;
Insert 子查询
insert可以包含子查询,并把子查询的结果写入数据表;
Update 语句
修改表中的记录;
INSERT [IGNORE] INTO table_name
SET name1=value1, name2=value2, ...
[WHERE 条件...]
[ORDER BY ...]
[LIMIT ...];
UPDATE表连接
INSERT table1 JOIN table2 ON 条件
SET name1=value1, name2=value2, ...;
INSERT table1, table2
SET name1=value1, name2=value2, ...
WHERE 连接条件;
内/外连接
INSERT table1 [LEFT/RIGHT] JOIN table2 ON 条件
SET name1=value1, name2=value2, ...;
Delete 语句
删除记录
DELETE [IGNORE] FROM table_name
[WHERE 条件...]
[ORDER BY ...]
[LIMIT ...];
Delete 表连接
DELETE table1, ... FROM table1 JOIN table2 ON 条件
[WHERE 条件...]
[ORDER BY ...]
[LIMIT ...];
内/外连接
DELETE table1, ... FROM table1 [LEFT/RIGHT] JOIN table2
ON 条件;
删除数据表全部数据
TRUNCATE TABLE table_name;
管理事务
手动开启事务
START TRANSACTION;
sql语句
[COMMIT/ROLLBACK];
修改事务隔离级别
读取其他事务未提交的数据:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
读取其他事务提交的数据:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
(默认)反复读取数据,不受其他事务影响:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
序列化事务,逐一执行:
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
各子句执行顺序
FROM > WHERE > GROUP BY > SELECT > ORDER BY > LIMIT