You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
hutao/docs/MySQL/mysql是怎样使用的.md

13 KiB

小孩子4919

第一章 MYSQL的安装启动和关闭

  • windows上使用命令操作mysql
# MySQL80是服务名
net start MySQL80
net stop MySQL80

第二章 MYSQL初体验

2.1 客户端/服务器

  • SQL(Structured Query Language): 结构化查询语言

2.2 bin目录下的可执行文件

  • 采用命令行启动mysqld服务
mysqld 
# 指定数据库数据存储目录
mysqld --datadir="C:/ProgramData/MySQL/Data"
# 查看运行日志
mysqld --console
# 如果出现无法写入  可能需要使用管理员权限,因为数据放在了c盘
  • mysql客户端
# -p何密码之间不能有空格
# 在unix系统上,不适用u参数,会默认使用用户操作系统的账户进入mysql
mysql -hlocalhost -uroot -p123456
mysql -h localhost -u root -p123456
mysql --host=localhost --user=root --password=123456
mysql -uroot -p123456 database_name
# 带上数据库名称进去默认是这个数据库

# 退出
quit
exit
\q

2.3 MYSQL语句注意事项

  • 语句结束符
;
\g
\G
# \G会让一行中的每一列单行显示,对于列数多的情况下,看起来比较清晰
  • 语句可以换行

  • 可以提交多个语句

  • 使用\c放弃操作

  • 没有大小写限制

  • 一般用单引号表示字符串(双引号也可以但是,在ANSI_QUOTES模式中双引号有其他作用)

第三章 MYSQL数据类型

3.1 数值类型

  • TINYINT 2^8 1byte

  • SMALLINT 2^16 2

  • MEDIUMINT 2^24 3

  • INT 2^32 4

  • BIGINT 2^64 8

  • FLOAT 2^32 4

  • DOUBLE 2^64 8

  • 定点类型,将小数从小数点分开存储DECIMAL(M, D)MD分别表示小数左右数字十进制位数

3.2 日期时间类型

  • YEAR 1byte 1901-2155
  • DATE 3Byte 1000-01-01~9999-12-31
  • TIME 3Byte -838:59:59~838:59:59
  • DATETIME 8Byte 1000-01-01 00:00:00~9999-12-31 23:59:59
  • TIMESTAMP 4Byte 1970-01-01 00:00:01~2038-01-19 03:14:07
  • DATETIME 5+sByte 1000-01-01 00:00:00[.000000]~9999-12-31 23:59:59[.000000] mysql5.6.4后增加后三个对微秒支持,可拓展
  • TIMESTAMP 可根据时区变化,而且截止到2038 所以以后不用他

3.3 字符串类型

  • 定长编码格式 ASCII 1Byte,UCS2 2Byte
  • 变长编码格式 UTF-8 1-4Byte,GB2312 1-2Byte
  • mysql的UTF-8是对多3byte,utf8mb4是1-4Byte
类型 描述
char(M) 0-255的长度,定长,不够的字符用空格填充
varchar(M) 变长,0-255:字符长度L * 编码的所占字节数W + 1Byte(这里用来写位置吧)
大于255位置大小变成2Byte,一般最大**容量(不是长度)**为65535,但是mysql规定单行数据不能超过65535Byte,所以肯定是小于65535Byte的,utf8mb4一个字符4Byte,所以。。。65535/4
more TEXT 此长度不受mysql单行最大长度限制
TINYTEXT 2^8-1Byte + 1Byte地址
TEXT 2^16 + 2Byte地址
MEDIUMTEXT 2^24 + 3Byte地址
LONGTEXT 2^32 + 4Byte地址
ENUM & SET ENUM('str1', 'star2', 'str3') SET('str1', 'str2', 'str3')

3.4 二进制类型

  • BIT存2进制位,最大64
  • BINARY和VARBINARY区别前者定长后者变长参考varchar
  • BLOB有四种:TINY*,,MEDIUM, LONG*,一般不用数据库存文件,存文件系统的路径

第四章 数据库的基本操作

4.1 查看数据库

SHOW DATABASES;

4.2 创建数据库

CREATE DATABASE database_name; -- 如果表存在会报错
/* 如果不存在再创建 */
CREATE DATABASE IF NOT EXISTS database_name;

4.3 切换默认数据库

USE database_name;
--     有些账户没有这个数据库的权限 切换会报错

