> 小孩子4919 # 第一章 MYSQL的安装启动和关闭 - windows上使用命令操作mysql ```cmd # MySQL80是服务名 net start MySQL80 net stop MySQL80 ``` # 第二章 MYSQL初体验 ## 2.1 客户端/服务器 - SQL(Structured Query Language): 结构化查询语言 ## 2.2 bin目录下的可执行文件 - 采用命令行启动mysqld服务 ```cmd mysqld # 指定数据库数据存储目录 mysqld --datadir="C:/ProgramData/MySQL/Data" # 查看运行日志 mysqld --console # 如果出现无法写入 可能需要使用管理员权限,因为数据放在了c盘 ``` - mysql客户端 ```cmd # -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语句注意事项 - 语句结束符 ```bash ; \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 查看数据库 ```sql SHOW DATABASES; ``` ## 4.2 创建数据库 ```sql CREATE DATABASE database_name; -- 如果表存在会报错 /* 如果不存在再创建 */ CREATE DATABASE IF NOT EXISTS database_name; ``` ## 4.3 切换默认数据库 ```sql USE database_name; -- 有些账户没有这个数据库的权限 切换会报错 ``` ## 4.4 删库 ```sql DROP DATABASE database_name; -- 如果数据库不存在会报错 DROP DATABASE IF EXISTS database_name; ``` # 第五章 表操作 ## 5.1 查数据库的表 ```sql SHOW TABLES FROM database_name; -- 如果有默认的数据库 可以直接查看 SHOW TABLES; ``` ## 5.2 创建表 ```sql CREATE TABLE IF NOT EXISTS table_name ( 列明1 数据类型 [列属性], 列明2 数据类型 [列属性], ) COMMENT '这里是表的注释'; ``` ## 5.3 删除表 ```sql DROP TABLE table_name; DROP TABLE IF EXISTS table_name; ``` ## 5.4 查看表结构 ```sql 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 直接使用某个数据库中的某个表 ```sql SHOW CREATE TABLE database_name.tablename; ``` ## 5.6 修改表 ### 5.6.1 修改表名,移动表 ```sql -- 修改表明 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 增加列 ```sql ALTER TABLE table_name ADD COLUMN 字段名 字段类型 [其他属性]; -- 增加到第一列 ALTER TABLE table_name ADD COLUMN 字段名 字段类型 [其他属性] FIRST; -- 增加到指定列的后面 ALTER TABLE table_name ADD COLUMN 字段名 字段类型 [其他属性] AFTER 已存在的列名; ``` ### 5.6.3 删除列 ```sql ALTER TABLE 表名 DROP 列名; ``` ### 5.6.4 修改列信息 ```sql ALTER TABLE 表名 MODIFY 列名 新数据类型 [新属性]; ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 [新属性]; -- 修改列排序 ALTER TABLE 表名 MODIFY 列名 列类型 列属性 FIRST; ALTER TABLE 表名 MODIFY 列名 列类型 列属性 AFTER 指定列名; ``` ### 5.6.5 多个修改操作 ```sql ALERT TABLE 表名 操作1, 操作2, ...; ``` # 第六章 列的属性 ## 6.1 简单的查询和插入语句 ### 6.1.1 简单的查询语句 ```sql SELECT * FROM table; ``` ### 6.1.2 简单的插入语句 ```sql -- 如果没有指明某个字段的值,即为默认值 INSERT INTO 表名(列1, 列2, 列3) VALUES(列1值, 列2值, 列3值); ``` ### 6.1.3 批量插入 ```sql INSERT INTO 表名(列1, 列2, 列3) VALUES(列1值, 列2值, 列3值), (列1值, 列2值, 列3值), (列1值, 列2值, 列3值); ``` ## 6.2 列属性 ### 6.2.1 默认值 ```sql CREATE TABLE table_name ( first_column INT DEFAULT '0' ); ``` ### 6.2.2 NOT NULL `列名 列类型 NOT NULL` ### 6.2.3 主键 ```sql -- 单字段主键 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约束 - 希望有其他列或列组合存储值唯一 ```sql -- 单个字段约束 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)` ```sql 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` ```sql 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 表名` ```sql SELECT number AS '学号' FROM student_info; SELECT number '学号' FROM student_info; ``` ## 7.3 查询多个列 - 方法:`SELECT 列1,列2,列3,列4,列5 FROM 表名;` ```sql 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` ```sql SELECT DISTINCT department FROM student_info; SELECT DISTINCT department, major FROM student_info; ``` ### 7.6 限制结果集合记录条数(分页) - 方法:`SELECT * FROM table_name LIMIT [起始下标, ]搜寻条数` ```sql # 查询前两条 SELECT * FROM student_info LIMIT 2; # 查询两条,从5+1开始 SELECT * FROM student_info LIMIT 5, 2; ``` --