MySQL 数据库

服务器启动和关闭

Windows:services.msc 查看服务信息,可以启动和关闭 MySQL 服务

Command:net start mysql | net stop mysql ,启动和停止 MySQL 服务

连接操作

连接:mysql -h (ip) -u username -p passwordmysql --user=username --password=password

断开:exit; quit;

DDL 操纵数据库、表

操作 操作语句 操作 操作语句
创建库 create database if not exists db_name character set 字符集; 创建 create table table_name (字段列表);
查询数据库 show databases; 显示 show tables;
库创建语句 show create database db_name; 查表结构 desc table_name;
修改数据库 alter database db_name character set 字符集; 修改 alter table t1 rename t2;
删除数据库 drop database if exists db_name; 删除 drop table table_name;
查询当前使用数据库 select database(); 清空 delete from table_name;
使用数据库 use db_name;

数据库字段数据类型:

数据类型 字节数 语法 描述
char 0-255 char(20) 定长字符串,存储右空格填充到指定的长度,默认1
varchar 0-65535 varchar(20) 变长字符串,创建VARCHAR类型字段必须定义长度
int 4 int 整型数据类型,MySQL中整型默认是带符号的
float 4 float(M,D) 单精度浮点型,显示长度(M)和小数位数(D),默认(10,2)
double 8 double(M,D) 双精度浮点型,存在精度丢失问题,默认为(16,4)
decimal M/D+2 decimal(M, D) 定点型,以字符串形式进行保存,默认为decimal(10, 0)
date 3 date yyyy-MM-dd,存储日期值
time 3 time HH:mm:ss,存储时分秒
datetime 8 datetime yyyy-MM-dd HH:mm:ss,存储日期+时间
timestamp 4 timestamp yyyy-MM-dd HH:mm:ss,存储日期+时间,可作时间戳

JAVA数据类型和MYSQL数据类型对应关系表:

JAVA 类型 SQL 类型
boolean BIT
byte TINYINT
short SMALLINT
int INTEGER
long BIGINT
String CHANR,VARCHAR,LONGVARCHAR
byte array BINARY VAR BINARY
java.sql.Date DATE
java.sql.Time TIME
java.sql.Timestamp TIMESTAMP

DML 增删改表数据

添加数据

  • INSERT INTO table_name(field1,field2,…) VALUES (field1_value,field2_value,…);
  • INSERT INTO table_name VALUES(value1,value2,…); – 需要给所有列添加值
  • 除了数字类型和 NULL,其他类型需要使用引号引起来

删除数据

  • DELETE FROM table_name WHERE condition;
  • DELETE FROM table_name; – 清空表数据
  • TRUNCATE TABLE table_name; – 删除表,然后再创建一个一模一样的空表

修改数据

  • UPDATE table_name SET field1 = value1, field2 = value2 [WHERE condition];
  • 如果不添加 where 条件,则会将表中所有记录全部修改

DQL 查询表数据

SELECT 字段列表 FROM 表明列表 WHERE 条件列表;

  • [ GROUP BY 分组字段] [ HAVING 分组后条件] [ORDER BY 排序字段] [LIMIT 分页]

  • 去重 distinct:SELECT DISTINCT FROM table_name WHERE condition;

  • NULL 值参与运算 IFNULL(expr1,expr2) : expr1 — 需要判断是否为 null 的字段,expr2 — null 值的替换值

WHERE 子条件的条件运算符

运算符类型 运算符
比较运算符 =、<> / !=、>、<、>=、<=
逻辑运算符 && / AND 、|| / OR、! / NOT
范围限定运算符 (NOT) BETWEEN … AND … ,判断某个字段的值是否在给定的两个数据范围之间
范围包含运算符 (NOT) IN (var1,var2,…),判断某个字段的值是否存在指定的值列表中
模糊查询运算符 (NOT) LIKE,判断某个字符字段的值是否包含给定的字符;%,代表任意字符;_,单个任意字符
存在运算符 IS,判断一个字段值是否存在或不存在;只有两种写法 IS NULL / IS NOT NULL

