MySQL基础整理

Posted 谁叫土豆豆豆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL基础整理相关的知识,希望对你有一定的参考价值。

SQL基本操作

将SQL的基本操作根据操作对象进行分类 ,分为三类: 库操作, 表操作(字段), 数据操作

一、库操作:对数据库的增删改查

1、新增数据库

Create database 数据库名字 [库选项];

库选项: 用来约束数据库, 分为两个选项

字符集设定: charset/character set 具体字符集(数据存储的编码格式): 常用字符集: GBK和UTF8

校对集设定: collate 具体校对集(数据比较的规则)

 

2、查看数据库

(1)查看所有数据库: show databases;

(2)查看指定部分的数据库: 模糊查询

Show databases like ‘pattern’;       -- pattern是匹配模式

(3)查看数据库的创建语句: show create database 数据库名字;

 

3、更新数据库

注意:数据库名字不可以修改.

数据库的修改仅限库选项: 字符集和校对集(校对集依赖字符集)

Alter database 数据库名字 [库选项];

Charset/ character set [=] 字符集

Collate 校对集

 

4、删除数据库

Drop database 数据库名字;

 

二、表操作

1、新增数据表

Create table [if not exists] 表名(
字段名字 数据类型,
字段名字 数据类型    -- 最后一行不需要逗号
)[表选项];

If not exists: 如果表名不存在,那么就创建,否则不执行创建代码: 检查功能

表选项: 控制表的表现

字符集: charset/character set 具体字符集;  -- 保证表中数据存储的字符集

校对集: collate 具体校对集;

存储引擎: engine 具体的存储引擎(innodb和myisam)

进入数据库环境: use 数据库名字;

mysql> create table student(
    -> name varchar(10),
    -> gender varchar(10),
    -> number varchar(10),
    -> age int
    -> )charset utf8;

 

2、查看数据表

(1)查看所有表: show tables;

(2)查看部分表: 模糊匹配: show tables like ‘pattern’;

(3)查看表的创建语句: show create table 表名;

(4)查看表结构: 查看表中的字段信息

 

3、修改数据表

表本身存在, 还包含字段: 表的修改分为两个部分: 修改表本身和修改字段

(1)修改表本身:表本身可以修改: 表名和表选项

  • 修改表名: rename table 老表名 to 新表名;

(2)修改表选项: 字符集,校对集和存储引擎

  • Alter table 表名 表选项 [=] 值;

 

4、修改字段:新增, 修改, 重名, 删除

(1)新增字段

Alter table 表名 add [column] 字段名 数据类型 [列属性] [位置];

位置: 字段名可以存放表中的任意位置

First: 第一个位置

After: 在哪个字段之后: after 字段名;

默认的是在最后一个字段之后

mysql> alter table student
    -> add column id int
    -> first;

(2)修改字段

  • Alter table 表名 modify 字段名 数据类型 [属性] [位置];
mysql> alter table student
    -> modify number char(10) after id;

(3)重命名字段

  • Alter table 表名 change 旧字段 新字段名 数据类型 [属性] [位置];
mysql> alter table student
    -> change gender sex varchar(10);

(4)删除字段

  • Alter table 表名 drop 字段名;
mysql> alter table student
    -> drop age;

(5)删除数据表

  • Drop table 表名1,表名2...; -- 可以一次性删除多张表

 

三、数据操作:增删改查

1、新增数据

  • 给全表字段插入数据, 不需要指定字段列表: 要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致: 凡是非数值数据,都需要使用引号(建议是单引号)包裹
  • Insert into 表名 values(值列表)[,(值列表)];      -- 可以一次性插入多条记录
