怎么理解数据库
本质:就是个放数据的仓库
数据存放
萌芽阶段
- 放在内存里——瞬时:程序结束,上次的数据就没啦
- 放在文件里——持久:进步了!能一直保存了(比如放在.txt文件里),但还是存在问题
- 不安全
- 不方便在中间插入、删除数据
- 但也不是一无是处,可以应用于配置文件:.xml文件、.ini文件等等
数据库的产生
核心:CRUD(最难的是“查找”)
- 层次模型
- 优点:层次清晰
- 缺点:(假如一张“专业”表有你,“学校”表也有你)
- 查询效率低下(不知道查哪张)
- 数据不完整(这张表改了那张表没改)
- 致命:重复就GG了
- 网状模型
- 优点:解决复杂问题,数据也完整了,重复的话也只操作一个文件
- 缺点:重复文件没法解决特殊性问题(假设计算机一班的人和上mysql课的有一部分人都是)
- 计算机一班的每人收100元
- 上mysql课的每人收233元
- 致命:并未解决导航问题
- 关系型
- 解决了导航问题:比如每张表都有个学号(公共的编号)
- 分批管理,各管各的
- 数据完整,层次清晰
- 说白了,关系就是共性,为了让每张表都能找到爹
- 和谁都有关系,但是又互不影响
安装
- 版本(看企业,贴合业务)
- 5.7
- 8.0
- 下载
- 点MySQL Community Download
- 点MySQL Community Server、
- 选MSI Installer(几百M的那个)
- 选5.7.29
- 太慢?在下载内容里复制链接到迅雷就行啦
- 安装
- sever only
- 有excute就点,弹框确认就完了
- 一路next就完了
- 添加到环境变量(比如:C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin)
- 在cmd下进入(u是用户名,p是密码)
# 不推荐直接在-p后输入密码
mysql -u root -padmin
# 建议这样
mysql -u root -p
>Enter Password:*****
root
用户可以为所欲为!!!
MySQL是个啥
- 用C++开发(bin中的.exe、include中的.h可以看出来…)
- 典型C/S架构
- server服务端:MySQL Sever mysql服务端(在本地,客户端要访问,需要开启服务)
- client客户端:通过终端cmd去访问/操作数据库
# 关闭服务(大小写不敏感)
net stop mysql
# 开启服务
net start mysql
- 断开连接
- quit
- exit
- \q
- 直接关闭CMD
- windows系统的情况屏幕命令:
cls
- 在MySQL Server 的目录下创建data文件夹
mysqld --initialize-insecure --user=root
库的基本操作
显示所有仓库
# 输入内容
show databases;
# 输出内容
+--------------------+
| Database |
+--------------------+
| information_schema |
| how2java |
| mybatis |
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)
- information_schema:服务器管理数据库的信息
- mysql:用户信息(比如root用户)
- performance_schema:存储服务器性能的东西(5.5之后才有的)
- test:自带的测试样例
建库
- 通常做法
create database student;
tips:别用关键字,比如:database
- 万一库很多,避免存在,可以先检查是否存在,再创建,并指定字符集(推荐这种做法,更规范)
create database if not exists `student` charset=utf8;
- 查看当时怎么创建的(看到编码)
# 输入内容
mysql>show create database student;
# 输出内容
+----------+--------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------+
| student | CREATE DATABASE `student` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
删库
- 通常做法
drop database student;
- 万一我删的是一个不存在的库(推荐这种做法,更规范)
drop database if exists 'student';
字符集设置
- 默认latin1
- win10下学习用gbk,实际开发用utf8
- 修改字符集
alter database student charset=gbk;
使用数据库
use student;
表的基本操作
- 本质:将仓库里的东西归类
显示库内的所有表
- 首先要
use
,才能show
show tables;
表的创建
- 简易创建
# 输入内容
mysql> use school;
# 输出内容
Database changed
# 输入内容
mysql> create table student(
-> id int,
-> name varchar(30),
-> age int
-> );
# 输出内容
Query OK, 0 rows affected (0.01 sec)
# 输入内容
mysql> show tables;
# 输出内容
+------------------+
| Tables_in_school |
+------------------+
| student |
+------------------+
1 row in set (0.00 sec)
- 规范创建
create table if not exists teacher(
id int auto_increment primary key comment '主键id',
name varchar(30) not null comment '老师的名字',
phone varchar(20) comment '电话号码',
address varchar(100) default '暂时未知' comment '住址'
)engine=innodb;
tips:
id name age:字段(field)
auto_increment:自动增长(必须是primary key)
primary key:主键,唯一不重复,靠它来区分此表
comment:注释
not null:该字段不为空
default:默认值
engine=innodb:暂不解释
查看表结构
mysql> desc teacher;
+---------+--------------+------+-----+----------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+----------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(30) | NO | | NULL | |
| phone | varchar(20) | YES | | NULL | |
| address | varchar(100) | YES | | 暂时未知 | |
+---------+--------------+------+-----+----------+----------------+
4 rows in set (0.00 sec)
删表
- 标准做法
drop table if exists 'stu';
- 多张表可以逗号隔开
drop table if exists ooo,jjj,kkk;
修改表
- 添加字段
alter table student add phone varchar(20);
- 放在某字段后面
alter table student add gender varchar(2) after name;
- 放在第一个
alter table student add sex varchar(1) first;
- 删除字段
alter table student drop phone;
- 修改字段属性(
change
可以改名字,也可以改类型;modify
只能改类型)
alter table student change phone tel_phone int(11);
alter table student modify tel_phone varchar(13);
- 改名字(表名不能是复数,这边是不规范的)
alter table student rename to students;
数据的基本操作
添加
- 插入单条数据
insert into teacher (name,phone,address) values('王帅真','18359730121','嘉园路');
顺序没要求,但属性一定要一一对应;
如果不写第一个"()"的内容,就要按顺序了,且id处填null
- 插入多条数据
insert into teacher values(NULL,'Tom',NULL,default),(NULL,'Jack',NULL,default);
删除
- 按属性删除
delete from teacher where id=2;
delete from teacher where name="Tom";
delete from teacher where age>18;
- 清空表(自增id会从1开始,而
delete
不会)
truncate table student;
更新
where
尽可能的唯一,防止SQL注入
update teacher set name='Jack' where id=1;
查找
- 查整张表(*表示找出全部,方便但是性能低)
mysql> select * from teacher;
+----+--------+-------------+---------+
| id | name | phone | address |
+----+--------+-------------+---------+
| 1 | 王帅真 | 18359730121 | 嘉园路 |
+----+--------+-------------+---------+
1 row in set (0.00 sec)
- 指定字段
mysql> select name from teacher where id=1;
+--------+
| name |
+--------+
| 王帅真 |
+--------+
1 row in set (0.00 sec)
SQL语句区分
- DDL:Data Definition Language
- 针对【数据库】
- 数据库定义语言
create
alter
drop
show
- DML:Data Manipulation Language
- 针对【数据】
- 数据库操纵语言
insert
update
delete
select
查看字符集情况
- 查找所有字符集设置
show variables like 'character_set_%';
- 设置客户端字符集
set character_set_client=utf8;
数据类型
数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
- 整型应用
create table user(
id smallint unsigned auto_increment primary key comment 'id',
age tinyint unsigned not null default 0,
kkk int(6)
);
int()里的代表数据的宽度,即十进制位数
tinyint默认是3(255),smallint默认是5(65535)
- 浮点数应用(**钱千万不能用浮点型!!!!!**存在精度丢失问题!!!)
create table t_1(
num1 float(3,1),
num2 double(5,2),
)
()里的前一个是总宽度,后一个是小数部分宽度
如果我故意插入(2.99,2.777777777777)
最后会出来的是(3.0,2.78),也就是会被约
- 定点数(Decimal)应用(钱用这个,不会丢失精度)
一部分空间存整数,一部分空间存小数
字符串类型
类型 | 大小 | 用途 |
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串(多余的空间会回收,但效率偏低) |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据(比如:存博客文章) |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
日期和时间类型
业内规定,表内都要有!!!!!!
类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
布尔类型
- boolean
- true:1
- false:0
枚举类型
create table t_5(
sex enum('man','woman','?','none','it')
);
枚举类型有的才能取
第一个类型是1(‘man’)
第二个类型是2(‘woman’)
…
以此类推
实际存的就是整数数据
优点:
- 速度快
- 节省空间,限制数据(2byte)
集合类型
create table t_6(
hobby set('哲学','经济学','IT','人文社科')
);
插入的话只能插入一个字段
insert into t_6 values('IT,经济学');
哲学——2^0
经济学——2^1
IT——2^2
人文社科——2^3
比如:我插入1,就是'哲学'
;我插入5,就是'哲学','IT'
总之就是“位操作”