4.4 删库

DROP DATABASE database_name;
--      如果数据库不存在会报错
DROP DATABASE IF EXISTS database_name;

第五章 表操作

5.1 查数据库的表

SHOW TABLES FROM database_name;
-- 如果有默认的数据库 可以直接查看
SHOW TABLES;

5.2 创建表

CREATE TABLE IF NOT EXISTS table_name (
    列明1 数据类型 [列属性],
    列明2 数据类型 [列属性],
) COMMENT '这里是表的注释';

5.3 删除表

DROP TABLE table_name;
DROP TABLE IF EXISTS table_name;

5.4 查看表结构

DESCRIBE table_name;
DESC table_name;
EXPLAIN table_name;
SHOW COLUMNS FROM table_name;
SHOW FIELDS FROM table_name;
-- 以上效果一样
--      查看建表语句
     SHOW CREATE TABLE table_name;

5.5 直接使用某个数据库中的某个表

SHOW CREATE TABLE database_name.tablename;

5.6 修改表

5.6.1 修改表名,移动表

-- 修改表明
ALTER TABLE old_table_name RENAME TO new_table_name;
RENAME TABLE database_name.old_table_name TO database_name.new_table_name;
RENAME TABLE table_a TO table_a_new, table_b TO table_b_new, ...;
RENAME TABLE old_table_name TO new_table_name;
-- 移动表
ALTER TABLE db_a.table_a RENAME TO db_b.table_a;
RENAME TABLE db_a.table_a TO db_b.table_a;

5.6.2 增加列

ALTER TABLE table_name ADD COLUMN 字段名 字段类型 [其他属性];
-- 增加到第一列
ALTER TABLE table_name ADD COLUMN 字段名 字段类型 [其他属性] FIRST;
-- 增加到指定列的后面
ALTER TABLE table_name ADD COLUMN 字段名 字段类型 [其他属性] AFTER 已存在的列名;

5.6.3 删除列

ALTER TABLE 表名 DROP 列名;

5.6.4 修改列信息

ALTER TABLE 表名 MODIFY 列名 新数据类型 [新属性];
ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 [新属性];
-- 修改列排序
ALTER TABLE 表名 MODIFY 列名 列类型 列属性 FIRST;
ALTER TABLE 表名 MODIFY 列名 列类型 列属性 AFTER 指定列名;

5.6.5 多个修改操作

ALERT TABLE 表名 操作1, 操作2, ...;

第六章 列的属性

6.1 简单的查询和插入语句

6.1.1 简单的查询语句

SELECT * FROM table;

6.1.2 简单的插入语句

-- 如果没有指明某个字段的值,即为默认值
INSERT INTO 表名(1, 2, 3) VALUES(1, 2, 3);

6.1.3 批量插入

INSERT INTO 表名(1, 2, 3) VALUES(1, 2, 3), (1, 2, 3), (1, 2, 3);

6.2 列属性

6.2.1 默认值

CREATE TABLE table_name (
    first_column INT DEFAULT '0'
);

6.2.2 NOT NULL

列名 列类型 NOT NULL

6.2.3 主键

-- 单字段主键
CREATE TABLE table_name (
    first_column INT PRIMARY KEY 
);

CREATE TABLE table_name (
    first_column INT PRIMARY KEY,
    PRIMARY KEY (first_column)
);

-- 多字段主键 只能这样设置
CREATE TABLE table_name (
    first_column INT,
    last_column INT,
    PRIMARY KEY (first_column, last_column)
);

6.2.4 UNIQUE约束

  • 希望有其他列或列组合存储值唯一
-- 单个字段约束
CREATE TABLE table_name (
    first_column INT PRIMARY KEY,
    next_column INT UNIQUE ,
    last_column INT
);
-- 多个字段约束
CREATE TABLE table_name (
    first_column INT PRIMARY KEY,
    next_column INT,
    last_column INT,
    UNIQUE KEY 约束名 (next_column, last_column)
);
CREATE TABLE hutao.new_table (
     product_id INT PRIMARY KEY,
     product1 VARCHAR(50),
     product2 VARCHAR(20),
     product3 VARCHAR(50),
     product4 VARCHAR(50),
     product5 VARCHAR(50),
     product6 VARCHAR(50),
     UNIQUE KEY key1 (product1, product2),
     UNIQUE KEY key2 (product5, product6)
);

