CREATE DATABASE 数据库名;
USE 数据库名;
CREATE TABLE 表名(
	列名1 类型,
    列名2 类型
);

insert into 表名(参数1,参数2...) values (参数1值,参数2值...);
这种方式是给部分参数或所有参数赋值
insert into 表名 values (参数1值,参数2值...);
这种方式必须给所有参数赋值

delete from 表名;
删除表中所有数据
delete from 表名 where 条件;
删除表中所有满足条件的数据

update 表名 set 参数1=参数1值,参数2=参数2值,...;
改变表中所有数据
update 表名 set 参数1=参数1值,参数2=参数2值,... where 条件;
改变表中所有满足条件的数据

select * from 表名;
查询表中所有数据
select * from 表名 where 条件;
查询表中所有满足条件的数据
select 参数1,参数2... from 表名;
查询表中部分参数
select 参数1,参数2... from 表名 where 条件;
查询表中满足条件的部分参数

去重

select distinct class_id from students;

排序

select name, age from students order by age asc;
select name, score from students order by score desc;
SELECT * FROM students
ORDER BY CASE 
    WHEN gender = '男' THEN 1
    WHEN gender = '女' THEN 2
    ELSE 3
END;

截断

-- LIMIT 后只跟一个整数,表示要截断的数据条数(一次获取几条)
select task_name, due_date from tasks limit 2;
 
-- LIMIT 后跟 2 个整数,依次表示从第几条数据开始、一次获取几条
select task_name, due_date from tasks limit 2, 2;

条件分支

--条件分支语法
/*CASE WHEN (条件1) THEN 结果1
*	   WHEN (条件2) THEN 结果2
*	   ...
*	   ELSE 其他结果 END
*/
--将学生按照年龄划分为三个年龄等级(age_level)
SELECT
  name,
  CASE
    WHEN (age > 60) THEN '老同学'
    WHEN (age > 20) THEN '年轻'
    ELSE '小同学'
  END AS age_level
FROM
  student
ORDER BY
  name asc;

IFNULL

expression 的值不是 NULL,返回expression的值,不然返回 alternative_value

IFNULL(expression, alternative_value);
SELECT contactname, IFNULL(bizphone, homephone) AS phone
FROM contacts;

一定要配合 as 使用,不然字段名就是 “IFNULL(bizphone, homephone)”

聚合函数

COUNT:计算指定列的行数或非空值的数量。
SUM:计算指定列的数值之和。
AVG:计算指定列的数值平均值。
MAX:找出指定列的最大值。
MIN:找出指定列的最小值。
--汇总学生表中所有学生的总成绩(total_score)、平均成绩(avg_score)、最高成绩(max_score)和最低成绩(min_score),汇总数据条数(total)
SELECT
  SUM(score) AS total_score,
  AVG(score) AS avg_score,
  MAX(score) AS max_score,
  MIN(score) AS min_score,
  COUNT(*) AS total
FROM
  student;

COUNT( column_name ) 返回指定列的值的数目,不会计入 NULL 值

COUNT(1) 和 COUNT(*) 都会记录NULL值

DATEDIFF

DATEDIFF(日期1, 日期2):
返回日期1与日期2相差的天数。
如果日期1比日期2大,结果为正;如果日期1比日期2小,结果为负

分组聚合

--单字段分组
--统计学生表中的班级编号(class_id)和每个班级的平均成绩(avg_score)
SELECT
  class_id,
  AVG(score) AS avg_score
FROM
  student
GROUP BY
  class_id;
--多字段分组
--统计学生表中每个班级每次考试的总学生人数(total_num)
SELECT
  class_id,
  exam_num,
  COUNT(*) AS total_num
FROM
  student
GROUP BY
  class_id,
  exam_num;

HAVING

HAVING要用在 GROUP BY 后

SELECT name
FROM Employee WHERE id IN 
(SELECT managerId FROM Employee GROUP BY managerId HAVING COUNT(*) >= 5)
;

因为子查询有多条结果,所以要用 “id IN”

关联(连接)

CROSS JOIN 普通关联,返回多个表的笛卡尔积

--将学生表和班级表的所有行组合在一起,并返回学生姓名(student_name)、学生年龄(student_age)、班级编号(class_id)以及班级名称(class_name)
select
  s.name student_name,
  s.age student_age,
  s.class_id class_id,
  c.name class_name
from
  student s,
  class c;

INNER JOIN 是一种常见的关联查询方式,它根据两个表之间的关联条件,将满足条件的行组合在一起。注意,INNER JOIN 只返回两个表中满足关联条件的交集部分,即在两个表中都存在的匹配行。

--根据学生表和班级表之间的班级编号进行匹配,返回学生姓名(student_name)、学生年龄(student_age)、班级编号(class_id)、班级名称(class_name)、班级级别(class_level)
select
  s.name student_name,
  s.age student_age,
  s.class_id class_id,
  c.name class_name,
  c.level class_level
from
  student s
  join class c on s.class_id = c.id;

左外连接(LEFT JOIN):即使右表中没有匹配,也从左表返回所有的行

SELECT * FROM table1 RIGHT JOIN table2 ON condition;

右外连接(RIGHT JOIN):即使左表中没有匹配,也从右表返回所有的行

SELECT * FROM table1 RIGHT JOIN table2 ON condition;

NATURAL JOIN 自然连接, 用于在两个表中查找同名列并且这些列的值相同的行。自然连接会自动选择两个表中同名的、相同数据类型的列进行连接

SELECT *
FROM employees
NATURAL JOIN departments;

索引

//普通索引
CREATE INDEX index_name
ON table_name(index_column_1); 
//联合索引
CREATE INDEX index_name
ON table_name(index_column_1,index_column_2,...); 

事务

START TRANSACTION;//执行第一条语句时启动事务
//start transaction with consistent snapshot//立即启动事务
COMMIT;

全局锁

flush tables with read lock;
unlock tables;

表锁

表级锁

//表级别的共享锁,也就是读锁;
lock tables t_student read;
//表级别的独占锁,也就是写锁;
lock tables t_stuent write;

unlock tables;

意向锁

//先在表上加上意向共享锁,然后对读取的记录加共享锁
select ... lock in share mode;

//先表上加上意向独占锁,然后对读取的记录加独占锁
select ... for update;

行级锁

//对读取的记录加共享锁
select ... lock in share mode;

//对读取的记录加独占锁
select ... for update;

不积跬步,无以至千里!