MySQL入门笔记
1、操作数据库
1.1、操作数据库
创建数据库:
create database [if not exists] xxx
删除数据库:
drop database [if exists] xxx
使用数据库:
use xxx
查看数据库:
show databases
1.2、数据库的列类型
1.2.1数值
- tinyint 十分小的数据 1字节
- smallint 较小的数据 2字节
- mediumint 中等大小的数据 3字节
- int 标准的整数 4字节
- bigint 较大的数据 8字节
- float 浮点数 4字节
- double 浮点数 8字节
- decimal 字符串形式的浮点数(一般用于金融计算)
1.2.2 字符串
- char 字符串固定大小的 0~255
- varchar 可变字符串 0~65535
- tinytest 微型文本 2^8-1
- test 文本串 2^16-1
1.2.3时间
- date YYYY-MM-DD,日期格式
- time HH:mm:ss 时间格式
- datetime YYYY-MM-DD HH:mm:ss最常用的时间格式
- timestamp 时间戳
- year 年份表示
1.2.4 NULL
- 没有值,为空,尽量不要使用这个运算
1.3、数据库的字段属性
- Unsigned 无符号的整数,声明了该列不能为空
- zerofill 不足的位数用0来填充
- 自增 通常理解为在上一条的基础上+1,可用来设计主键
- 非空 假设设置not nul如果不填值,就会报错
- 默认 新增数据是默认数据
1.4、创建数据库表
-- auto_increment 自增
-- primary key 主键
CREATE table if not exists `student`(
`id` int(4) not null AUTO_INCREMENT COMMENT '学号',
`name` varchar(20) NOT NULL DEFAULT '匿名' comment '姓名',
`password` varchar(20) not null DEFAULT '123456' comment '密码',
`sex` varchar(2) not null DEFAULT '女' comment '性别',
`birthday` DATETIME DEFAULT null comment '出生日期',
`address` VARCHAR(100) DEFAULT null comment '家庭住址',
`email` varchar(50) DEFAULT null comment '邮箱',
PRIMARY key (`id`)
)ENGINE=INNODB DEFAULT charset=utf8
格式
create table [if not exists] `表名`(
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
......
`字段名` 列类型 [属性] [索引] [注释],
primeay key (`主键`)
)[表类型][字符集设置][注释]
常用命令
show create database order:查看数据库创建语句
show create table student:查看数据表创建语句
1.5、MYISAM与INNODB区别
1.6、修改,删除表
alter table student rename as stu -- 修改表名
alter table student add age int(11) -- 增加表字段
alter table student modify age varchar(11) -- 修改表字段类型
alter table student change age age1 int(11) -- 重命名字段
alter table student drop age1 -- 删除表中字段
drop table if exists student -- 如果表存在则删除
2、MySQL的数据管理
2.1、外键(了解即可)
方式一:
语句建表时添加
方式二:
创建表成功后修改约束
-- alter table 表 add constraint `约束名` foreign key(`作为外键的列`) references `外键引用表`(`对应字段`)
alter table student add constraint `FK_gradeid` foreign key(`gradeid`) references `grade`(`gradeid`)
2.2、DML语言(数据操作语言)
-
insert 添加
数据和字段位置对应,如不指定字段则需全列数据插入 insert into table_name ([字段1,字段2...]) values('值1','值2'...)
-
update 修改
修改表字段值,可根据字段值作为条件确定修改某一列,多条件用and连接 update table_name set 字段1 = '值1',字段2 = '值2'... [where 字段n = '值']
where 语句条件判断符
-
delete 删除
删除表中数据,如不指定条件则为全表删除(where语句条件判断参考update) delete from table_name [where 字段1 = '值1']
-
truncate 完全清空
truncate table_name
delete和truncate的区别
2.3、DQL语言(数据查询语言)
-
select
-- 查询系统版本 select version -- 查询单表全部数据 select * from table_name -- 查询指定字段 select filed1,filed2 from table_name -- 别名,结果起一个名字 select filed1 as 别名,filed2 as 别名 from table_name as 表别名 -- 函数 concat(拼接,例:‘姓名’:name) select count('value',filed) as 别名 from table_name -- 去重(对语句查询结果进行去重) select distinct filed from table_name
-
where条件子句
逻辑运算符
根据条件查询,多条件用and连接 select * from table_name [where 字段n = '值']
比较运算符
like :模糊查询,根据like结合 %(0-任意个字符) _(一个字符) select * from table_name where filed like 'value%' 值为value开头后跟多个字符的 select * from table_name where filed like 'value_' 值为value开头后跟一个字符的 select * from table_name where filed like '%value%' 中间值为value的 ============================= in :查询在指定值内的 select * from table_name where filed in ('v1','v2','v3') is null: 查询值为空的 select * from table_name where filed is null is not null: 查询值不为空的 select * from table_name where filed is not null
-
联表查询
图片来源:https://www.runoob.com/sql/sql-join.html
自连接查询,同一张表作为两张表查询 select * from table as a inner join table as b on b.id=a.pid where ...
-
分页和排序
desc:降序 asc:升序(默认) select * from table_name where filed = 'v' order by id [desc|asc] limit:分页 select * from table_name where filed = 'v' limit 0,5 0代表起始值(下标),也可以理解为显示时跳过多少条之后,显示5条
-
子查询----- where语句中嵌套一个查询语句
select * from table_name where id = (select id from table_name)
-
group by …having 分组过滤
select filed,avg(filed),max(filed),max(filed) from where table_name group by filed having filed >|<|>=|<= ... value 对指定列进行分组,返回多组数据
-
MySQL函数
-
常用函数
select abs(-8) --- 取绝对值 select ceiling(9.4) --- 向上取整 select floor(9.4) --- 向下取整 select rand() --- 返回一个0-1之间的随机数 select sign(10) --- 判断一个数的符号,负数返回-1、正数返回1 select char_length(‘xxxxxx’) --- 获取字符串长度 select concat('x','x','x') --- 拼接字符串 select lower('gsfdsfs') --- 小写字母 select upper('gsgsg') --- 大写字母
-
聚合函数
count() --- 统计 count(filed)、count(*)、count(1) sum() --- 求和 avg() --- 平均值 max() --- 最大值 min() --- 最小值
-
MD5 — 不可逆加密
插入时加密 insert into table_name(pwd) values(md5('123456')) 修改加密 update table_name set pwd = md5(pwd)
3、事务
3.1、什么是事务
一组sql语句操作时要么都成功,要么都失败
- 事务特性 ACID
- Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
隔离产生的问题:- 脏读:一个事务读取了另一个事务未提交的数据。
- 不可重复读:在一个十五内读取表中的某一行数据,多次读取的结果不同。
- 幻读:在一个事务内读取到了另一个事务插入的数据,导致前后读不一致。
- Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
-
事务操作
set autocommit = 0:关闭事务自动提交 start transaction (begin) :开启事务 insert... update... commit:提交事务 rollback:回滚
4、索引
帮助mysql高效获取数据的数据结构
4.1、索引的分类
- 主键索引 (primary key)
唯一的标识,主键不可重复,只有一列作为索引 - 唯一索引(unique key)
避免重复的列出现,唯一索引可重复,多个列都可以标识 - 普通索引(key/index)
默认的 - 全文索引(fulltext)
在特定的数据库引擎下才有,快速定位i数据
4.2、索引
show index from table:查看表中索引
alter table table_name add [可选类型] index index_name(filed):为表中列创建索引
drop index index_name on table_name:删除索引
注: 如字段类型为blob(二进制)或者text,则以该列创建索引时必须指定length。
笔记视频地址:https://www.bilibili.com/video/BV1NJ411J79W