排序查询

SELECT 字段列表 FROM 表明列表 WHERE 条件列表 ORDER BY 排序字段;

  • 语法:ORDER BY 排序字段1 排序方式1, 排序字段2 排序方式2 …
  • 排序方式:ASC 默认值,升序;DESC 降序
  • 多个排序条件:前面的条件值一样时,才会判断第二条件

聚合函数

将一类数据作为一个整体,进行纵向的计算。

表达式 描述
MAX 最大值 CONCAT 拼接字符串显示
MIN 最小值 CONCAT_WS 使用统一符号拼接字段
AVG 平均值 GROUP_CONCAT 分组后的字段,拼接字符串显示
COUNT 计算个数,选择非空列(主键)
SUM 求和计算

分组查询

SELECT 字段列表 FROM 表明列表 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组后条件;

  • 语法:GROUP BY 分组字段;
  • 分组之后查询的字段:分组字段、聚合函数
  • 使用 HAVING 进行分组后结果过滤;HAVING 分组后条件

HAVING 的语法格式与 WHERE 一致,但是两者使用方式不一样:

  • WHERE 在分组之前进行限定,如果不满足条件则不参与分组;HAVING 是在分组之后进行的过滤,如果不满足条件,则不会被查询出来
  • WHERE 不能用聚合函数,但是 HAVING 可以进行聚合函数的判断.

分页查询

SELECT 字段列表 FROM 表明列表 WHERE 条件列表 LIMIT from_index,page_counts;

  • 语法:LIMIT from_index,page_counts; from_index — 开始索引位置,page_counts — 每页显示的条数
  • 开始的索引 = (当前的页码 - 1) * 每页显示的条数

多表查询

完成多表查询,需要消除无用的数据。

内连接查询:从哪些表中查(tables);条件是什么(condetion),查询哪些字段(fields)

  • 隐式内连接:使用 WHERE 条件消除无用数据
  • 显示内连接:使用 [INNER] JOIN,两个表都满足该条件
    • SELECT 字段列表 FROM table1 [INNER] JOIN table2 ON condetion WHERE condetion;

外连接查询:

  • 左外连接:使用 LEFT [OUTER] JOIN;查询的是左表所有数据以及其交集数据
    • SELECT 字段列表 FROM table1 LEFT [OUTER] JOIN table2 ON condetion WHERE condetion;
  • 右外连接:使用 RIGHT [OUTER] JOIN;查询的是右表所有数据以及其交集数据
    • SELECT 字段列表 FROM table1 RIGHT [OUTER] JOIN table2 ON condetion WHERE condetion;

子查询:查询中嵌套查询,嵌套的查询内容为子查询

  • 单行单列结果集的子查询
    • 子查询可以作为条件,使用运算符 ( >、<、>=、<=、= ) 进行判断
  • 多行单列结果集的子查询
    • 子查询可以作为条件,使用运算符 IN 进行判断
  • 多行多列结果集的子查询
    • 子查询可以作为一张虚拟表参与查询;可以使用表连接替代

约束

对表中的数据进行限定,保证数据的正确性、有效性和完整性。

主键约束PRIMARY KEY 要求被装饰的字段:唯一和非空;联合主键:在表创建结尾,PRIMARY KEY(field1,field2)

  • 删除主键:ALTER TABLE table_name DROP PRIMARY KEY;
  • 创建表后添加主键:ALTER TABLE table_name MODIFY key_field INT PRIMARY KEY;

唯一约束UNIQUE 要求被装饰的字段:唯一;联合唯一:在表创建结尾,UNIQUE(字段1,字段2)

  • 删除唯一约束:ALTER TABLE table_name DROP INDEX unique_field;
  • 创建表后添加唯一约束:ALTER TABLE table_name MODIFY unique_field VARCHAR(10) UNIQUE;

非空约束NOT NULL 要求被装饰的字段:非空

  • 删除非空约束:ALTER TABLE table_name MODIFY notnull_field VARCHAR(10);

  • 创建表后添加非空约束:ALTER TABLE table_name MODIFY notnull_field VARCHAR(10) NOT NULL;