注意:

  • 一张表只能有一个主键,但是可以有多个UNIQUE约束
  • 主键不允许为NULL,但是UNIQUE可以存,并且允许存在多个,NULL代表没有填写
  • 如果未定义主键,mysql会默认将第一个出现的NOT NULL UNIQUE设置为主键

6.2.3 外键

学生成绩表中携带了学生信息表中的学生id字段,如果学生成绩表中的学生id在学生信息表中不存在,那么此条学生成绩为无意义数据,为避免这种问题,设立外键。
以上学生信息表被称为主表,学生成绩表被称为子表,子表学生成绩表中的学生id为学生成绩表的外键,外键必须是主表的索引,主键和UNIQUE约束自动成索引
  • 写法1(建议):CONSTRAINT [外键名] FOREIGN KEY (字段1, 字段2, 字段3) REFERENCES 主表名(字段1, 字段2, 字段3)
  • 写法2(简写):FOREIGN KEY [外键名] (字段1, 字段2, 字段3) REFERENCES 主表名(字段1, 字段2, 字段3)
CREATE TABLE student_score (
    score_id INT PRIMARY KEY COMMENT '学生成绩表主键',
    student_id INT COMMENT '学生ID',
    score_number INT COMMENT '学生成绩',
    CONSTRAINT FOREIGN KEY (student_id) REFERENCES student_info(student_id)
)

6.2.4 自增 AUTO_INCREMENT

  • 使用整型或浮点型
  • 用法列名 列类型 AUTO_INCREMENT
  • INSERT时将自增列设置为NULL时会自动插入自增值
  • NO_AUTO_VALUE_ZERO是默认不开启的,将0插入自增列也是自增值
  • 如果INSERT显式的插入新的自增值,下一个默认自增值是在显式自增值的基础上增长的
  • 一个表最多只能有一个自增列
  • 自增列必须为索引,主键和UNIQUE默认为索引
  • 自增列不能设置默认值DEFAULT
  • 自增列一般作为主键

6.2.8 列注释

列名 数据类型 COMMENT '注释'

6.2.9 显示宽度和ZEROFILL MYSQL8.0.17不推荐

  • ZEROFILL作用是无符号数字补零
  • 没有显式说明UNSIGNED MYSQL会在建表的时候补上
  • 不同的整数类型默认显示宽度不同
  • 这不会影响存储

列名 数据类型(显示宽度) UNSIGNED ZEROFILL

CREATE TABLE zerofille_table (
    id INT AUTO_INCREMENT ,
    number UNSIGNED INT(5) ZEROFILL
)

6.3 查看表结构时的列属性

表头 说明
Null No/Yes 是否允许为Null
Key PRE/UNI 标记键的信息
Default 默认值
Extra 额外信息,如自增列

6.4 标识符的命名

  • 各种名字不能以空格结尾
  • 可以使用``将带空格的或纯数字包起来 ,但是不建议使用这两个
  • 不能用保留字如DESCRIBE
  • 按照C/C++标准来,建议用下划线区分

第七章 简单查询

7.1 准备

采用mysql是怎样使用的数据初始化7.0.sql导入数据

7.2 查询单个列

  • 方法:SELECT 列名 FROM 表名

7.2.1 列的别名

  • 方法:SELECT 列名 [AS] 列的别名 FROM 表名
SELECT number AS '学号' FROM student_info;
SELECT number '学号' FROM student_info;

7.3 查询多个列

  • 方法:SELECT 列1,列2,列3,列4,列5 FROM 表名;
SELECT 
    number, name, id_number, major 
FROM 
    student_info;
SELECT 
    number '学号', name '姓名', id_number '身份证号', major '专业' 
FROM 
    student_info;

7.4 查询所有列

  • 方法:SELECT * FROM student_info;

7.5 查询结果去重

  • 方法:SELECT DISTINCT department[, 列名] FROM student_info
SELECT DISTINCT department FROM student_info;
SELECT DISTINCT department, major FROM student_info;

7.6 限制结果集合记录条数(分页)

  • 方法:SELECT * FROM table_name LIMIT [起始下标, ]搜寻条数
# 查询前两条
SELECT * FROM student_info LIMIT 2;
# 查询两条,从5+1开始
SELECT * FROM student_info LIMIT 5, 2;

--