一.概述
作用就是用来存储数据和管理数据,本质上就是需要安装MySQL软件.
分类: 关系型数据库MySQL 和 非关系型数据库Redis ,主要观察数据之间的关系
使用
1.安装服务器端: 存数据,管理数据
核心步骤: 设置字符集/编码成 utf-8 , 端口号3306 , 设置服务名称MySQL , 设置密码root
2,安装客户端: 连接服务器,操作服务器里的数据
-
1,小黑窗口/DOS窗口:
–从开始菜单里找MySQL/Mariadb,输入密码
–win+r 然后输入cmd发起MySQL的命令 -u是指定用户名(root) -p是指定密码(自定义的) mysql -uroot -proot
2,图形化的工具:sqlyog
3.数据库的结构
数据库 -> 表(行和列) -> 数据
4.SQL语言
1.概述
结构化查询语言,用来操作数据库的语言,是一种标准.
增删改查里将来发生最多的业务就是: 查 !!!
2.分类
DML是数据操纵语言
DDL是指数据定义语言
DCL是指数据控制语言
DQL是指数据查询语言
二、数据库的常见操作
增删改查 CRUD
1.创建库
创建数据库,数据库名称:cgb2022
mysql> create database cgb2022;
2.查询所有数据库
查看所有数据库
mysql> show databases;
create database cgb2022 DEFAULT CHARACTER SET utf8;
DEFAULT CHARACTER SET utf8是为了防止中文乱码
3.删除库
删除名称是cgb2022的数据库
mysql> drop database cgb2022;
三、表的常见操作
增删改查 CRUD
1. 使用指定的数据库
mysql> use cgb2022;
2.创建表
语法:
create table 表名(字段名称 字段类型(字段长度),字段2,字段3,....)
例如:
设计门店表:tb_door
实现:
mysql> create table tb_door(
-> id int(11),
-> door_name varchar(100),
-> tel varchar(20)
-> );
Query OK, 0 rows affected (0.01 sec)
设计订单详情表:tb_order_detail
实现
mysql> create table tb_order_detail(
-> id int(11),
-> order_id int(11),
-> num tinyint(4),
-> item varchar(30),
-> price double
-> );
Query OK, 0 rows affected (0.04 sec)
3.查看表
mysql> show tables;
+-------------------+
| Tables_in_cgb2022 |
+-------------------+
| tb_door |
| tb_order_detail |
+-------------------+
2 rows in set (0.00 sec)
4.修改表
添加
mysql> alter table tb_door add column money numeric(7,2);
Query OK, 0 rows affected (0.55 sec)
Records: 0 Duplicates: 0 Warnings: 0
5.描述表结构
mysql> desc tb_door;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| door_name | varchar(100) | YES | | NULL | |
| tel | varchar(20) | YES | | NULL | |
| money | decimal(7,2) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
4 rows in set (0.11 sec)
6.删除表
mysql> drop table tb_door;
Query OK, 0 rows affected (0.00 sec)
四、数据的常见操作
增删改查 CRUD
1.查询记录
mysql> select * from tb_order_detail;
Empty set (0.00 sec)
2.插入记录
语法:
insert into 表名 values(1,2,3,4,5,6)
注意:
- 需要设置几个值?要看表里有几个字段
- 值的顺序要和字段的顺序保持一致
- 如果字段是字符串类型,设置值时必须要有" " ’ '的标记
mysql> insert into tb_order_detail values
-> (10,20,2,"RedMi note11",1999);
Query OK, 1 row affected (0.31 sec)
3.修改数据/记录
mysql> update tb_order_detail set num=3 where id=12;
Query OK, 0 rows affected (0.01 sec)
Rows matched: 1 Changed: 0 Warnings: 0
4.删除记录
mysql> delete from tb_order_detail where id=11;
Query OK, 1 row affected (0.02 sec)
五、数据库的使用细节
命名规范
- 字段名必须以字母开头,尽量不要使用拼音
- 长度不能超过30个字符(不同数据库,不同版本会有不同)
- 不能使用SQL的保留字,如where,order,group 只能使用如下字符az、AZ、0~9、$ 等
- Oracle习惯全大写:USER_NAME,mysql习惯全小写:user_name
- 多个单词用下划线隔开,而非java语言的驼峰规则
数据类型
- 整型:int
- 小数:double(不精确) / numeric(a,b) / decimal(a,b)–a是数字的位数b是小数位数
- 时间: date(年月日) time(时分秒) datetime(年月日时分秒) timestamp(时间戳,毫秒数)
- 字符串: char / varchar
- 图片: 如果想存入数据库,只会存文件的磁盘路径D:/abc/1.jpg,不是存文件本身
字符
- char长度固定,不足使用空格填充,最多容纳2000个字符,char(11)存储abc,占11位。查询速度极快但浪费空间
- varchar变长字符串,最多容纳4000个字符,varchar(11)存储abc,只占3位。查询稍慢,但节省空间。Oracle为varchar2
- 大文本: 大量文字(不推荐使用,尽量使用varchar替代)
以utf8编码计算的话,一个汉字在u8下占3个字节
注:不同数据库版本长度限制可能会有不同
数字
- tinyint,int整数类型
- float,double小数类型
- numeric(5,2) decimal(5,2)—也可以表示小数,表示总共5位,其中可以有两位小数
- decimal和numeric表示精确的整数数字
日期
- date 包含年月日
- time时分秒
- datetime包含年月日和时分秒
- timestamp时间戳,不是日期,而是从1970年1月1日到指定日期的毫秒数
图片
- blob 二进制数据,可以存放图片、声音,容量4g。早期有这样的设计。但其缺点非常明显,数据库庞大,备份缓慢,这些内容去备份多份价值不大。同时数据库迁移时过大,迁移时间过久。所以目前主流都不会直接存储这样的数据,而只存储其访问路径,文件则存放在磁盘上。
六、字段约束
使用的时间: 通常在设计表创建表时就已经确定了
1.非空约束
哪个字段添加了非空约束,从此,字段值不能为空,使用not null
mysql> create table b(
-> password varchar(10) not null #给字段添加非空约束
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into b values('abc'); #password字段设置了值,执行OK
Query OK, 1 row affected (0.04 sec)
mysql> insert into b values(null); #password字段值不能设置成null,否则不符合非空约束
ERROR 1048 (23000): Column 'password' cannot be null
2.主键约束
主键约束
如果为一个列添加了主键约束,那么这个列就是主键,主键的特点是唯一且不能为空。通常情况下,每张表都会有主键。
现象是: 字段的值必须唯一且不能为空,使用primary key
mysql> create table d(
-> id int primary key,
-> name varchar(10) not null,
-> password varchar(10) not null
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into d values(1,'jack','123');
Query OK, 1 row affected (0.01 sec)
mysql> insert into d values(null,'jack','123');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into d values(1,'jack','123');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
主键自增策略
当主键为数值类型时,为了方便维护,可以设置主键自增策略(auto_increment),设置了主键自增策略后,数据库会在表中保存一个AUTO_INCREMENT变量值,初始值为1,当需要id值,不需要我们指定值,由数据库负责从AUTO_INCREMENT获取一个id值,作为主键值插入到表中。而且每次用完AUTO_INCREMENT值,都会自增1. AUTO_INCREMENT=1
mysql> create table g(
-> id int primary key auto_increment,
-> name varchar(10),
-> age int
-> );
Query OK, 0 rows affected (0.17 sec)
#主键的值不用自己设置null,数据库会自增
mysql> insert into g values(null,'tony',18);
Query OK, 1 row affected (0.01 sec)
mysql> select * from g;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | tony | 18 |
+----+------+------+
1 row in set (0.00 sec)
mysql> insert into g values(null,'mary',20);
Query OK, 1 row affected (0.02 sec)
mysql> select * from g;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | tony | 18 |
| 2 | mary | 20 |
+----+------+------+
2 rows in set (0.00 sec)
3.唯一约束
哪个字段添加了唯一约束,从此,字段值不能相同
#唯一约束:添加后,字段值不能重复
mysql> create table d(
-> tel char(11) unique #唯一约束
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into d values('12345678912'); #成功
Query OK, 1 row affected (0.00 sec)
mysql> insert into d values('12345678912'); #报错,值相同啦!
ERROR 1062 (23000): Duplicate entry '12345678912' for key 'tel'
4.混合使用
mysql> create table c(
-> tel char(11) unique not null
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into c values(null); #报错,字段值不符合非空约束
ERROR 1048 (23000): Column 'tel' cannot be null
mysql> insert into c values('123'); #正确的,因为满足了非空约束
Query OK, 1 row affected (0.01 sec)
mysql> insert into c values('123'); #报错,字段不符合唯一约束
ERROR 1062 (23000): Duplicate entry '123' for key 'tel'