初始MySQL
javaEE: 企业级Java开发 web
前端 (页面:展示,数据)
后台(连接点:连接数据库JDBC ,连接前端(控制,控制试图跳转,和给前端传递数据))
数据库(存数据,txt,excel,word)
只会写代码,学好数据库,基本混饭吃;
操作系统,数据结构与算法!当一个不错的程序员
离散数学,数学电路,体系结构,编译原理。+实战经验,高级程序员,优秀的程序员
为什么学习数据库
- 岗位需求
- 现在的世界,大数据时代,得数据者得天下。
- 被迫需求:存数据 去IOE
- **数据库是所有软件体系中最核心的存在 **DBA
什么是数据库
数据库(DB,DateBase)
概念:数据仓库,软件,安装在操作系统(window,linux,mac…)之上!SQL,可以存储大量的数据。500万!
作用:存储数据,管理数据 Excel
数据库分类
关系型数据库:(SQL)
- MySQL, Oracle , Sql , Server,DB2,SQLlite
- 通过表和表之间,行和列之间的关系经行数据的存储,
非关系数据库:(NoSQL) Not Only(不仅仅是SQL)
- Redis,MongDB
- 非关系型数据库,对象存储,通过对象的自身的属性来决定。
DBMS(数据管理系统)
- 数据库的管理软件,科学有效的管理我们的数据。维护和获取数据;
- MySQL,数据库管理系统!
MySQL介绍
MySQL是 一个关系型数据库管理系统
MySQL是最好的RDBMS应用软件之一。
开源的数据库软件~
体积小,速度块,总体拥有成本低,招人成本比较低,
版本
5.7 稳定
8.0 一般
安装建议:
- 尽量不要使用exe ,注册表
- 尽可能使用压缩包安装
-
MySQL登录
- mysql -uroot -p密码
2. mysql -hip -uroot -p连接目标的密码
3. mysql --host=ip --user=root --password=连接目标的密码
- mysql -uroot -p密码
MySQL退出
1. exit
2. quit
1.什么是SQL?
-
Structured Query Language:结构化查询语言
-
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
2.SQL通用语法
1. SQL 语句可以单行或多行书写,以分号结尾。
2. 可使用空格和缩进来增强语句的可读性。
3. MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
4. 3 种注释
- 单行注释: -- 注释内容 或 # 注释内容(mysql 特有)
- 多行注释: /* 注释 */
5. SQL分类
- DDL(Data Definition Language)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
- DML(Data Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
- DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select, where 等
- DCL(Data Control Language)数据控制语言(了解)
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等
DDL:操作数据库,表
1. 操作数据库:CRUD
1. C(Create):创建
* 创建数据库:
* create database 数据库名称;
* 创建数据库,判断不存在,再创建:
* create database if not exists 数据库名称;
* 创建数据库,并指定字符集
* create database 数据库名称 character set 字符集名;
* 练习: 创建db4数据库,判断是否存在,并制定字符集为gbk
* create database if not exists db4 character set gbk;
2. R(Retrieve):查询
* 查询所有数据库的名称:
* show databases;
* 查询某个数据库的字符集:查询某个数据库的创建语句
* show create database 数据库名称;
3. U(Update):修改
* 修改数据库的字符集
* alter database 数据库名称 character set 字符集名称;
4. D(Delete):删除
* 删除数据库
* drop database 数据库名称;
* 判断数据库存在,存在再删除
* drop database if exists 数据库名称;
5. 使用数据库
* 查询当前正在使用的数据库名称
* select database();
* 使用数据库
* use 数据库名称;
2. 操作表
1. C(Create):创建
1. 语法:
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
....
列名n 数据类型n
);
* 注意:最后一列,不需要加逗号(,)
* 数据库类型:
1. int:整数类型
* age int,
2. double:小数类型
* score double(5,2)
3. date:日期,只包含年月日,yyyy-MM-dd
4. datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
5. timestamp:时间错类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
* 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
6. varchar:字符串
* name varchar(20):姓名最大20个字符
* zhangsan 8个字符 张三 2个字符
* 创建表
create table student(
id int,
name varchar(32),
age int ,
score double(4,1),
birthday date,
insert_time timestamp
);
* 复制表:
* create table 表名 like 被复制的表名;
2. R(Retrieve):查询
* 查询某个数据库中所有的表名称
* show tables;
* 查询表结构
* desc 表名;
3. U(Update):修改
1. 修改表名
alter table 表名 rename to 新的表名;
2. 修改表的字符集
alter table 表名 character set 字符集名称;
3. 添加一列
alter table 表名 add 列名 数据类型;
4. 修改列名称 类型
alter table 表名 change 列名 新列别 新数据类型;
alter table 表名 modify 列名 新数据类型;
5. 删除列
alter table 表名 drop 列名;
4. D(Delete):删除
* drop table 表名;
* drop table if exists 表名 ;
thiyint 十分小的数据 1个字节
smallint 较小的数据 2个字节
mediumint 中等大小的数据 3个字节
int 标准的整数 4个字节 常用
bigint 较大的整数 8个字节
float 浮点数 4个字节
double 浮点数 8个字节(精度问题!)
decimal 字符串形式的浮点型 金融计算的时候,一般是使用deciaml
字符串
-
char 字符串固定大小的 0-255
-
varchar 微型文本 2^8-1
-
text 文本串 2^16-1 保存大文本
时间日期
-
data YYYY-MM-dd ,日期格式
-
time HH-mm-ss ,时间格式
-
datetime YYYY-MM-dd HH-mm-ss 最常用的时间格式
-
timestamp 时间戳,1970.1.1到现在的毫秒
-
year 年份表示
null
- 没有值,未知
- 注意,不要使用NULL经行运算,结果为NULL
数据库的字段属性(重点)
Unsigned:
- 无符号的整数
- 声明了该列不能声明为负数
zerofill
- 0填充的
- 不足的位数,使用0来填充,int(3),5----
自增:
- 通常理解为自增,自动在上一条记录的基础上+1(默认)
- 通常用来设计唯一的主键- index ,必须是整数类型
- 可以自定义设计主键自增的起始值和步长
非空 Null not null
- 假设设置为not null ,如果不给它赋值,就会报错!
- NUll,如果不填,默认就是null
默认:
- 设置默认的值
- sex ,默认值为男,如果不指定该列的值,则会有默认的值!
更新:每一个表,都必须存在以下五个字段!未来做项目的,表示一个记录存在的意义!
- id 主键
- version 乐观锁
- is delete 伪删除
- gmt_create 创建时间
- gmt_update 修改时间
关于数据库引擎
INNODB 默认使用
MYISAM 造些年使用的
MYLSAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大 |
常规使用操作:
- MYISAM 节约空间,速度较快
- INNODB 安全性高,事务的处理,多表多用户操作
在物理空间在的位置
所有的数据库文件都存在data目录下
本质还是文件的存储
MySQL 引擎在物理文件上的区别
- InnoDB在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
- MYISAM 对应文件
- *.frm 表结构的定义文件
- *.MYD 数据文件(data)
- *.MYI 引擎文件(index)
设置数据库的字符集编码
character set utf8
注意点:
- ``字段名,使用这个包裹!
- 注释 --/**/
- sql关键字大小写不敏感,建议大家写小写
- 所有名字用英文
MySQL数据管理
外键(了解即可)
方式一,在创建表的时候,增加约束(麻烦,比较复杂)
删除有外键关系的表时候,必须要先删除引用别人的表,后删除被引用的表
方式二,创建表完了以后,增加约束
alter table 表名 add constraint 约束名 foreign key (作为外键) refernces 哪个表(那个字段)
最佳实践
- 数据库就是单纯的表,只用来存储数据,只有行(数据)和列(字段)
- 我们想使用多张表的数据,想使用外键(程序去实现)
DML:增删改表中数据(重点)
1. 添加数据:
* 语法:
* insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
* 注意:
1. 列名和值要一一对应。
2. 如果表名后,不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,...值n);
3. 除了数字类型,其他类型需要使用引号(单双都可以)引起来
2. 删除数据:
* 语法:
* delete from 表名 [where 条件]
* 注意:
1. 如果不加条件,则删除表中所有记录。
2. 如果要删除所有记录
1. delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
2. TRUNCATE TABLE 表名; -- 推荐使用,效率更高 先删除表,然自增会归零,后再创建一张一样的表。
DELETE 删除的问题,重启数据库,现象
1. InnoDB 自增列会重1开始,(存在内存当中的,断电即失)
2. MyISAM 继续从一个自增量开始(存在文件中的,不会丢失)
3. 修改数据:
* 语法:
* update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
* 注意:
1. 如果不加任何条件,则会将表中所有记录全部修改。
2. value 是一个具体的值,也可以是一个变量
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
<>或者!= | 不等于 | 5<>6 | true |
BETWEEN…and… | 在某一范围内 | [2,5] | |
AND | 我和你&& | 5>1and1>2 | false |
OR | 我或你|| | 5>1or1>2 | true |
DQL:查询表中的记录(最重点)
* select * from 表名;
select version() -- 查询系统版本(函数)
select 100*9-10 as 计算结果 -- 用来计算(表达式)
select @@auto_increment_increment -- 查询自增的步长 变量
-- 某某字段+1 查看
select 字段,字段+1 as '提分后' from 表名
数据库中的表达式: 列表,函数.....
select `表达式` from 表
1. 语法:
select
字段列表cha
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
2. 基础查询
1. 多个字段的查询
select 字段名1,字段名2... from 表名;
* 注意:
* 如果查询所有字段,则可以使用*来替代字段列表。
2. 去除重复:
作用:去除SELECT查询出来的结果中重复的数据,只显示一条
* distinct
如:select distinct 字段 from 表名
3. 计算列
* 一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
* ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
* 表达式1:哪个字段需要判断是否为null
* 如果该字段为null后的替换值。
4. 起别名:AS 可以给字段起别名,也可以给表起别名
* as:as也可以省略
如: select 字段 as 某某,as 某某 from 表名 as 某某
5. 函数 concat(a,b)
如: select concat('名字:',name) as 新名字 from 表名 as 某某
3. 条件查询
1. where子句后跟条件
2. 运算符
* > 、< 、<= 、>= 、= 、<>
* BETWEEN...AND
* IN( 集合)
* LIKE:模糊查询
* 占位符:
* _:单个任意字符
* %:多个任意字符
* IS NULL
* and 或 &&
* or 或 ||
* not 或 !
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为null |
IS NOT NULL | a is not null | 如果操作符不为null |
BETWEEN | a between b and c | 若 a 在 b 和c 之间 |
Like | a like b | SQL匹配,如果a匹配b,则结果为真 |
In | a in (a1,a2,a3…) | 假设a在a1 ,或者a2…其中某一值中,则结果为真 |
-- 查询年龄大于20岁
SELECT * FROM student WHERE age > 20;
SELECT * FROM student WHERE age >= 20;
-- 查询年龄等于20岁
SELECT * FROM student WHERE age = 20;
-- 查询年龄不等于20岁
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;
-- 查询年龄大于等于20 小于等于30
SELECT * FROM student WHERE age >= 20 && age <=30;
SELECT * FROM student WHERE age >= 20 AND age <=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
-- 查询年龄22岁,18岁,25岁的信息
SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
SELECT * FROM student WHERE age IN (22,18,25);
-- 查询英语成绩为null
SELECT * FROM student WHERE english = NULL; -- 不对的。null值不能使用 = (!=) 判断
SELECT * FROM student WHERE english IS NULL;
-- 查询英语成绩不为null
SELECT * FROM student WHERE english IS NOT NULL;
-- 查询姓马的有哪些? like
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询姓名第二个字是化的人
SELECT * FROM student WHERE NAME LIKE "_化%";
-- 查询姓名是3个字的人
SELECT * FROM student WHERE NAME LIKE '___';
-- 查询姓名中包含德的人
SELECT * FROM student WHERE NAME LIKE '%德%';