添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  1. 数据类型
    1. 整形
    2. 浮点型
    3. 定点数
    4. 字符串
    5. 二进制
    6. 日期类型
    7. 数据类型属性
  2. 基础SQL
    1. CREATE
    2. DROP
    3. ALTER
      1. 修改表列类型
      2. 增加表字段
      3. 删除表字段
      4. 修改默认值
      5. 删除默认值
      6. 修改字段名
      7. 修改字段排列顺序
      8. 修改表名
    4. INSERT
    5. UPDATE
    6. DELETE
    7. SELECT
      1. 查询不重复的记录 distinct
      2. 根据限定条件查询 where
    8. ORDER, LIMIT
    9. GRANT
    10. REVOKE
  3. 高级SQL
    1. 聚合操作 count()、sum()、max()、min()、GROUP BY 、HAVING 、WITH ROLLUP
    2. 表连接 JOIN
    3. INNER JOIN
    4. UNION 和 UNION ALL
  4. 存储引擎
    1. MyISAM
    2. InnoDB
    3. MEMORY
    4. MERGE
    5. TokuDB
  5. 外键(FOREIGN KEY)
    1. 创建外键语法
  6. 索引
    1. 创建索引
    2. 修改表结构
    3. 创建表的时候指定
    4. 删除索引
    5. 索引类型
  7. 视图
    1. 创建视图
    2. 删除视图
  8. 存储过程和函数
    1. 创建存储过程
    2. 删除存储过程
    3. 存储过程语法
      1. 变量的定义
      2. 变量的赋值
      3. 定义条件和处理
      4. 光标的使用
      5. 流程控制
  9. 触发器
    1. 创建触发器
    2. 删除触发器
    3. 查看触发器
  10. 事务控制
    1. 分布式事务
  11. skills
    1. 查看、修改数据库编码
    2. 查看索引工作情况
    3. 使用 explain进行查询性能分析
    4. 连接远程数据库
    5. 批量执行SQL
    6. 使用mysqlbinlog提取二进制日志
    7. mysqlcheck(MyISAM 表维护工具)
    8. mysqldump(数据导出工具)
    9. mysqlshow(数据库对象查看工具)
  12. optimizations
    1. 优化 GROUP BY语句
    2. 优化 INSERT 语句
    3. 优化嵌套查询
    4. MySQL 如何优化 OR 条件
    5. 使用 SQL 提示
      1. USE INDEX
      2. IGNORE INDEX
      3. FORCE INDEX
  13. 参考:
  • 外键: 外键用于关联两个表。
  • 复合键: 复合键将多个列作为一个索引键,一般用于复合索引。
  • 索引: 使用索引可快速访问数据库表中的特定信息。索引是对数据库表一列或多列的值进行排序的一种结构。类似书籍的目录。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

    数据类型

    MySQL中数据类型有:整形、浮点型、定点数、字符串、二进制、日期时间类型
  • 计算机存储信息的最小单位是 位(bit) 。二进制一个’0’或一个’1’叫一位。
    计算机存储容量最基本的单位是 __字节(Byte)__。8个二进制位(bit)组成一个字节。一个标准的英文字母占一个字节位置,一个标准的汉字占二个字节位置。(不同编码可能占用字节不一样!)

    UTF-8编码中,一个英文字母字符存储需一个字节,一个汉字字符存储需要3~4个字节。

    MySQL数据类型 tinyint(m) [UNSIGNED] 1个字节 范围(-128~127) smallint(m) [UNSIGNED] 2个字节 范围 (-32768~32767) mediumint(m)[UNSIGNED] 3个字节 范围 (-8388608~8388607) int(m) [UNSIGNED] 4个字节 范围(-2147483648~2147483647) bigint(m) [UNSIGNED] 8个字节 范围(+-9.22*10的18次方)

    取值范围如果加了 unsigned ,则最大值翻倍。例如 tinyint unsigned 的取值范围为(0~256)。

    MySQL数据类型 float(m, d) 单精度浮点型 8位精度(4字节) m总个数, d小数位 double(m, d) 双精度浮点型 16位精度 (8字节) m总个数, d小数位

    设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.456,总个数以实际为准。

    定点数

    浮点数在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
    decimal(m, d) 参数 m<65是总个数,d<30且d<m是小数位。

    MySQL数据类型 char(n) 固定长度,最多255个字节 varchar(n) 可变长度,最多65535个字节 tinytext 可变长度,最多255个字节 可变长度,最多65535个字节 mediumtext 可变长度,最多2的24次方-1个字节 longtext 可变长度,最多2的32次方-1个字节

    char(n) 中的n设定字符串存储时的长度,如果长度不足n,则空格补于其后,查询时在将空格去掉。
    varchar(n) 中的N设定字符串存储时的长度,如果长度不足n,不会再后面填充空格,但varchar实际长度是存储时长度+1。因为varchar字段会用一个字节保存字符串长度。

    Value CHAR(4) Storage Required VARCHAR(4) Storage Required ‘ ‘ 4bytes 1byte ‘ab ‘ 4bytes 3bytes ‘abcd’ ‘abcd’ 4bytes ‘abcd’ 5bytes ‘abcdsd’ ‘abcd’ 4bytes ‘abcd’ 5bytes

    char类型的字符串检索速度要比varchar类型快。但占的存储空间可能比varchar大。

    MySQL数据类型 最大长度 65535个字节 MediumBlob 最大长度 16777215个字节 LongBlob 最大长度 4294967295个字节

    Blob (Binary large objects)储存二进位资料,且有分大小写

    MySQL数据类型 日期 ‘2008-12-2’ 时间 ‘12:25:36’ datetime 日期时间 ‘2008-12-2 22:06:44’ timestamp 自动存储记录修改时间 (系统当前时间) 年份yyyy

    数据类型属性

    基础SQL

    SQL语句主要可以划分为三种类型:

  • DDL(Data Definition Languages) 数据库定义语言,这些语句定义不同的数据段、数据库、表、列、索引等数据对象。常用的语句关键字 create drop alter 等。
  • DML(Data Manipulation Language) 数据操作语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字包括: insert delete update select 等。
  • DCL(Data Control Language)数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要语句关键字包括 grant revoke 等。
  • CREATE

    create用于创建数据库和数据库表。

    创建数据库:

    MySQL关键字 数据列可包含NULL值 NOT NULL 数据列不允许包含NULL值 DEFAULT PRIMARY KEY AUTO_INCREMENT 自动递增,适用于整数类型 UNSIGNED CHARACTER SET name 指定一个字符集
    1
    CREATE DATABASE database_name;

    创建数据库表:

    1
    2
    3
    4
    5
    6
    CREATE TABLE tablename (
    column_name_1 column_type_1 constraints,
    column_name_2 column_type_2 contraints,
    .......
    column_name_n column_type_n contraints
    )ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8
  • column_name 列名字
  • column_type 列的数据类型
  • constraints 列的约束条件
  • 查看表结构: DESC table_name \G;
    查看创建表的表达式: show create table table_name \G;

    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE persons (
    id int AUTO_INCREMENT PRIMAY KEY,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
    ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

    创建MySQL账户,语法:

    1
    CREATE USER 'user_name'@'[localhost|%]' IDENTIFIED BY 'password';

    localhost 表示只能是本地登录, % 表示可以远程登录。

    DROP

    删除数据库,删除数据库表,删除表索引。

    删除数据库:

    1
    DROP DATABASE database_name;

    删除数据库表:

    1
    DROP TABLE table_name;

    删除表索引:

    1
    ALTER TABLE table_name DROP INDEX index_name;

    ALTER

    对于已经创建好的表,如果需要做一些结构上的改变可以使用 alter table 语句。

    修改表列类型

    1
    ALTER TABLE tbale_name MODIFY [COLUMN] column_definition [FIRST | AFTER col_name];
  • COLUMN 字段名
  • column_definition 字段定义
  • [FIRST | AFTER col_name] 字段相对位置
  • 1
    ALTER TABLE emp MODIFY ename varchar(20);

    增加表字段

    1
    ALTER TABLE table_name ADD [COLUMN] column_definition [FIRST | AFTER col_name];
    1
    ALTER TABLE emp add column age int(3)

    删除表字段

    1
    ALTER TABLE table_name DROP COLUMN column_name
    1
    ALTER TABLE emp DROP COLUMN age;

    修改默认值

    1
    ALTER TABLE table_name ALTER column_name SET DEFAULT value;

    删除默认值

    1
    ALTER TABLE table_name ALTER column_name DROP DEFAULT;

    修改字段名

    1
    ALTER TABLE table_name CHANGE [COLUMN] old_column_name column_definition [FIRST | AFTER column_name]
    1
    ALTER TABLE emp CHANGE age age1 int(4);

    修改字段排列顺序

    前面介绍字段增加和修改语法(ADD/CHANGE/MODIFY)中,都有一个可选 first|after column_name 这个选项可以用于修改字段在表中的位置。ADD 增加的字段默认式是加在表最后位置。而CHANGE/MODIFY默认都不会改变字段位置。

    例子,新增的字段birth date 加在ename之后:

    1
    ALTER TABLE emp ADD birth date after ename;

    修改表名

    1
    ALTER TABLE old_table_name RENAME TO new_table_name;

    INSERT

    表创建好后,就可以向里面插入数据。
    插入数据基本语法如下:

    1
    INSERT INTO table_name (field1,field2,field3) VALUES (value1,vaule2,vaule3),(value1.1,value1.2,value1.3);
    1
    INSERT INTO persons (LastName,FirstName,Address,City) VALUES ('Gates','Bill','xuanwumen 10','Bei jing');

    表中允许为空值的字段可以在插入时不插入数据,但如果表中字段为非空并且没有默认值则每次插入都需要插入数据。

    可空字段,非空但含有默认值的字段,自增长字段可以不用在insert后的字段列表里面出现。

    数值顺序如果是表结构字段顺序则可以省略字段声明部分。例如:

    1
    INSERT INTO dept VALUES (5,'dept5);

    UPDATE

    表里的记录值通过 update命令进行更新。语法:

    1
    UPDATE tablename SET field1=value1,field2=value2,fieldn=valuen [WHERE CONDITION]
    1
    UPDATE persons SET FirstName='Fred' WHERE LastName = 'Wilson';

    DELETE

    删除记录使用关键字 delete。语法:

    1
    DELETE FROM table_name [WHERE CONDITION];
    1
    DELETE FROM Person WHERE LastName = 'Wilson' 

    在MySQL中可以一次删除多个表的数据,语法:

    1
    DELETE t1,t2,...,tn FROM t1,t2,...tn [WHERE CONDITION];
    1
    delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;

    SELECT

    数据插入到数据库中后,可以用SELECT命令进行各种各样的查询。最基本的语法如下:

    1
    SELECT * FROM table_name [WHERE CONDITION]

    * 表示将所有记录都选出来,等同于用逗号分割所有字段。

    查询不重复的记录 distinct

    有时需要将表中的记录去掉重复后显示出来,可以使用关键字 distinct。

    1
    SELECT DISTINCT field1,field2 FROM table_name;

    distinct 字段必须在首位,且一条查询语句只能有一个 distinct

    根据限定条件查询 where

    很多情况,我们不需要将所有数据查询出来,而只是根据限定条件查询一部分数据,用where关键字可以实现这样操作。

    1
    select * from persons where City='Bei jing';

    where关键字后面条件除了 = 外,还可以使用 > <__ __>= <= != 等比较运算符。多个条件之间还可以使用 or and 等逻辑运算符进行条件联合查询。

    1
    select * from emp where deptno=1 and sal<3000;

    ORDER, LIMIT

    我们经常有这样的需求,取出按照某个字段进行排序后的记录结果集,这就需要用到数据库的排序操作。用关键字 ORDER BY来实现。语法如下:

    1
    SELECT * FROM table_name [WHERE CONDITION] [ORDER BY field1 [DESC|ASC], field2 [DESC|ASC],..., fieldn [DESC|ASC]]

    其中 DESC ASC 是排序顺序关键字, DESC 表示按字段进行降序排列, ASC 则表示升序排列,如果不写关键字默认是升序排列。 ORDER BY后面可以跟多个不同的排序字段,并且每个排序字段可以有不同的排序顺序。

    1
    select * from emp order by deptno, sal desc;

    排序后希望只显示一部分而不是全部,就可以使用LIMIT关键字来实现。语法如下:

    1
    SELECT ... [LIMIT offset_start, row_count];

    其中 offset_start 表示记录的起始偏移量, row_count 表示显示的行数。

    1
    select * from emp order by sal limit 3;

    limit经常和order by 一起配合使用来进行记录的分页。

    GRANT

    给MySQL账户分配权限使用 grant。语法:

    1
    GRANT operate1,operate2,...,operateN ON db.tableName to 'user'@'[%|localhost]';

    假如数据库中有个 testdb 数据库和 developer 账户。
    developer 账户授予 查询,插入,更新 testdb 数据库中所有表的权限,并且可以在远程登录。例子:

    1
    grant select,insert,update on testdb.* to 'developer'@'%'

    授予所有权限语法:

    1
    grant all privileges on testdb.* to 'developer'@'%';

    REVOKE

    撤回某个账户的权限使用关键字 revoke。语法:

    1
    revoke operate1,operate2,...,operateN ON db.tableName FROM 'user'@'[%|localhost]';

    高级SQL

    聚合操作 count()、sum()、max()、min()、GROUP BY 、HAVING 、WITH ROLLUP