零散的MySQL基础总是记不住?看这一篇如何拯救你

前言在日常开发中,一些不常用且又比较基础的知识,过了一段时间之后,总是容易忘记或者变得有点模棱两可 。本篇主要记录一些关于MySQL数据库比较基础的知识,以便日后快速查看 。

零散的MySQL基础总是记不住?看这一篇如何拯救你

文章插图
 
SQL命令SQL命令分可以分为四组:DDL、DML、DCL和TCL 。四组中包含的命令分别如下
零散的MySQL基础总是记不住?看这一篇如何拯救你

文章插图
 
DDLDDL是数据定义语言(Data Definition Language)的简称,它处理数据库schemas和描述数据应如何驻留在数据库中 。
  • CREATE:创建数据库及其对象(如表,索引,视图,存储过程,函数和触发器)
  • ALTER:改变现有数据库的结构
  • DROP:从数据库中删除对象
  • TRUNCATE:从表中删除所有记录,包括为记录分配的所有空间都将被删除
  • COMMENT:添加注释
  • RENAME:重命名对象
常用命令如下:
# 建表CREATE TABLE sicimike(id int(4) primary key auto_increment COMMENT '主键ID',name varchar(10) unique,age int(3) default 0,identity_card varchar(18)# PRIMARY KEY (id) // 也可以通过这种方式设置主键# UNIQUE KEY (name) // 也可以通过这种方式设置唯一键# key/index (identity_card, col1...) // 也可以通过这种方式创建索引) ENGINE = InnoDB;# 设置主键alter table sicimike add primary key(id);# 删除主键alter table sicimike drop primary key;# 设置唯一键alter table sicimike add unique key(column_name);# 删除唯一键alter table sicimike drop index column_name;# 创建索引alter table sicimike add [unique/fulltext/spatial] index/key index_name (identity_card[(len)] [asc/desc])[using btree/hash]create [unique/fulltext/spatial] index index_name on sicimike(identity_card[(len)] [asc/desc])[using btree/hash]example: alter table sicimike add index idx_na(name, age);# 删除索引alter table sicimike drop key/index identity_card;drop index index_name on sicimike;# 查看索引show index from sicimike;# 查看列desc sicimike;# 新增列alter table sicimike add column column_name varchar(30);# 删除列alter table sicimike drop column column_name;# 修改列名alter table sicimike change column_name new_name varchar(30);# 修改列属性alter table sicimike modify column_name varchar(22);# 查看建表信息show create table sicimike;# 添加表注释alter table sicimike comment '表注释';# 添加字段注释alter table sicimike modify column column_name varchar(10) comment '姓名';DMLDML是数据操纵语言(Data Manipulation Language)的简称,包括最常见的SQL语句,例如SELECT,INSERT,UPDATE,DELETE等,它用于存储,修改,检索和删除数据库中的数据 。
  • 分页
-- 查询从第11条数据开始的连续5条数据select * from sicimike limit 10, 5
  • group by
    默认情况下,MySQL中的分组(group by)语句,不要求select返回的列,必须是分组的列或者是一个聚合函数 。如果select查询的列不是分组的列,也不是聚合函数,则会返回该分组中第一条记录的数据 。对比下面两条SQL语句,第二条SQL语句中,cname既不是分组的列,也不是以聚合函数的形式出现 。所以在liming这个分组中,cname取的是第一条数据 。
mysql> select * from c;+-----+-------+----------+| CNO | CNAME | CTEACHER |+-----+-------+----------+|1 | 数学| liming||2 | 语文| liming||3 | 历史| xueyou||4 | 物理| guorong||5 | 化学| liming|+-----+-------+----------+5 rows in set (0.00 sec)mysql> select cteacher, count(cteacher), cname from c group by cteacher;+----------+-----------------+-------+| cteacher | count(cteacher) | cname |+----------+-----------------+-------+| guorong|1 | 物理|| liming|3 | 数学|| xueyou|1 | 历史|+----------+-----------------+-------+3 rows in set (0.00 sec)
  • having
    having关键字用于对分组后的数据进行筛选,功能相当于分组之前的where,不过要求更严格 。过滤条件要么是一个聚合函数( ... having count(x) > 1),要么是出现在select后面的列(select col1, col2 ... group by x having col1 > 1)
  • 多表更新
update tableA a inner join tableB b on a.xxx = b.xxx set a.col1 = xxx, b.col1 = xxx where ...多表删除
  • 多表删除
delete a, b from tableA a inner join tableB b on a.xxx = b.xxx where a.col1 = xxx and b.col1 = xxxDCLDCL是数据控制语言(Data Control Language)的简称,它包含诸如GRANT之类的命令,并且主要涉及数据库系统的权限,权限和其他控件 。
  • GRANT :允许用户访问数据库的权限
  • REVOKE:撤销用户使用GRANT命令赋予的访问权限
TCLTCL是事务控制语言(Transaction Control Language)的简称,用于处理数据库中的事务


推荐阅读