自动增加AUTO_INCREMENT 自动增加,需要和主键 PRIMARY KEY 同时用

  • 删除自动增长:ALTER TABLE table_name MODIFY auto_key_field INT;
  • 创建表后添加自增:ALTER TABLE table_name MODIFY auto_key_field INT AUTO_INCREMENT;

外键约束FOREIGN KEY 某主表的外键

  • CONSTRAINT fk_field_name FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名称);
  • 删除外键:ALTER TABLE table_name DROP FOREIGN KEY fk_field_name;
  • 创建表后添加外键:ALTER TABLE table_name ADD CONSTRAINT fk_field_name FOREIGN KEY (外键字段名) REFERENCES 主表(主表字段名);
  • 级联操作:在定义外键的语句后面添加 — 级联更新: ON UPDATE CASCADE ,级联删除: ON DELETE CASCADE

设置默认值:DEFAULT 为该属性设置默认值

不足位数默认填充0:ZEROFILL 在int、char中使用

数据库范式

多表之间的关系

表关系 实现方式
一对一 可以在任意一方添加唯一外键指向另一方的主键,一般会合成到一张表
一对多(多对一) 在多的一方建立外键,指向一的一方的主键
多对多 添加中间表,至少包含两个字段,作为中间表的外键,分别指向两张表的主键

规范

设计关系数据库时,遵循不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的“范式”;各种范式呈递次规范,符合高一级范式的设计,必定符合低一级范式;越高的范式数据库冗余越小。

但是有些时候一昧的追求范式减少冗余,反而会降低数据读写的效率,这个时候就要反范式,利用空间来换时间。

范式分类:

范式 描述
第一范式(1NF) 每一列都是不可分割的原子数据项,与其它列名不重复
第二范式(2NF) 在 1NF 的基础上,非码属性必须完全依赖于候选码(消除了非主属性对于 key 的部分函数依赖) ;如果依赖于主键,则需要依赖于所有主键,不能存在依赖部分主键的情况
第三范式(3NF) 在 2NF 的基础上,任何非主属性不依赖其它非主属性(消除了非主属性对于 key 的传递函数依赖);副键与副键之间,不能存在依赖关系
巴斯-科德范式(BCNF) 在 3NF 的基础上,消除主属性对于码的部分与传递函数依赖
第四范式(4NF) 在 3NF 的基础上,消除表中的多值依赖

依赖解析:

  • 函数依赖:如果通过 A 属性(属性组),可以确定唯一 B 属性的值,那么 B 依赖于 A。

  • 完全函数依赖:如果 A 是一个属性组,则 B 属性值的确定需要依赖于 A 属性组中的所有的属性值。属性组是指多个字段。

  • 部分函数依赖:如果 A 是一个属性组,则 B 属性值的确定需要依赖 A 属性组的某一些字段即可。

  • 传递函数依赖:如果 A 属性(属性组),可以确定唯一个 B 属性的值,再通过 B 属性的值又可以唯一确定 C 属性的值。

  • 主键:在一张表中,一个属性(属性组),被其他所有属性完全依赖,则称这个属性为该表的key(键值)。

MySQL 复杂操作

操作 操作语句
备份数据库 mysqldump -h(ip) -uroot -p(password) databasename > database.sql
恢复数据库 mysql -h (ip) -u root -p(password) databasename < database.sql
复制数据库 mysqldump –all -databases > all -databases.sql
备份表 mysqldump -h(ip) -u root -p(password) databasename tablename > tablename.sql
恢复表: (操作前先把原来表删除) mysql binmysql -h(ip) -u root -p(password) databasename tablename < tablename.sql
增加列 ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,ADD INDEX (c);
修改列 ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
删除列 ALTER TABLE t2 DROP COLUMN c;
修复数据库 mysql check -A -o -u root -p 54safer
文本数据导入 load data local in file “file_name” into table table_name;