三大范式
- 第一范式的目标是确保每列的原子性,每列都是不可再分的最小数据单元。
- 第二范式要求每个表只描述一件事情
- 第三范式要求表中的各列必须和主键直接相关,不能间接相关
MySQL的运行机制
基础SQL语句
使用数据前必须先选择该数据库!
mysql> create database myblog; 创建数据库
mysql> show databases; 查看数据库列表
mysql> use myblog; 选择数据库(数据库不存在,报错)
mysql> drop database myblog; 删除数据库
mysql> show tables;查看当前数据库中的表
结构化查询语言
- DML(数据库操作语言):用来操作数据库
- 所包含的数据。insert update delete
- DDL(数据定义语言):用于创建和删除数据库对象操作。create drop alter
- DQL(数据查询语言):用来对数据库中的数据进行查询。select
- DCL(数据库控制语言):用来控制数据库组件的存取许可、存取权限等。grant commit rollback
MySql数据类型
- 数值类型
- 字符串、日期类型
补充:
unsigned属性 标识为无符号数
zerofill 宽度(位数)不足以0填充
若某数值字段指定了zerofill属性将自动添加unsigned属性
若日期字段默认值为当前日期,一般设置为timestamp类型
mysql> use myblog;使用myblog数据库
mysql> create table `tb_type`(
-> `sid` int(4) zerofill,
->`id` int(4) unsigned
-> ); 创建表并指定列
mysql> insert into `tb_type` value(12,123),(123222,2),(66,6666); 插入测试数据
测试结果:
+--------+------+
| sid | id |
+--------+------+
| 0012 | 123 |
| 123222 | 2 |
| 0066 | 6666 |
+--------+------+
创建表的语法
create table [if not exists] 表名(
字段一 数据类型 [字段属性|约束][索引][注释],
······
字段n 数据类型 [字段属性|约束][索引][注释]
)[表类型][表字符集][注释];
注:
多字段使用逗号分隔
保留字用撇号括起来
单行注释 #注释内容
多行注释 /*内容*/
#这是被单行注释注释掉的内容
/*
这是
被多行注释
注释掉的文本
内容
*/
字段的约束及属性
名称 | 关键字 | 说明 |
---|---|---|
非空约束 | not null | 字段不允许为空 |
默认约束 | default | 赋予某字段默认值 |
唯一约束 | unique key(UK) | 设置字段的值是唯一的允许为空,但只能有一个空值 |
主键约束 | primary key(PK) | 设置该字段为表的主键 可唯一标识该表记录 |
外键约束 | foreign key(FK) | 用于在两表之间建立关系,需指定引用主表的那一字段 |
自动增长 | auto_increment | 设置该列为自增字段 默认每条自增1 通常用于设置主键 |
# 主键
mysql> create table student(
-> `studentNo` int(4) primary key
-> );
结果:
mysql> desc student;#查看表结构
+-----------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------+------+-----+---------+-------+
| studentNo | int(4) | NO | PRI | NULL | |
+-----------+--------+------+-----+---------+-------+
#注释
#创建表时写注释
mysql> create table test(
-> `id` int(11) unsigned comment '编号'
->)comment='测试表';
#修改表的注释
mysql> alter table test comment '修改后的注释';
#修改字段的注释 字段名和字段类型照写就行
mysql> alert table test modify column id int comment '修改后的内容';
mysql> alter table test modify column name varchar(255) comment '修改';
#设置字符集编码
mysql> create table [if not exists] 表名(
-> #省略代码
->) charset=字符集名;
MySQL使用SQL语句查询数据库所有表注释 已有表字段注释
-
要查询数据库
myblog
下所有表名以及表注释/* 查询数据库 ‘mammothcode’ 所有表注释 */ mysql> SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.TABLES WHERE table_schema='myblog';
- 要查询表字段的注释
/* 查询数据库 ‘myblog’ 下表 ‘test’ 所有字段注释 */
mysql> SELECT COLUMN_NAME,column_comment FROM INFORMATION_SCHEMA.Columns WHERE table_name='test' AND table_schema='myblog';
- 一次性查询数据库 "myblog" 下表注释以及对应表字段注释
mysql> SELECT t.TABLE_NAME,t.TABLE_COMMENT,c.COLUMN_NAME,c.COLUMN_TYPE,c.COLUMN_COMMENT FROM information_schema.TABLES t,INFORMATION_SCHEMA.Columns c WHERE c.TABLE_NAME=t.TABLE_NAME AND t.`TABLE_SCHEMA`='myblog';
-
查看表注释 在生成的sql语句中查看
mysql> show create table test;
-
查看字段注释 show
mysql> show full columns from test;
查看表
#查看表是否存在
mysql> use myblog;
mysql> show tables;
#查看表定义
describe 表名;或desc 表名;
删除表
drop table [if exists] 表名;
#删除表之前 先使用if exists语句验证表是否存在
MySQL的存储引擎
类型
MyISAM、InnoDB、Memory等9种。
MyISAM与InnoDB类型的主要区别
名称 | InnoDB | MyISAM |
---|---|---|
事务处理 | 支持 | 不支持 |
数据行锁定 | 支持 | 不支持 |
外键约束 | 支持 | 不支持 |
全文索引 | 不支持 | 支持 |
表空间大小 | 较大 约2倍 | 较小 |
适用场合
- 使用InnoDB:多删除、更新操作,安全性高,事务处理及并发控制
- 使用MyISAM:不需事务 空间小 以查询访问为主
查看表存储引擎
方法一:show create table test;
方法二:
mysql> show table status from myblog where name='test' G;
#结果
*************************** 1. row ***************************
Name: test
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2018-11-21 08:34:17
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment: 修改后的表的注释
1 row in set (0.00 sec)
方法三:
mysql> select table_catalog
-> ,table_schema
-> ,table_name
-> ,engine
-> from information_schema.tables
-> where table_schema='myblog' and table_name='test';
+---------------+--------------+------------+--------+
| table_catalog | table_a | table_name | engine |
+---------------+--------------+------------+--------+
| def
| myblog | test | InnoDB |
+---------------+--------------+------------+--------+
1 row in set (0.00 sec)
场景模拟:
-
场景一:查询整个MySQL实例里面存储引擎为MyISAM的表
mysql> select table_catalog -> ,table_schema -> ,table_name -> ,engine -> from information_schema.tables -> where engine='MyISAM';
-
场景二:查询myblog数据库里面存储引擎为MyISAM的表
mysql> select table_catalog -> ,table_schema -> ,table_name -> ,engine -> from information_schema.tables -> where table_schema='myblog' and engine='InnoDB';
修改默认存储引擎
修改my.ini配置文件
default-storage-engine= InnoDB
改为其他存储引擎 重启服务后执行上面语句查看修改结果
设置表的存储引擎
create table 表名{
#省略代码
}engine=存储引擎;
eg:
mysql>CREATE TABLE `myisam` (
-> id INT(4)
->)ENGINE=MyISAM;
数据表存储位置
MyISAM类型表文件
- *.frm:表结构定义文件
- *.MYD:数据文件
- *.MYI:索引文件
InnoDB类型表文件
- *.frm:表结构定义文件
- ibdata1文件
存储位置:因操作系统而异,可查my.ini 比如windows 我拿的作为例子
my.ini位置C:ProgramDataMySQLMySQL Server 5.7my.ini
MySQL系统帮助
help 查询内容;
help contents;
help Data Types;
help INT;