mysql基础命令语法速查

mysql基础命令语法速查

参考网址:

https://mp.weixin.qq.com/s/O5xMSuVBuDUvB7BSb1_L4w

说明:

该篇文章比较详细的介绍了sql的常用基础操作,包括基本的 DDL,DML,DCL 等命令,基础命令基本很全。可以作为一个很好的备忘手册

表设计规范

https://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247490967&idx=2&sn=fc92dc46ad2b6b2c2964c06f6277c4f7&chksm=fddecb53caa94245107a004935add8c0ccb059830f61d31ef404d172c3b07f87c0f576aa9a62&mpshare=1&scene=23&srcid=0923GipnyxKQhFHoObIlFU9W&sharer_sharetime=1600911081363&sharer_shareid=9d1e76e919cc0b2f3ca23ed1f5ef67a8#rd%20%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%E2%80%94%20%E7%89%88%E6%9D%83%E5%A3%B0%E6%98%8E%EF%BC%9A%E6%9C%AC%E6%96%87%E4%B8%BACSDN%E5%8D%9A%E4%B8%BB%E3%80%8C%E4%B8%8D%E4%BC%9A%E6%89%93%E5%AD%97314%E3%80%8D%E7%9A%84%E5%8E%9F%E5%88%9B%E6%96%87%E7%AB%A0%EF%BC%8C%E9%81%B5%E5%BE%AACC%204.0%20BY-SA%E7%89%88%E6%9D%83%E5%8D%8F%E8%AE%AE%EF%BC%8C%E8%BD%AC%E8%BD%BD%E8%AF%B7%E9%99%84%E4%B8%8A%E5%8E%9F%E6%96%87%E5%87%BA%E5%A4%84%E9%93%BE%E6%8E%A5%E5%8F%8A%E6%9C%AC%E5%A3%B0%E6%98%8E%E3%80%82%20%E5%8E%9F%E6%96%87%E9%93%BE%E6%8E%A5%EF%BC%9Ahttps://blog.csdn.net/shaoming314/article/details/110493119

1.1. 关于 SQL

SQL 是 Structure Query Language(结构化查询语言)的缩写,是关系型数据库的基本语言,由 IBM 在 20 世纪 70 年代开发出来,作为 IBM 关系数据库原型 System R 的原型关系语言,实现了关系数据库中的信息检索。

20 世纪 80 年代初,美国国家标准局(ANSI)开始着手制作 SQL 标准,并于 1986 年完成,被叫做 SQL-86。

SQL 标准几经修改,日趋完善,大多数关系型数据库系统都支持而 (My)SQL 是在标准 SQL 的基础上进行了扩展。

1.2. SQL 分类

  • DDL(Data Definition Language):数据定义语句

    • 主要用于操作数据库对象
    • 常用关键字 create、drop、alter等;
  • DML(Data Manipulation Language):数据操作语句

    • 主要用于操作数据库记录;
    • 常用关键字 insert、delete、update、select等;
  • DCL(Data Control Language):数据控制语句

    • 主要用于控制数据的访问权限
    • 常用关键字 grant、revoke等。

1.3. DDL

1.3.1. 创建数据库
CREATE DATABASE db_name;
1.3.2. 删除数据库
DROP DATABASE db_name;
1.3.3. 创建表
CREATE TABLE table_name(
    field1_name field1_type [field1_constraints],
    field2_name field2_type [field2_constraints],
    field3_name field3_type [field3_constraints],
    ...
    [PRIMARY KEY ( field1_name ),]
    [INDEX `idx_field1_name`(`field1_name`) USING BTREE COMMENT '',]
    ...
) [table_constraints];

说明:

  • field1_name 字段名,建议以下划线分隔单词,如 update_at

  • field1_type 字段类型

    • 严格模式下,如果插入 6 位字符串,则提示:406 - Data too long for column xxxx
    • 非严格模式下,如果插入 6 位字符串,则会进行截取后成功插入数据库,并且显示一个 warning。
    • 如果所插入数值的位数小于指定的宽度时会用空格填充;若同时使用 zerofill 约束,则会以 0 来填充。
    • 注意:显示宽度只用于显示,并不能限制取值范围和占用空间,每种数据类型的实际取值范围决定数据能否最终插入数据库
    • 如果插入的值超过字段的实际取值范围,则提示:1264 - Out of range value for column xxxx
    • int、char、varchar、float、decimal、datatime等。
    • 数值型的字段后跟括号,用于设置字段的显示宽度,如 int(11)
    • 字符型的字段后跟括号,用于设置可存放值的范围,如:varcahr(5)
  • field1_constraints 字段约束条件

  • NOT NULL 不允许为空,默认允许为空。

  • AUTO_INCREMENT 设置为自增列,在 MySQL 中无论 InnoDB 引擎还是 MyISAM 引擎的表,只能有一个自增列,并且自增列一定是索引列,无论是二级索引还是主键索引。

  • DEFAULT 默认值,默认 NULL。

  • COMMENT '注释信息' 字段注释

  • unsigned 数值型字段无符号,默认有符合。

  • zerofill 当所插入字段值的长度没有达到在字段类型中设置的长度时,用 0 来补全。

  • CHARACTER SET utf8mb4 设置字段的字符集。

  • COLLATE utf8mb4_bin

  • table_constraints 表约束条件

    • MyISAM 支持全文本搜索
    • InnoDB 支持事务处理
    • MEMORY 类似MyISAM,但数据存储在内存中,速度很快(特别适合临时表)。
    • ENGINE=InnoDB 设置表的存储引擎,默认 InnoDB,MySQL5.x 以下默认 MyISAM

    • DEFAULT CHARSET=utf8 设置默认字符集

    • AUTO_INCREMENT=10 设置自增列的开始位置,查看表中自增字段的下一个值,使用 SHOW TABLE STATUS LIKE 'table_name'; 获取字段 Auto_increment 的值。

    • COMMENT '注释信息' 表的注释信息

  • 查看表的定义

  • DESC table_name;
    
    -- 或
    
    SHOW CREATE TABLE table_name \G;
    
  • 1.3.4. 删除表

