白嫖!大厂年薪 50W 程序员分享的 MySQL 工作笔记,Github 上都找不到
今日分享开始啦,请大家多多指教~
1、什么是 MySQL
MySQL 是一个关系型数据库管理系统
MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
1.2、连接数据库
命令行连接!
数据库 xxx 语言
DDL 定义
DML 操作
DCL 控制
DQL 查询
1.3 操作数据库
操作数据库>操作数据库中的表>操作数据库中表的数据
创建数据库
CREATE DATABASE IF NOT EXISTS school;如果不存在数据库 school 则创建
删除数据库
DROP DATABASE IF EXISTS hello;如果存在数据库 hello 则删除
使用数据库
--tab 键上面,如果你的表名或者字段名是一个特殊字符,就需要到反引号
USE `SCHOOL`
1.4、数据库列类型
数值
tinyint 十分小的数据 1 个字节
smalint 较小的数据 2 个字节
mediumint 中等大小的数据 3 个字节
==int 标准的整数 4 个字节 java 的 int ==
bigint 较大的数据 8 个字节
float 浮点数 4 个字节
double 浮点数 8 个字节
decimal 字符串形式的浮点数 金融计算的时候,一般使用 decimal
字符串
char 字符串固定大小的 0~255
==varchar 可变字符串 0~65535 ** 常用的 String==
tinytext 微型文本 2^8-1
text 文本串 2^16-1 保存大文本
时间日期
date YYYY-MM-DD,日期格式
time HH:mm:ss 时间格式
==datetime YY-MM-DD HH:mm:ss 最常用的时间格式 ==
timestamp 时间戳 1970.1.1 到现在的毫秒值!
year 年份表示
null
没有值,未知
注意,不用使用 NULL 进行运算,跟 NULL 运算结果为 NULL
1.5、数据库的字段属性(重点)
Unsigned:
●无符号的整数
●声明了该列不能声明为负数
zerofill:
●0 填充的
●不足的位数,使用 0 来填充, int(3) , 005
autoincrement:
● 通常理解为自增,自动在上一条记录的基础上+1(默认)
●通常来设计唯一的主键~ index,必须是整数类型
非空 NULL not null
●假如设置为 not null,如果不给他赋值,就会报错!
●NULL,如果不填写值,默认就是 null!
默认:
●设置默认的值!
●sex,默认值是男,如果不指定该列的值,则会有默认的值!
拓展:
id 主键
`version` 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
1.6、创建数据库表
格式
常用命令
1.7、数据表的类型
--关于数据库的引擎
INNODB 默认使用
MYISAM 早些年使用的
常规使用操作:
MYISAM 节约空间,速度较快
INNODB 安全性高,事务的处理,多表多用户操作
在物理空间存在的位置
所有的数据库文件都存在 data 目录下,一个文件夹就对应一个数据库
本质还是文件的存储!
MySQL 引擎在物理文件上的区别
INNODB 在数据库表中只有一个*.frm 文件,以及上级目录下的 ibdata1 文件
MYISAM 对应文件
*.frm - 表结构的定义文件
*.MYD - 数据文件(data)
*.MYI - 索引文件(index)
设置数据库表的字符集编码
CHARSET=utf8
不设置的话,会是 MySQL 默认的字符集编码 latin-1(不支持中文)
在 my.ini 中配置默认的编码
character-set-server=utf8
2、修改删除表
2.1、修改
2.2、删除
--删除表(如果表存在则删除)
DROP TABLE IF EXISTS teacher1
所有的创建和删除操作尽量加上判断,以免报错~
注意点:
`反引号,字段名使用这个括起来
注释-- /* */
sql 大小写不敏感,建议写小写
所有的符号都用英文!
3、MySQL 数据管理
3.1、外键
方式一:在创建表的时候增加约束(麻烦,比较复杂)
删除有外键关系的表的时候,必须先删除引用别人的表(从表),再删除被引用的表(主表)
方式二:创建表成功后,添加外键约束
以上的操作都是物理外键,数据库级别的外键,我们不建议使用!(避免数据过多造成困扰)
最佳实现
数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
我们想使用多张表的数据,想使用外键(程序去实现)
3.2、DML 语言
数据库意义:数据存储,数据管理 DML 语言:数据操作语言
INSERT
UPDATE
DELETE
3.2.1、添加
insert
语法:INsert into 表名(字段名 1,字段名 2,字段名 3,......) values ('值 1','值 2','值 3',...)
注意事项:
1.字段和字段使用英文逗号隔开
2.字段是可以省略的,但是后面的值要一一对应,不能少
3.可以同时插入多条语句,VALUES 后面的值需要使用逗号隔开 VALUES (),(),......
3.2.2、修改
update 修改谁(条件) set 原来的值=新值
条件:where 子句 运算符 id 等于某个值,大于某个值,在某个区间内修改
-- 通过多个条件定位数据
UPDATE `student` SET `name`='长江七号' WHERE `name`='RYGAR' AND `sex`='女'
语法:UPDATE 表名 SET 字段名 1=‘值 1’,字段名 2=‘值 2’,… WHERE 条件
注意:
字段名尽量带上反引号`
条件,筛选的条件,如果没有指定,则会修改所有的列
值可以是一个具体的值,也可以是一个变量
UPDATE `student` SET `name`='孙悟空',`password`='sunwukong123',`birthday`=NOW() WHERE `name`='长江七号' AND `password`='lisi123'
这个 now()和 current_time 都是当前时间
3.2.3、删除
delete 命令
语法:`delete from 表名[where 条件]
TRUNCATE 命令
作用:完全清空一个数据库表,表的结构和索引约束不会变!
--清空 student 表
--语法: TRUNCATE 表名
TRUNCATE `student`
DELETE 和 TRUNCATE 的区别
相同点:都能删除数据,都不会删除表结构
不同点:
1.TRUNCATE 重新设置自增列,计数器会归零
2.TRUNCATE 不会影响事务
DELETE 删除的问题,重启数据库,现象(MySQL5.0 版本有这些现象,但 MySQL8.0 版本修复了这些问题)
INNODB 自增列会从 1 开始(存在内存当中的,断点即失)
MYISAM 继续从上一个自增量开始(存在文件中的,不会丢失)
3.2.4、DQL 查询数据(重点)
DQL(Data Query Language:数据查询语言)
所有的查询操作都用它 SELECT
简单的查询,复杂的查询它都能做
数据库中最核心的语言,最重要的语句
使用频率最高的语句
有的时候,列名字不是那么的见名知意。我们起别名 AS 字段名 AS 别名
去重 DISTINCT
作用:去除 SELECT 查询出来的结果中重复的数据,只显示一条
-- 查询一下哪些同学参加了考试,成绩
SELECT * FROM result -- 查询全部的考试成绩
SELECT `StudentNO` FROM result --查询有哪些同学参加了考试
发现有重复数据,去重使用 DISTINCT 关键词
SELECT DISTINCT `studentNo` FROM result -- 发现重复数据,去重
查看 MySQL 版本
SELECT version();
数据库的列(表达式)
数据库中的表达式:文本值,列,null,函数,计算表达式,系统变量…
select 表达式 from 表
3.2.5、where 条件子句
作用:检索数据中符合条件的值
搜索的条件由一个或者多个表达式组成! 结果为布尔值
逻辑运算符
| 运算符 | 语法 | 描述 |
|–|--|–|
| and && | a and b / a&&b | 逻辑与,两个都为真,结果为真 |
| or || | a or b / a || b | 逻辑或,其中一个为真,结果为真 |
| Not ! | not a / !a | 逻辑非,真为假,假为真! |
尽量使用英文字母
查询出了 1000 号学生的成绩
模糊查询:比较运算符
查询姓刘的学生
-- LIKE 关键词,%(代表 0 到任意个字符) _(一个字符)
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentName` LIKE '刘 %';
查询姓刘的学生,姓名为两个字的学生
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentName` LIKE '刘_';
查询姓刘的学生,姓名为三个字的学生
SELECT `StudentNO`,`StudentName` FROM `student` WHERE `StudentName` LIKE '刘__';
查询名字包含"嘉"字的学生
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentName` LIKE '&嘉 &';
==IN(具体的一个或者多个值)==关键字查询 1001,1003,1003 号学生
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentNo` IN (1001,1002,1003);
查询在安徽的学生和在河南洛阳的学生
查询有出生日期的学生,不为空
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `BornDate` IS NOT NULL;
查询没有出生日期的学生(为空)
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `BronDate` IS NULL;
今日份分享已结束,请大家多多包涵和指点!
评论