MySQL学习
数据库
请不要假装很努力,因为结果不会陪你演戏。
typora快捷键 //blog.csdn.net/weixin_30619101/article/details/97707926
1. 认识数据库
1.1 数据库分类
类型 | 关系型数据库 | 非关系型数据库 |
---|---|---|
举例 | MySQL,Oracle,SQL server,DB2,SQLite | Redis,MongDB |
特征 | 通过表和表之间,行和列之间的关系进行数据的存储。 | 非关系型数据库,对象存储,通过对象的自身属性来决定 |
1.2 Mysql数据库
MySQL是一个关系型数据库管理系统,由瑞典[MySQL AB](//baike.baidu.com/item/MySQL AB/2620844) 公司开发,属于 Oracle 旗下产品。
MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。
2. 操作数据库
2.1 连接数据库
- 连接到服务器
$> mysql -h host -u user -p
Enter password: ********
-
断开连接
QUIT(或\q或exit)来断开连接:
mysql> QUIT
Bye
- 单行注释
--
- 多行注释
/*
xx
*/
结构化语言(CURD)
DDL(Data DefinitionLanguage) 数据库定义语言
DML(Data Manipulation Language) 数据库操作语言
DQL(Data QueryLanguage) 数据库查询语言
DCL(Data Control Language) 数据库控制语言
2.2 操作数据库
- 创建数据库
create database[if not exists] 数据库名;
- 删除数据库
drop database[if exists] 数据库名;
- 使用数据库(如果表名是特殊字符,则需要加“)
use 数据库名--;可以省略
- 查看数据库
show databases;--查看所有的数据库
- 查看创建数据库
show create database 数据库名;
2.3 数据表的列类型
数值
类型 | 特征 | 大小 |
---|---|---|
tinyint | 十分小的数据 | 1个字节 |
smallint | 较小的数据 | 2个字节 |
mediumint | 中等大小的数据 | 3个字节 |
int | 标准的整数 | 4个字节 |
bigint | 较大的数据 | 8个字节 |
float | 浮点数 | 4个字节 |
double | 浮点数(双精度) | 8个字节 |
decimal | 字符串形式的浮点数(金融行业) |
字符串
类型 | 特征 | 大小 |
---|---|---|
char | 字符串固定大小 | 0~255 |
varchar | 可变字符串(string) | 0~6553 |
tingytex | 微型文本 | 2^8-1 |
text | 文本串(保存大文本) | 2^16-1 |
时间日期
类型 | 格式 | 备注 |
---|---|---|
date | YYYY-MM-DD | 日期格式 |
time | HH:mm:ss | 时间格式 |
datetime | YYYY-MM-DD HH:mm:ss | 最常用的格式 |
timestamp | 1970-1-1至今 | 时间戳 |
year | YYYY | 年份表示 |
null
空值,未知
- 不要使用null运算,结果为null
2.4 数据表的字段属性
Unsigned:
- 无符号整数
- 声明了该列不能为负数
Zerofill(无符号):
- 0填充
- 不足位数,用0填充
自增:
- 自动在上一条记录的基础上加1
- 通常用来设计唯一主键–index,必须是整数
- 可以自定义初始值和步长
不是Null:
- 如果设置为not null,不赋值则为空
- null,如果不填写值,默认为nnull
默认(default):
- 设置默认值
表的定义规则
***每一个表,都必须存在以下五个字段!表示一个记录存在的意义!
id 主键
`version` 乐观锁
is_create 伪删除
gmt_create 创建时间
gmt_update 修改时间
2.5 创建数据表
create table [if not exists] `表名`(
`字段名` 列类型[属性][索引][注释],
`字段名` 列类型[属性][索引][注释],
…………
`字段名` 列类型[属性][索引][注释]
)[表类型][字符集设置][注释]
- 格式
create table if not exists `student`(
`id` int(4) not null auto_increment primary key,
`name` varchar(10) not null,
`gender` varchar(2) not null,
`birthdy` datetime not null
)engine=innodb default charset=utf8
- 查看创建数据表
show create table 表名;
- 查看表的结构
desc 表名; --describe 表名;
- 删除表
drop table [if exists] 表名;
数据库引擎
myisam | innodb | |
---|---|---|
事物支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大,约为2倍 |
常规使用操作:
- myisam 节约空间,速度较快
- innodb 安全性高,事务的处理,多表用户操作
数据库的物理空间
在安装目录的data文件夹下!
本质还是文件的存储
MySQL引擎在物理文件上的区别
- innodb在数据库表中只有一个*.frm文件,以及上机目录下的ibdata1文件
- myisam对应文件
- *.fram 表结构的定义文件
- *.myd 数据文件(data)
- *.myi 索引文件(index)
字符集编码
设置数据库表的字符集编码
charset=utf8
默认编码格式latin1(不支持中文)
在my.ini中修改默认配置
2.6 修改数据表
- 修改表名
alter table 旧表名 rename as 新表名;
- 增加表的字段
alter table 表名 add 字段名 列属性;
- 修改表的字段
修改字段约束
alter table 表名 modify 字段名 列属性;
修改字段名
alter table 表名 change 字段名 列属性;
modify和change区别
-
modify不能用来字段重命名,只能修改字段类型和约束
-
change用来字段重命名,不能修改字段类型和约束
- 删除表的字段
alter table 表名 drop 字段名;
3. MySQL数据管理
3.1 外键
方法一 (创建的时候添加外键约束)
定义外键key,添加外键添加约束
create table `grade`(
`gradeid` int(4) not null auto_increment,
`gradename` varchar(10) not null,
primary key (`gradeid`)
)engine=innodb default charset=utf8
create table if not exists `student`(
`id` int(4) not null auto_increment ,
`name` varchar(10) not null,
`gradeid` varchar(10) not null,
`gender` varchar(2) not null,
`birthdy` datetime not null.
primary key (`id`),
key `fk_gradeid` (`gradeid`),
constraint `fk_gradeid` foreign key (`gradeid`) references `grade` (`gradeid`)
)engine=innodb default charset=utf8
方法二 (表创建完添加外键约束)
alter table 表名
add constraint `fk_gradeid` foreign key(`gradeid`) references `grade` (`gradeid`)
以上操作为物理外键,通常使用程序来实现外键
3.2 DML语言(数据库操作语言)
insert 插入
update 修改
delete 删除
3.3 添加
insert
插入语句(字段和值对应 )
inert into 表名([字段1][字段2][...]) values([值1][值2[...]);
INSERT INTO `student`(`name`,`age`)VALUES('李四','18')
3.4 修改
update
指定条件
update 表名 set colnum_name=value where 条件;
不指定条件(会改动所有表)
update 表名 set colnum_name=value;
修改多个属性
update 表名 set colnum_name1=value1,[colnum_name2=value2] where 条件;
UPDATE `student` SET `name` = '王五' WHERE id = 2
操作符返回 布尔值
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<> 或 != | 不等于 | 5<>6 | true |
> | 大于 | 5>6 | false |
< | 小于 | 5<6 | true |
>= | 大于等于 | 5>=6 | false |
<= | 小于等于 | 5<=6 | true |
between…and… | 区间 | [5,6] | |
and | 与(&&) | 5 and 6 | |
or | 或(||) | a>5 or b< 6 |
通过多个条件定位语句
UPDATE `student` SET `name` = '屿龙' WHERE `id` >= 2 OR `name` != '屿龙'
注意:
-
colnum_name 是数据库的列要加上“
-
value可以是具体值,也可以是变量
3.5 删除
delete
语法:delete from 表名 [where 条件]
-- 删除数据库
delete from `student`
-- 删除指定数据
delete from `student` where `id` = 1
truncate 命令
作用:完全清空一个数据库,表的约束和结构不变
-- 清空数据库
truncate `student`
delete 和truncate区别
- 相同点:都能删除数据,都不会删除表的结构
- 不同点:
- truncate 重新设置自增列 计数器归零
- truncate 不会影响事物
4.DQL查询数据
4.1DQL(数据库查询语言)
所有查询 语句 select
4.2 查询指定字段
语法:select 字段 1,…from 表
-- 查询全部学生
select * from student
-- 查询指定字段
select `name`,`age` from student
-- 别名:给结果/表起一个名字 as
select `name` as 姓名,`age` as 年龄 from student from student as a
-- sql函数 concat拼接字符串
select concat('姓名:',`name`) as 新名字 from student
注:当字段名不能很好的表示数据本来的意思,可以给字段起别名以便于理解
distinct 去重
作用:去除select查询出来的结果中重复的数据,重复的数据只显示一条
-- 查询一下有哪些同学参加了考试,成绩
SELECT * FROM resu1t -- 查询全部的考试成绩
SELECT `studentNo` FROM result -- 查询有哪些同学参加了考试
SELECT DISTINCT `studentNo` FROM resu1t -- 发现重复数据,去重
数据库的列(表达式)
select version() -- 查询数据库的版本(函数)
selcet 1*55-1 as 计算结果 -- 用来计算(表达式)
select @@auto_increment_increment -- 查询自增的步长(变量)
-- 成绩+1分
SELECT `studentNo`, `studentResult` +1 AS `提分后` FROM result
数据库中的表达式:文本值,列,NUl,函数,计算表达式,系统变量
select 表达式 from 表
4.3 where条件子句
作用:检索数据中符合条件的值
搜索的条件由一个或多个组成
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b a&&b | 逻辑与,同为真时为真 |
or || | a or b a||b | 逻辑或,同为假时假 |
not ! | not a !a | 逻辑非,取反 |
SELECT studentNo. `studentResult` FROM result
-- 查询考试成绩在95~100分之间
SELECT studentNo, `studentResult` FROM result WHERE StudentResult>=95 AND StudentResult<=100
-- and&&
SELECT studentNo, `studentResult` FROM result WHERE studentResu1t>=95 && studentResult<=100
-- 模糊查询(区间)
SELECT studentNo, `studentResult` FROM result WHERE StudentResu1t BETWEEN 95 AND 100
-- 除了1000号学生之外的同学的成绩
SELECT studentNo, `studentResult` FROM result WHERE studentNo!=1000
-- !=not
SELECT studentNo, `studentResult` FROM result WHERE NOT studentNo = 1000