怎么理解数据库

本质:就是个放数据的仓库

数据存放

萌芽阶段

  • 放在内存里——瞬时:程序结束,上次的数据就没啦
  • 放在文件里——持久:进步了!能一直保存了(比如放在.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'

总之就是“位操作