DROP TABLE table_name;

-- 删除多张表,并且删除之前先判断是否存在
DROP TABLE IF EXISTS table1_name,table2_name,.....;
1.3.5. 修改表

*注意*

  1. 关键字 CHANGEFIRST | AFTER COLUMN 属于 MySQL 在标准 SQL 上的扩展,并不一定适用于其它数据库。
  2. field_definition 至少包含字段名字段类型
  • 修改表类型

      ```sql
      ALTER TABLE table_name MODIFY [COLUMN] field_definition [FIRST | AFTER field_nam
      ```
    
  • 增加表字段

    ALTER TABLE table_name ADD [COLUMNM] field_definition [FIRST | AFTER field_name];
    
  • 删除表字段

    ALTER TABLE table_name DROP [COLUMN] field_name;
    
  • 修改字段名
ALTER TABLE table_name CHANGE [COLUMN] old_field_name field_definition [FIRST | A
  • 修改字段排列顺序

    使用前面的可选参数 [FIRST | AFTER field_name],其中:

    • ADD 新增的字段默认在表的最后位置;
    • CHANGE 或 MODIFY 默认不改变字段的位置。
  • 更改表名

    ALTER TABLE table_name RENAME [TO] new_table_name;
    
1.3.6. 修改表-外键
-- 添加
ALTER TABLE table1 ADD CONSTRAINT fk_table1_table2 FOREIGN KEY (table1) REFERENCES table2 (id);

-- 删除
ALTER TABLE table1 DROP FOREIGN KEY fk_table1_table2;
1.3.7. 修改表-索引

这里只介绍了通过修改表结构的方式创建索引,此外还有其它两种方式(CREATE INDEX 或 在 CREATE TABLE 时指定 `),详见后续文章索引部分。

  • 普通索引

    -- 添加
    ALTER TABLE table1 ADD INDEX idx_name(field1);
    
    -- 删除
    ALTER TABLE table1 DROP INDEX idx_name;
    
  • 主键索引

    -- 添加
    -- 先修改要设置为主键的字段:无符号、非空、自增
    ALTER TABLE table1 
    MODIFY COLUMN `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    ADD PRIMARY KEY (`id`);
    
    -- 删除
    ALTER TABLE table1 DROP PRIMARY KEY;
    
  • 唯一索引

    -- 添加
    ALTER table mytable ADD UNIQUE [idx_name] (field1(length))
    
    -- 删除
    ALTER TABLE table1 DROP UNIQUE field1;
    
  • 查询表的索引

    SHOW INDEX FROM table_name;
    

1.4. DML

1.4.1. 新增记录(增)
-- 插入一条
INSERT INFO table_name(field1,field2,...,fieldn) VALUES(val1,val2,...,valn);

-- 插入多条
INSERT INTO table_name(field1,field2,...,fieldn)
VALUES
(record1_val1,record1_val2,...,record1_valn),
(record2_val1,record2_val2,...,record2_valn),
...
(recordn_val1,recordn_val2,...,recordn_valn);
  • field1,field2,...,fieldn 可以不用写,但是后面 VALUES 里值的顺序需要与表中的字段顺序保持一致;

  • 如果待插入的数据,不包含以下类型的字段,可以不用写

    • 可空:自动设置为 NULL;
    • 有默认值:自动设置为默认值;
    • 自增:自动设置为下一个自增值。
1.4.2. 删除记录(删)
DELETE FROM table_name [WHERE condition];

-- 一次删除多张表
DELETE t1,t2,... FROM table1 t1,table2 t2,... [WHERE condition];
1.4.3. 更新记录(改)
UPDATE table_name SET field1=val1,field2=val2,...,fieldn=valn [WHERE condition];

-- 一次更新多个表
UPDATE table1 a,table2 b, tablen n SET a.field1=val1,...,n.fieldn=valn [WHERE condition];
1.4.4. 查询记录(查)
  • 基本

    SELECT * FROM table_name 
    [WHERE condition] 
    [ORDER BY field1 [DESC|ASC], field2 [DESC|ASC], ...]
    [LIMIT offset_start,row_count];
    

    说明:

    • ASC 升序(默认)
    • DESC 降序
    • [WHERE condition] 过滤条件
    • [ORDER BY field1 [DESC|ASC], field2 [DESC|ASC], ...] 排序
    • [LIMIT offset_start,row_count] 限制
  • 去重查询

    SELECT distinct field1 FROM table_name [WHERE condition];
    
  • 聚合(汇总统计)

    SELECT [field1,field2,...] func_name FROM table_name
    [WHERE condition]
    [GROUP BY field1,field2,...]
    [WITH ROLLUIP]
    [HAVING condition]
    

    说明:

    • func_name 聚合函数,常用:sum 求和、count(*) 记录数、max 最大值、min 最小值。
    • [WHERE condition] 聚合前按条件对结果进行过滤,应尽量使用此过滤以减少待聚合的结果集,提高聚合效率
    • [GROUP BY field1,field2,...] 分类聚合字段
    • [WITH ROLLUIP] 是否对分类聚合后的结果进行再汇总。
    • [HAVING condition] 对聚合后的结果再进行条件过滤。
  • 内连接

    仅获取两张表中互相匹配的记录

    SELECT field1,field2 FROM table1 t1,table2 t2 
    WHERE t1.outid=t2.outid
    

    其中 field1,field2,... 分别存储在两张表中。

  • 外连接

    • 左连接

      包含所有左边表中的记录,甚至是右边表中没有和它匹配的记录。

      SELECT field1,field2,... FROM table1 t1
      LEFT JOIN table2 t2 ON t2.outid=t1.outid
      
    • 右连接

      包含所有右边表中的记录,甚至是右边表中没有和它匹配的记录。

      SELECT field1,field2,... FROM table1 t1
      RIGHT JOIN table2 t2 ON t2.outid=t1.outid
      
  • 子查询

    当进行查询时,需要的条件是另一个 select 语句的结果时将用到子查询功能。

    SELECT field1,field2,... FROM table1 WHERE outid IN(
        SELECT outid FROM table2
    );
    

    除了 IN,用于子查询的关键字还有:NOT IN=!=EXISTSNOT EXISTS等。

    MySQL4.1 以前的版本不支持子查询,需要用表连接来实现,如:

    SELECT t1.* FROM table1 t1,table2 t2 
    WHERE t1.outid=t2.outid
    
  • 联合(合并结果集)

    SELECT * FROM table1
    UNION | UNION ALL
    SELECT * FROM table2
    ...
    UNION | UNION ALL
    SELECT * FROM tablen
    

    说明:

    • UNION ALL 把结果集直接合并在一起。
    • UNION 是将 UNION ALL 的结果集执行一次 DISTINCT,去除重复记录后的结果。

1.5. DCL

1.5.1. 授予权限
GRANT select,insert ON db1.* TO 'user1'@'localhost' IDENTIFIED BY '123';
1.5.2. 收回权限
REVOKE insert ON db1.* FROM 'user1'@'localhost';

1.6. 附录

1.6.1. 连接数据库
mysql [-h127.0.0.1] [-P3306] -uroot -p[password]

参数说明:

  • -h 可选,数据库地址(IP或域名),默认 127.0.0.1。
  • -P 可选,数据库端口号,默认 3306.
  • -u 数据库登录用户
  • -p 数据库登录用户对应的密码

示例:

$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.24-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

MySQL [(none)]> exit
Bye
1.6.2. 如何使用系统帮助

在命令行模式下,使用 ? contents 命令查看对应分类的帮助信息。

如:

-- 查看 show 相关的所有命令等
mysql> ? show
1.6.3. 什么是元数据信息

元数据指数据的数据,比如表名、列名、列类型、索引名等表的各种属性名称。MySQL 5.0 之后提供来一个新的数据库 information_schema,用来记录 MySQL 中的元数据信息。

  • 这是一个比较特殊的数据库,它在物理上并不存在相关的目录和文件;
  • 对应数据库里使用 show tables 显示的各种“表”也并不是实际存在的物理表,而全部是视图。

常用的视图如下:

  • SCHEMATA 提供当前 MySQL 实例中所有的数据库信息,对应 show databases; 的结果。
  • TABLES 提供关于数据库中的表信息(包括视图),详细表述里某个表属于那个 schema、表类型、表引擎、创建时间等,对应 show tables from schemaname; 的结果。
  • COLUMNS 提供所有表中的列信息,对应 show columns from schemaname.tablename; 的结果。
  • STATISTICS 提供关于表索引的信息,对应 show index from schemaname.tablename; 的结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值