mysql是一个关系型数据库,与sql server、oracle等类似。 web开发黄金搭档:
wamp(windows,apache,mysql,php)
lamp(linux,apache,mysql,php)
mysql早期是由瑞典的一家公司开发,现在被oracle收购,所以一部分的功能进入商业化。 mysql出现了两种版本商业版,社区版。mariadb与mysql类似,在linux服务器上默认支持mariadb。 mysql版本: 5.5,5.6,5.7,8.0+
二、mysql的市场占有率
https://db-engines.com/en/ranking
三、开源的理解
GPL(Copyleft): 该协议具有传染性,如果基于GPL协议发布的软件做了多次修改后,再次发布,要求也必须开源。 MIT: 协议保护你任意使用这个软件的权力,你可以修改后闭源,也可以售卖这个软件,怎么都可以,但是要是因为使用软件出现任何损失,作者概不负责。
四、mysql的三层架构
一层: 大多数基于网络的工具或服务都有类似架构。用于处理连接,授权,安全等。
二层: 包含了大多数Mysql的核心服务功能,包括查询解析、分析、优化、缓存以及所有的内置函数(日期,时间,数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。【值得注意的是,为了保证更快的响应及更好的扩展,在开发中尽量不要设置存储过程,触发器,视图等】
三层: 包含了存储引擎。存储引擎负责MySQL中数据的存储和提取,类似于文件系统负责数据的真正存储。服务器通过API与存储引擎进行通信,这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。【因为InnoDB对事务的支持以及良好的读写速度,所以在项目中一般使用InnoDB引擎】
五、SQL(Structured Query Language)
称为结构化查询语言。SQL主要应用于关系型数据库,具有通用性。
1、专业术语(DBMS)
数据库: 数据库是一些关联表的集合。 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。 外键:外键用于关联两个表。 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
2、数据类型
数值型
| 类型 | 字节数 | 用途 |
|---|---|---|
| tinyint | 1 | 小整数 |
| smallint | 2 | 大整数 |
| mediumint | 3 | 大整数 |
| int | 4 | 大整数 |
| bigint | 8 | 极大整数 |
| float | 4 | 单精度浮点 |
| double | 8 | 双精度浮点 |
| decimal | decimal(M,D) | 小数值 |
日期时间
| 类型 | 大小 | 格式 |
|---|---|---|
| date | 3 | YYYY-MM-DD |
| time | 3 | HH:MM:SS |
| year | 1 | YYYY |
| datetime | 8 | YYYY-MM-DD HH:MM:SS |
| timestamp | 4 | YYYYMMDD HHMMSS |
字符串
| 类型 | 大小 | 用途 |
|---|---|---|
| char | 0-255 | 定长字符串 |
| varchar | 0-65535 | 变长字符串 |
| text | 0-65535 | 长文本型 |
3、数据库管理语句
数据库操作
查看所有数据库
show databases;
创建数据库
create database 数据库名称 charset=utf8;
查看数据库创建时的详情
show create database `数据库名称`;
删除数据库
drop database 数据库名称
修改数据库编码
alter database `数据库名` charset=utf8;
注意:要修改数据库名称,只能删库重建.
选择当前要操作的数据库
use `数据库名`
2. 表管理
查看表
show tables
创建表
create table if not exists `表名`(
字段名 类型(长度) 属性...,
...
)engine=innodb charset=utf8;
案例:创建用户表
create table if not exists `users`(
-> uid int(10) auto_increment primary key comment'用户id',
-> name varchar(30) not null default'',
-> phone char(11) not null default'',
-> email varchar(50) not null default'',
-> regist_time datetime,
-> card char(18) not null default''
-> )engine=innodb charset=utf8;
--说明: if not exists: 表不存在则创建,存在则忽略。 auto_increment:自增 primary key:主键(索引)---不能重复,不能为空 comment:设置备注 not null: 不允许为空 default: 默认值 engine: 表的存储引擎
查看建表详情
show create table `表名`;
desc 表名; #查看表结构
修改表名
alter table `old name` rename to `new name`;
alter table 表名 charset=utf8; #修改表字符集
删除字段
alter table 表名 drop 字段名;
添加字段
alter table 表名 add 字段名 字段属性... [first|after] 字段;
修改字段
alter table 表名 change 旧字段 新字段 新字段属性;
alter table 表名 modify 字段 属性; ##修改字段属性
删除表
drop table 表名;
添加数据
insert into 表名 (字段列表) value (值列表);
例如:
insert into classes (`cid`,`cname`) value (1,'大数据1班');
说明:
字段列表与值列表一一对应
-----------------------------------------------------------
insert into 表名 value (值列表);
例如:
insert into classes value (2, '大数据2班');
说明:
如果插入的数据包含了所有字段,则字段列表可以不写。
但是值列表顺序必须参照表字段顺序。
-----------------------------------------------------------
批量插入:
insert into 表名 values (值列表1),(值列表2)...;
例如:
insert into classes values (null, '人工智能1班'),
(null, '人工智能2班'),(null, '人工智能3班'),
(null, '软件开发1班');
数据查询
select 字段列表 from 表名
例如:
select cid,cname from `classes`;
说明:
如果要查询所有字段,可以使用*表示匹配所有字段。
select * from `classes`;
但是在实际工作中,不推荐使用。应尽量列举需要的字段。
--------------------------------------------------------
完整语法结构:
select 字段列表
from 表
where 条件
group by 字段,分组
having 条件,与group by子句成对出现
order by 字段 [ASC/DESC],排序ASC正序(默认值),DESC倒排序
limit n,m n起始下标,m查询条数; limit m m显示条数
删除数据
delete from 表名 where 条件;
说明:
条件必须要加,否则会导致全表删除。该删除为物理删除。
-------------------------
擦除表:
truncate 表名;
修改数据
update 表名 set 修改的字段列表 where 条件;
----------------------
案例:将cid为6的班级名改为大数据3班
update classes set cname='大数据3班' where cid=6;
SQL语句分类
DQL: 数据查询语言(select)
DML: 数据操作语言(insert,update,delete)
DDL: 数据定义语言(create,alter...)
DCL: 数据控制语言(权限分配...)
常用子句
where
表示条件筛选
基本句式
select field1,field2... from table1,table2...
[where 条件1 or|and 其他条件]
运算符
> 大于 < 小于 \= 等于 !=,<> 不等于 >= 大于等于 <= 小于等于 <=> 等于,可用于比较空值,相等返回1,否则返回0
like
用法: 1、like可以在条件筛选中表示模糊匹配。
#匹配姓张的同学
select * from student_info where std_name like '张%';
说明:
%----匹配任意多个字符
_----匹配1个字符
2、用于表的复制或创建
#复制student_info表的结构到新表student_info_bak
create table `student_info_bak` like `student_info`;
#将student_info的表数据备份到student_info_bak1
create table student_info_bak1 select * from student_info;
between...and
表示范围:
#查找sid在3-6之间的记录
select * from student_info where sid between 3 and 6;
in(,,)
表示包含
#查找sid是3,6,8的信息
select * from student_info where sid in(3,6,8);
group..by
分组:分组后,只会显示每组中的第一条记录。
select * from student_info group by cid;
order..by
表示排序
#根据出生日期正序排列
select * from student_info order by std_birth asc;
limit
表示限定: limit m; limit n,m n表示起始位置,m表示条数
#查询年龄最大的学生信息
select * from student_info order by std_birth asc limit 1;
#从第5条数据开始查询5条记录
select * from student_info limit 4,5;
union
连接多表查询,使用unioin查询会自带去重操作,如果不需要去重则可以使用 union all
select * from student_info
-> union all
-> select * from student_info_bak;
多表联查
[left|right|inner] join on
inner join
内连接查询,在两个关联表中都有对应数据时显示。
#内连接查询: 表1 inner join 表2 on 关联条件
select * from student_info join classes on student_info.cid=classes.cid;
#多表查询
select * from student_info,classes where student_info.cid=classes.cid;
left|right join
主表 left join 附表 on 连接条件 左连接;
附表 right join 主表 on 连接条件 右连接;
-------
说明:
主表的数据会全部显示,附表中如果没有对应数据时显示为null。
通常小表作为主表大表作为附表。
null处理
在对空值做判断时,不应使用“=”,而应该使用 is null 或者 is not null is null 为空则返回true is not null 不为空则返回true 也可以使用“<=>”判断空值
#查询出表中cname不为空的所有记录
select * from test_cls where cname is not null;
mysql中的正则
与java中正则的元字符类似
#匹配以“人工智能”开头的所有记录
select * from test_cls where cname regexp '^人工智能.+';