1.MySQL数据库
1.1 数据库
- 数据结构【按照数据结构来组织,存储和管理数据的仓库】。是一个长期存储在计算机内的,有组织,可共享的,统一管理的大量数据的集合。
- 数据——对于任何一个组织来说是十分重要的,程序员的工作是对数据进行管理,包括【运算,流转,存储,展示】,最重要的功能就是【存储数据】,长期的保存数据。
1.2 MySQL
- MySQL是一个【关系型数据库管理系统】,瑞典公司研发,被【Oracle】收购。
- MySQL使用了一种语言【SQL语言】
- MySQL分为社区版和商业版,体积小,速度快,成本低,【开源】。
1.3 基本操作
-
启动MySQL
-
mysql -h 127.0.0.1 -p 3306 -u root -p 3306
-
-
MySQL保存数据的模式:
- 创建一个数据库
- 在数据库下保存多张表
- 在每张表中保存多条数据
-
MySQL是是一个【数据库管理系统】,管理多个数据库。
-
create datebase 数据库的名;——————创建数据库 create schema 数据库的名; show databases;————————查看所有数据库
-
-
使用数据库:
-
mysql> use jsoft;——————使用相关的数据库 Database changed————出现这个表示成功
-
1.4表
- 用来存储数据的对象,是有结构的数据的集合。
- 行:一行即为一条数据,数据库一共有多少数据,实际上就是有几行数据。
- 列:一列即为一个字段,数据库一共有多少字段,实际上就是有几列数据。
2.SQL语言
SQL是一种特殊目的的编程语言,也是一种数据库查询和程序设计语言,用于存储数据以及查询,更新和管理关系型数据库系统。
【命名规则:字段名单词之间用下划线连接】
2.1 SQL语句的分类
- DCL(Data Control Language)——数据控制语言
- 定义——访问权限和安全级别。
- DDL(Data Definition Language)——数据库定义语言
- 定义——数据库对象:库,表,字段(列)。
- 功能——创建,删除,修改库和表的结构。
- DML(Data Manipulation Language)——数据操作语言
- 定义——数据的增删改记录。
- DQL(Data Query Language)——数据查询语言
- 定义——用来查询记录。
- TCL(Transition Control Language)——事务控制语言
- 定义——用来管理事务,【commit】
2.1.1 DCL(数据控制语言)
-
创建用户
-
创建一共用户,该用户只能在指定的IP地址上登录MySQL:
-
create user '用户名'@'IP地址' identfied by'用户密码';
-
创建一共用户在任意ip地址上登录MySQL:
-
create user 'moon'@'%' identfied by'3306'; exit;------退出
-
-
修改密码:
-
-- 5.7版本需要使用password对密码进行加密 set password for moon@'%' =password('新密码'); -- 8.0版本直接赋值 set password for moon@'%' ='新密码';
-
给用户授权
给指定用户在指定数据库上赋予【指定的权限】
-
权限:
-
create:可以创建数据库
-
select:查询数据
-
delete:删除数据
-
update:修改数据
-
insert:插入数据
-
-- 语法: grant `权限1,权限2....权限n`(all 给他所有权限除了创建用户) on `数据库名`.`表名`(*代表全部的表) to `用户名`@`ip地址`; -- 这里使用的是着重符,不是单引号
-
撤销授权
-- 语法:revoke `权限1,权限2....权限n` on `数据库名`.`表名` from `用户名`@`ip地址`;
查看指定用户授权
-- 语法 show grants for `用户名`@`ip地址`;
删除用户
-- 语法:drop user `用户名`@`ip地址`;
2.1.2 DDL(数据定义语言)
DDL主要是用在定义或改变表的结构。
创建表
/*
create table 表名(
字段名1(列名) 类型(长度) 约束条件,
字段名2(列名) 类型(长度) 约束条件,
字段名3(列名) 类型(长度) 约束条件,
......
字段名n(列名) 类型(长度) 约束条件;
);
*/
- 在关系型数据库中,需要这项表名和字段名,同时设定。
数据类型
整型
MySQL数据类型 | 含义 |
---|---|
tinyint | 1个字节,范围(-128~127)【用来存性别】 |
smallint | 2个字节,范围(-3万多~3万多) |
mediumint | 3个字节,范围(-8w多~8w多) |
int | 4个字节,范围() |
bigint | 8个字节,范围(非常大) |
-
在整型中默认使用的是【有符号的】
-
我们可以使用一个关键字【unsigned】,定义成无符号类型
tinyint unsigned
的取值范围为0~255
-
如果长度需要配合【zerofill——用0来填充】
-
int(4) unsigned zerofill ;
-
说明:上述的int长度为4,如果设置了zerofill,如果数据是1,最终存到表中的数据为0001。
-
浮点型
MySQL的数据类型 | 含义 |
---|---|
float(m,d) | 4个字节,单精度浮点型,m总长度,d小数位 |
double(m,d) | 8个字节,双精度浮点型,m总长度,d小数位 |
decimal(m,d) | decimal是存储为字符串的浮点数,【对应Java中的BigDecimal】 |
- 例——定义一个float(5,3):
- 插入数据123.1231,最后得到的结果就是99.999
- 插入数据12.345678,最后得到的结果就是12.346
- 【在使用浮点型的时候,要以插入到数据库中的实际结构为准】
字符串类型
MySQL数据类型 | 含义 |
---|---|
char(n) | 固定长度,最多255个字符 |
varchar(n) | 可变长度,最多65535个字符 |
tinytext | 可变长度,最大255个字节 |
text | 可变长度,最大65535个字节 |
mediumtext | 可变长度,最大16MB |
longtext | 可变长度,最大4GB |
- char和varchar的区别
- char类型是【定长】的类型,当定义char(10),输入“123”时,他们占用的空间依然是10个字符,当输入的字符超出了指定的长度,char会截取超出的字符。而且,当存储char,MySQL会自动删除输入字符串末尾的空格。
- char适合存储很短的,固定长度的字符串。例如,char非常适合存储密码MD5值(银行密码),因为它是一个定长的值。对于短的列,char比varchar在存储空间上效率更高
- varchar(n)类型用来存储可变长度,长度最大为n个字符的可变长度的字符串数据。例如varchar(10),然后存储“abc”,实际就存储了3个字符。
- char类型每次修改的数据长度相同,效率更高,varchar,每次修改的数据长度如果不同,效率会更低一些。
- varchar和text的区别
- text不能设置默认值,varchar可以设置默认值
- text类型,由于单表最大行宽的限制,支持溢出存储,【在数据页中只会存放768个字节】,剩余的数据会存储在溢出段中。
- 一般都是用varchar。
日期类型
MySQL数据类型 | 含义 |
---|---|
date | 3字节,日期,格式:2022-8-15 |
time | 3字节,时间,格式:10:54:32 |
datetime | 8字节,日期时间,格式:2022-8-15 10:55:13 |
timestamp | 4字节,时间戳,毫秒数 |
year | 1字节,年份 |
建表约束
因为一张表要有多个列,数据库中的表不止有一个,建表约束说的就是我们应该如何规范表中的数据和表之间的关系
MySQL的约束类型
约束名称 | 描述 |
---|---|
NOT NULL | 非空约束 |
UNIQUE | 唯一约束,取值不能重复 |
PRIMARY KEY | 主键约束(主关键字),自带非空,唯一,索引 |
DEFAULT | 默认值 |
FOREIGH KEY | 外键约束,表和表之间的约束 |
-
NOT NULL非空约束
-
CREATE TABLE `student` ( `stu_id` INT , `stu_name` VARCHAR(50) NOT NULL, `gender` CHAR(1) DEFAULT '男', `brithday` datetime , PRIMARY KEY(stu_id) );
-
-
UNIQUE唯一约束
-
CREATE TABLE `book`( `id` INT PRIMARY KEY auto_increment, `name` VARCHAR(50) NOT NULL, `bar_code` VARCHAR(30) NOT NULL, `aut_id` INT NOT NULL, UNIQUE(bar_code) );
-
-
主键约束
-
CREATE TABLE `author`( `aut_id` INT, `aut_name` VARCHAR(50) NOT NULL, `gender` CHAR(1) DEFAULT '男', `country` varchar(50), `brithday` datetime, PRIMARY KEY(aut_id,aut_name) );
-
-
外键约束
- 推荐配合主键去使用,有了这个约束,我们在向表中插入数据,来源另一张表的主键
- 外键会产生的效果;
- 删除表的时候,如果不删除引用外键的表,被引用的表是不能直接删除。
- 外键的值必须来源于引用的表的主键字符。
-
create table `book` ( `id` int PRIMARY KEY auto_increment, `name` varchar(50) not null, `bar_code` VARCHAR(30) not null UNIQUE, `aut_id` int not null, FOREIGN KEY(aut_id) REFERENCES author(aut_id) ); -- FOREIGN KEY(主键) REFERENCES 表名(主键)
-
【创建表的时候,建议字段名使用着重符】
对表的修改操作:
-
查看当前库里的所有表
-
SHOW TABLES;
-
-
查看表结构:
-
-- DESC `表名`; -- 查看当前库下的表的结构
-
-
修改表(5个操作),但是前缀都是一样的alter table 表名 ......:
-
添加列:
-
ALTER TABLE author ADD(hobby VARCHAR(20) ,`address` VARCHAR(50)) -- 添加列
-
-
修改列数据类型:
-
ALTER TABLE author MODIFY `address` VARCHAR(10) -- ALTER TABLE 表名 MODIFY 字段名 数据类型
-
-
修改列名称和数据类型:
-
ALTER TABLE author CHANGE `country` `adrr` VARCHAR(12); -- ALTER TABLE 表名 change 旧字段名 新字段名 数据类型
-
-
删除列:
-
ALTER TABLE author DROP `adrr` ; -- ALTER TABLE 表名 DROP 字段名
-
-
修改表名:
-
ALTER TABLE `authors` RENAME `author`; -- ALTER TABLE 旧表名 RENAME 新表名
-
-
删除表:
-
DROP TABLE if EXISTS `book` -- DROP TABLE IF EXISTS 表名
-
-
2.1.3 DML(数据操作语言)
该语言来对表记录进行操作(增,删,改),不包含查询
插入数据
-
-- insert into 表名 (字段名) values (插入数据与字段名一一对应) -- 如果插入全字段 ,字段名可以省略
-
说明:
- 在数据库中所有的字符串类型,必须使用引号
- 如果部分字段插入,必须列名和值要匹配。如果全字段插入,则列名可以省略【不建议省略,可维护性较低】
-
批量插入
-
-- insert into 表名 (字段名) values (插入数据与字段名一一对应),(插入数据)
-
修改数据
-
-- update 表名 set 字段名1='值1',字段名2='值2' where 字段名='值' -- where 后边是修改的条件
-
where是一个关键字,我们可以用where关键字来实现丰富的筛选,与Java中的if语句相似,可以使用复杂的条件运算:
- =(没有==,equals)
- !=
- between ..and
- in(...)
- not
- or
- is null
- and
删除数据
-
全部删除
-
-- delete from 表名
-
-
根据条件去删除
-
-- delete from 表名 where 条件
-
-
说明:通过delete删除的数据有一个明显的问题——主键如果是自动递增,会断档
-
截断(清空表):
-
-- TRUNCATE 表名
-
TRUNCATE实际上属于DDL语言,操作立即生效,不能撤回
- TRUNCATE和delete都是删除数据,drop删除整个表。
- TRUNCATE速度快,效率高,可以理解为直接删除整个表,再重新建立。
- TRUNCATE和DELETE都不会使表结构以及列,约束,索引的发生改变。
-