mysql> insert into student values(1,\'itcast0001\',\'Jim\',\'male\'),
    -> (2,\'itcast0002\',\'Hanmeimei\',\'female\');
  • 给部分字段插入数据,需要选定字段列表: 字段列表出现的顺序与字段的顺序无关; 但是值列表的顺序必须与选定的字段的顺序一致.
  • Insert into 表名 (字段列表) values (值列表)[,(值列表)];
mysql> insert into student(number,sex,name,id) values
    -> (\'itcast0003\',\'male\',\'Tom\',3),
    -> (\'itcast0004\',\'female\',\'lily\',4);

 

2、查看数据

  • 查看所有数据:Select */字段列表 from 表名 [where条件];

mysql> select * from student;
  • 查看指定字段,指定条件的数据.

 select id,number,sex,name from student where id = 1;

 

3、更新数据

  • Update 表名 set 字段 = 值 [where条件];       -- 建议都有where: 要不是更新全部
mysql> update student set sex = \'female\' where name = \'Jim\';

更新不一定会成功: 如没有真正要更新的数据

 

4、删除数据

  • Delete from 表名 [where条件];
mysql> delete from student where sex = \'male\';

 

四、中文数据问题

五、数据类型(列类型)

  • SQL中将数据类型分成了三大类: 数值类型, 字符串类型和时间日期类型

1、数值型

数值型数据: 都是数值

系统将数值型分为整数型和小数型.

 

2、整数型

存放整型数据: 在SQL中因为更多要考虑如何节省磁盘空间,所以系统将整型又细分成了5类:

  • Tinyint: 迷你整型,使用一个字节存储, 表示的状态最多为256种(常用)
  • Smallint: 小整型,使用2个字节存储,表示的状态最多为65536种
  • Mediumint: 中整型, 使用3个字节存储
  • Int: 标准整型, 使用4个字节存储(常用)
  • Bigint: 大整型,使用8个字节存储

 

3、小数型

小数型: 带有小数点或者范围超出整型的数值类型.

SQL中: 将小数型细分成两种: 浮点型和定点型

浮点型: 小数点浮动, 精度有限,而且会丢失精度

定点型: 小数点固定, 精度固定, 不会丢失精度

(1)浮点型

浮点型数据是一种精度型数据: 因为超出指定范围之后, 会丢失精度(自动四舍五入)

浮点型: 理论分为两种精度

  • Float: 单精度, 占用4个字节存储数据, 精度范围大概为7位左右
  • Double: 双精度,占用8个字节存储数据, 精度方位大概为15位左右

(2)定点型

  • 定点型: 绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分有可能(理论小数部分也不会丢失精度)

 

4、时间日期类型

  • Datetime: 时间日期, 格式是YYYY-mm-dd HH:ii:ss,表示的范围是从1000到9999年,有0值: 0000-00-00 00:00:00
  • Date: 日期,就是datetime中的date部分
  • Time: 时间(段), 指定的某个区间之间, -时间到+时间
  • Timestamp: 时间戳, 并不是时间戳,只是从1970年开始的YYYY-mm-dd HH:ii:ss格式与datetime完全一致
  • Year: 年份,两种形式, year(2)和year(4): 1901-2156

创建时间表:

mysql> create table my_date(
    -> d1 datetime,
    -> d2 date,
    -> d3 time,
    -> d4 timestamp,
    -> d5 year
    -> )charset utf8;

插入数据:

mysql> insert into my_date values(\'2018-8-30 16:42:40\',\'2018-8-30\',\'16:42:40\',\'2018-8-30 16:43:41\',2018);
Query OK, 1 row affected (0.09 sec)

时间使用负数:

mysql> insert into my_date values(\'2018-8-30 16:42:40\',\'2018-8-30\',\'-16:42:40\',\'2018-8-30 16:43:41\',2018);
Query OK, 1 row affected (0.07 sec)

mysql> insert into my_date values(\'2018-8-30 16:42:40\',\'2018-8-30\',\'-211:42:40\',\'2018-8-30 16:43:41\',2018);
Query OK, 1 row affected (0.15 sec)

mysql> insert into my_date values(\'2018-8-30 16:42:40\',\'2018-8-30\',\'-2:42:40\',\'2018-8-30 16:43:41\',2018);
Query OK, 1 row affected (0.10 sec)

year可以使用2位:

mysql> insert into my_date values(\'2018-8-30 16:42:40\',\'2018-8-30\',\'16:42:40\',\'2018-8-30 16:43:41\',69);
Query OK, 1 row affected (0.04 sec)

mysql> insert into my_date values(\'2018-8-30 16:42:40\',\'2018-8-30\',\'16:42:40\',\'2018-8-30 16:43:41\',70);
Query OK, 1 row affected (0.08 sec)

Timestamp字段: 只要当前所在的记录被更新, 该字段一定会自动更新成当前时间

mysql> update my_date set d1 = \'2018-8-30 16:53:50\' where d5 = 2069;
Query OK, 1 row affected (0.10 sec)

 

5、字符串类型

在SQL中,将字符串类型分成了6类: char,varchar,text , blob, enum和set

(1)定长字符串

  • Char(L): L代表length, 可以存储的长度, 单位为字符, 最大长度值可以为255.
  • Char(4): 在UTF8 环境下,需要4 * 3 = 12个字节

(2)变长字符串

变长字符串: varchar, 在分配空间的时候, 按照最大的空间分配: 但是实际上最终用了多少,是根据具体的数据来确定.

Varchar(L): L表示字符长度 理论长度是65536个字符, 但是会多处1到2个字节来确定存储的实际长度: 但是实际上如果长度超过255,既不用定长也不用变长, 使用文本字符串text

Varchar(10): 的确存了10个汉字, utf8环境, 10 * 3 + 1 = 31(bytes), 存储了3个汉字: 3 * 3 + 1 = 10(bytes)

(3)文本字符串

如果数据量非常大, 通常说超过255个字符就会使用文本字符串

(4)枚举字符串

枚举: enum, 事先将所有可能出现的结果都设计好, 实际上存储的数据必须是规定好的数据中的一个

枚举的使用方式

定义: enum(可能出现的元素列表);    //如enum(‘男’,’女’,’不男不女’,’妖’,’保密’);

使用: 存储数据,只能存储上面定义好的数据

mysql> create table my_enum(
    -> gender enum(\'\',\'\',\'保密\')
    -> )charset utf8;

插入数据:

mysql> insert into my_enum values(\'\'),(\'保密\');
Query OK, 2 rows affected (0.10 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into my_enum values(\'male\');
ERROR 1265 (01000): Data truncated for column \'gender\' at row 1

枚举原理: 枚举在进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中):

然后在进行数据插入的时候,系统自动将字符转换成对应的数字存储, 然后在进行数据提取的时候, 系统自动将数值转换成对应的字符串显示

因为枚举实际存储的是数值,所以可以直接插入数值.

mysql> insert into my_enum values(1),(2);

(5)集合字符串

 

六、列属性

列属性: 真正约束字段的是数据类型, 但是数据类型的约束很单一. 需要有一些额外的约束, 来更加保证数据的合法性.

列属性有很多: NULL/NOT NULL, default, Primary key, unique key, auto_increment, comment

1、空属性

mysql> create table my_class(
    -> name varchar(20) not null,
    -> room varchar(20) null
    -> )charset utf8;

2、列描述

3、默认值

默认值: 某一种数据会经常性的出现某个具体的值, 可以在一开始就指定好: 在需要真实数据的时候,用户可以选择性的使用默认值.

默认值关键字: default

mysql> create table my_default(
    -> name varchar(20) not null,
    -> age tinyint unsigned default 0,
    -> gender enum(\'\',\'\',\'保密\') default \'\'
    -> )charset utf8;

默认值的生效: 使用, 在数据进行插入的时候,不给该字段赋值

mysql> insert into my_default (name) values(\'高强\');

想要使用默认值,可以不一定去指定列表,故意不使用字段列表: 可以使用default关键字代替值

mysql> insert into my_default values(\'张三\',18,default);

 

七、字段属性

主键,唯一键和自增长

1、主键

主键: primary key,主要的键. 一张表只能有一个字段可以使用对应的键, 用来唯一的约束该字段里面的数据, 不能重复: 这种称之为主键.

一张表只能有最多一个主键

(1)增加主键

  • 在创建表的时候,直接在字段之后,跟primary key关键字(主键本身不允许为空)
mysql> create table my_pri1(
    -> name varchar(20) not null,
    -> number char(10) primary key
    -> )charset utf8;

优点: 非常直接; 缺点: 只能使用一个字段作为主键

  • 在创建表的时候, 在所有的字段之后, 使用primary key(主键字段列表)来创建主键(如果有多个字段作为主键,可以是复合主键)
mysql> create table my_pri2(
    -> number char(10),
    -> course char(10),
    -> score tinyint unsigned default 60,
    -> primary key(number,course)
    -> )charset utf8;

  • 当表已经创建好之后, 额外追加主键: 可以通过修改表字段属性, 也可以直接追加.
  • Alter table 表名  add primary key(字段列表);
mysql> create table my_pri3(
    -> course char(10) not null,
    -> name varchar(10) not null
    -> )charset utf8;

mysql> alter table my_pri3 add primary key(course);

 

(3)主键约束

主键对应的字段中的数据不允许重复: 一旦重复,数据操作失败(增和改)

主键冲突:

mysql> insert into my_pri1 values(\'李四\',\'itcast0002\');
ERROR 1062 (23000): Duplicate entry \'itcast0002\' for key \'PRIMARY\'

mysql> insert into my_pri2 values(\'itcast0001\',\'39010001\',100);
ERROR 1062 (23000): Duplicate entry \'itcast0001-39010001\' for key \'PRIMARY\'

(4)更新主键&删除主键

注意:没有办法更新主键: 主键必须先删除,才能增加.

mysql> alter table my_pri3 drop primary key;

 (5)主键分类

在实际创建表的过程中, 很少使用真实业务数据作为主键字段(业务主键,如学号,课程号);

大部分的时候是使用逻辑性的字段(字段没有业务含义,值是什么都没有关系), 将这种字段主键称之为逻辑主键.

mysql> create table my_student(
    -> id int primary key auto_increment, --逻辑主键:自增长
    -> number char(10) not null,
    -> name varchar(10) not null
    -> )charset utf8;

(6)自动增长

自增长: 当对应的字段,不给值,或者说给默认值,或者给NULL的时候, 会自动的被系统触发, 系统会从当前字段中已有的最大值再进行+1操作,得到一个新的在不同的字段.

自增长通常是跟主键搭配.

 (7)新增自增长

自增长特点: auto_increment

  • 任何一个字段要做自增长必须前提是本身是一个索引(key一栏有值)
mysql> create table my_auto(
    -> id int auto_increment,
    -> name varchar(10) not null
    -> )charset utf8;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
  • 自增长字段必须是数字(整型)
mysql> create table my_auto(
    -> id varchar(1) primary key auto_increment,
    -> name varchar(10) not null
    -> )charset utf8;
ERROR 1063 (42000): Incorrect column specifier for column \'id\'
  • 一张表最多只能有一个自增长
mysql> create table my_auto(
    -> id int primary key auto_increment,
    -> name varchar(10) not null,
    -> class int primary key auto_increment
    -> )charset utf8;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

(8)自增长使用

  • 当自增长被给定的值为NULL或者默认值的时候会触发自动增长
mysql> insert into my_auto(name) values(\'王五\');
Query OK, 1 row affected (0.15 sec)

mysql> insert into my_auto values(null,\'张三\');
Query OK, 1 row affected (0.12 sec)

mysql> insert into my_auto values(default,\'李四\');
Query OK, 1 row affected (0.05 sec)

  • 自增长如果对应的字段输入了值,那么自增长失效: 但是下一次还是能够正确的自增长(从最大值+1)
mysql> insert into my_auto values(6,\'Tom\');
Query OK, 1 row affected (0.07 sec)

mysql> insert into my_auto values(null,\'Jack\');
Query OK, 1 row affected (0.11 sec)

(9)修改自增长

自增长如果是涉及到字段改变: 必须先删除自增长,后增加(一张表只能有一个自增长)

修改当前自增长已经存在的值: 修改只能比当前已有的自增长的最大值大,不能小(小不生效)

Alter table 表名 auto_increment  = 值;

  • 向下修改
mysql> alter table my_auto auto_increment = 4;
Query OK, 0 rows affected (0.10 sec)

  • 向上修改
mysql> alter table my_auto auto_increment = 10;
Query OK, 0 rows affected (0.17 sec)

  • 考: 为什么自增长是从1开始?为什么每次都是自增1呢?

可以修改变量实现不同的效果: 修改是对整个数据修改,而不是单张表: (修改是会话级)

mysql> set auto_increment_increment = 5;
Query OK, 0 rows affected (0.00 sec)

(10)删除自增长

自增长是字段的一个属性: 可以通过modify来进行修改(保证字段没有auto_increment即可)

Alter table 表名 modify 字段 类型;

mysql> alter table my_auto modify id int primary key;   ---错误:主键理论上单独存在
ERROR 1068 (42000): Multiple primary key defined
mysql> alter table my_auto modify id int;    ---有主键的时候,千万不要再加主键
Query OK, 5 rows affected (0.79 sec)

 

2、唯一键

一张表往往有很多字段需要具有唯一性,数据不能重复: 但是一张表中只能有一个主键: 唯一键(unique key)就可以解决表中有多个字段需要唯一性约束的问题.

唯一键的本质与主键差不多: 唯一键默认的允许自动为空,而且可以多个为空(空字段不参与唯一性比较)

(1)增加唯一键

  • 在创建表的时候,字段之后直接跟unique/ unique key
mysql> create table my_unique1(
    -> number char(10) unique,
    -> name varchar(20) not null
    -> )charset utf8;
Query OK, 0 rows affected, 1 warning (0.50 sec)

  • 在所有的字段之后增加unique key(字段列表); -- 复合唯一键