[TOC]
CRUD:Create Retrieve update delete

创建数据库

  1. CREATE DATABASE symfony DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

查询数据

基本语句

select * from <表名>;

条件查询

select * from <表名> where <条件表达式>

条件表达式

NOTANDORNOT 优先级最高,其次是 AND,最后是 OR。加上括号可以改变优先级。

投影查询

使用SELECT *表示查询表的所有列,使用SELECT 列1, 列2, 列3则可以仅返回指定列。

排序

select * from <表名> where <条件表达式> order by <列名, ···>
desc:降序 asc:升序(默认)。

分页查询

select * from <表名> where <条件表达式> order by <列名, ···> limit <M> offset <N>
limit <M> offset <N> 可简写成 limit <M>, <N>。从第 N 条开始,截取 M 条数据。
使用LIMIT <M> OFFSET <N>分页时,随着N越来越大,查询效率也会越来越低。

聚合查询

  • count():计算某一列的个数。
  • sum():计算某一列的合计值,该列必须为数值类型。
  • avg():计算某一列的平均值,该列必须为数值类型。
  • max():计算某一列的最大值。
  • min():计算某一列的最小值。

聚合查询的 WHERE 条件没有匹配到任何行,COUNT() 会返回0,而 SUM()AVG()MAX()MIN() 会返回 NULL

分组

对于聚合查询,可以根据 group by 语句来进行分组。如下面的例子:按照班级分组
select class_id, count(*) num from students group by class_id;

多表查询

select * from <表名1> <别名1> <表名2> <别名2> where <条件表达式>
多表查询是笛卡尔积,两个一万行的表就会变成1亿行,效率太低,连表尽量用连接查询。

连接查询

  1. 先确定主表,仍然使用FROM <表1>的语法;
  2. 再确定需要连接的表,使用INNER JOIN <表2>的语法;
  3. 然后确定连接条件,使用ON <条件...>,这里的条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接;
  4. 可选:加上WHERE子句、ORDER BY等子句。

MySQL不支持全外连接,所以只能采取关键字UNION来联合左、右连接。

插入数据

insert into <表名> (字段1, 字段2, ...) values (值1, 值2, ...); 值与字段要相互对应。
例如:

  1. insert into casbin_rules (ptype, v0, v1, v2) values ("p", "eve", "articles", "read");

更新数据

update <表名> set 字段1=值1, 字段2=值2, ... where ...;
在执行UPDATE语句时要非常小心,最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用UPDATE更新。

删除数据

delete from <表名> where …;`

一些小知识

  • 为什么别名不能用于 where 语句?
    别名是在内存中生成的,where 条件查询,只能用于从硬盘中,往内存中传输数据的过程中进行条件查询,符合条件的存入内存,不符合条件的不读取。相比较而言,having 是可以针对硬盘以及内存进行条件查询的。因此,如果对于聚合函数、别名等的条件查询,需要用 having,而不是 where。
  • 关系数据库的记录集没有顺序的概念,只有查询的时候才会排序。默认不指定顺序就是order by id按主键排序
  • truncate 将表所有记录都删除了,所有结构的记录都删除,不可以roll back,可以触发触发器。delete 只是删除了这一行记录,一行一行删,有记录,可以回滚roll back,被删除的id的数据虽然被删除了但还是占用着id号
  • 命令行程序mysql实际上是MySQL客户端,真正的MySQL服务器程序是mysqld,在后台运行。
  • mysql -h 10.0.1.99 -u root -p 这里 -h 指定 IP 或域名,