#作者:允砸儿
#日期:乙巳青蛇年 四月初九
笔者继续带朋友们了解mysql数据库中篇的内容。多了不说,少了不唠,咱们直接就开写。
书接上回笔者在上篇中介绍了什么是数据库和数据库的一些基础的概念,以及mysql数据库的内容。接下来笔者以navicat作为工具来编辑数据库和最重要的增删查改的命令语句。
表约束
什么是表约束:是对表中的数据进行限定,保证数据的正确性、有效性和完整性。
1、主键约束:确保主键列的每一个值都唯一,主键列不能为NULL(空)。主键primary key :用于确保表中的每一行都有可以识别自己的一列或多列。
2、外键约束:是用来维护数据库表之间数据一致性和完整性的一种机制。它指定了一个表中的列(或列的组合)必须在另一个表的主键或唯一键列中有对应的值。
通过外键约束可以确保在一个表(称为子表或从表)中的值在另一个表(称为父表或主表)中已经存在,从而防止孤立数据的产生。外键foreign key:是一个主表联系另一张表中以做联结,可以一对一,一对多,多对多。
索引
什么是索引?
为了在一个数据表里检索某个特定的记录,或者提取一系列数据记录,MySQL必须把这个数据表里的所有数据记录都搜索一遍。如果数据表的体积比较庞大,在遇到这样一些查询的时候性能就会显著的下降。为解决性能下降的问题可以为查询所涉及的数据列创建并使用一个索引。
#比如:为了解决查询速度慢的问题,我们会使用索引,加快检索速度的操作数据修改变得更快。就像书籍的目录一样。
索引的分类
1、普通索引:不唯一的可以为唯空
2、唯一索引:可以唯空的但是唯一的
3、主索引:又唯一又不能唯空
选项和属性
1、AUTO _INCREMENT(自增):用于为表中的某一列(通常是主键列)自动生成唯一的递增值。
2、NULL(为空)
3、NOT NULL(不为空)非空约束,用于约束该字段的值不能为空。
4、DEFAULT(默认)
SQL介绍
首先用Windows自带的黑窗口连接 mysql -u root -p,或者直接用navicat直接连接
SQL-结构化查询语言
1、数据定义语言(DDL):用于创建和修改数据库对象(如表和索引)的结构,如creat、alter、drop等语句。
2、数据操纵语言(DML):用于数据据库中的数据进行新增、修改、删除等操作,如:insert、update、delete等语句。
3、数据查询语言(DQL):用于对数据进行查询操作。如:select语句。
4、数据控制语言(DCL):用于控制用户对数据的访问权限,如:grant和revoke语句。
一、数据定义语言(DDL)
1、注释:单行注释: #
单行注释:-- (减减空格)
多行注释:/* 内容 */
(笔者在学习的时候我的老师告诉我注释内容很重要,要养成一个好习惯,还有一个sql漏洞就是关于注释的,笔者会在后面讲。)
2、新建数据库:
creat database (数据库名);创建数据库
creat database if not exists (数据库名); if判断,如果不存在则创建库
#笔者在这里犯过很多小错误,1、database没有s。2、utf-8 _ci是可以不区分大小写3、记住必须得有;结尾,但是如果只运行一行可以不加;(分号)4、一定要是英文,字符、语句都必须是英文的。
3、字符集:
字符集(Character Set)在MySQL中是指一套用于存储、处理和检索文本数据的字符和编码规则。它定义了数据库中可以使用的字符集合,以及这些字符如何映射到数字编码上。
笔者将创建数据库和指定字符集结合一下
create database (数据库名)characterset(字符集);
修改数据库的字符集:
alter database (数据库名) characterset(字符集);
4、查看数据库的字符集:
show create database (数据库名);
删除数据库(删库跑路):
drop database (数据库名);
使用数据库:
use (数据库名);
以上内容笔者简单写一下,下面我们就先创建一个数据库,随后在数据库里面创建表。
在数据库里面创建表
笔者在这里讲一下如何用命令创建数据表,也可以直接在navicat直接创建(可视化的还是比较简单的),笔者在写一下建表要用到的概念,数字(int),汉字,英文(字符串varchar),数值,价格(double),日期 (data)......
-- 查询所有的数据表
show databases ;
-- 创造一个名字为xuesheng的表
create database xuesheng;
-- 查询一下所有的表
show databases ;
-- 改变数据表的字符类型
alter database xuesheng characterset set utf8mb4;
-- 创建字段,在xuesheng数据表中.注意需要给varachar后面添加长度
creat table product (
id int,
p_name varachar(20),
price double,
stock int,
insert_time data
);
-- 查看表结构
desc product;
-- 修改表名字
alter table product rename to tet;
-- 修改数据类型
alter table tet modify p_name varachar(20)
-- 如果没有设置主键需要在编辑器里面留一个id位置
insert into tet (name,price,stock,insert time) values('电脑’,99,50,'2025-9-10’),('显示器’,199.99,50,'2025-9-18'),(智能手表’,99.599,58,'2025-9-10')('鼠标',99.899,50,'2025-9-10');
-- 添加所有字段
insert into tet values ('电脑',99,50,'2025-9-10');
-- 如果给一个字段写不同值,让每一个值都是不同行的,用,(逗号)隔开是分行。
insert into tet(name)values('ss''bb')
select * from tet
-- 修改数据,update 表名字 set 修改后的东西 条件 where id=2这是唯一的数据因为他是主键(这里面写唯一的数据)
update tet set name='电冰箱’where id=2
update tet set price=10 where id=4
select * from tet
-- 删除数据
delete from tet where id=6;
-- 查询表
select * from tet;
select id,name,price from tet
简单的建完了一张表,然后把数据存在了数据库表中,这里面有一个小知识,不能有一样的名字,出现一样的名字会报错。
二、数据库操纵语言(DML)
1、insert into 插入数据
insert into(字段) values();#字段是mysql服务器架构第一层,#字段不能用单引号去加,应该用反引号``。
数据库的架构第一层是dbms,第二层是数据库,第三层是数据表,最后是字段。表名、字段名都可以是反引号,值需要单引号双引号去做
2、updata 修改数据
3、delete 删除数据
三、数据查询语言(DQL)
-- 查询数据表
select (列名) from (表名);
-- 查询整个表
select * from `tet`
-- 条件查询
select (列名) from(表名) where (条件);
-- 模糊查询
select (列名) form (表名)where (列名) like ‘’(%:匹配零个或多个字符:_:匹配单个字符。)
-- 聚合查询
1、count():计算行数
比如:查询整个表的行数直接会写在后面
select count(*) from tet;
2、max():返回数值列中的最大值
比如:查询表中的最高价格
select max(price) from tet;
3、min():返回数值列中的最小值
4、 sum():计算数值列的总和。
5、 avg():计算数值列的平均值。
***group_concat()
它是mysql当中的聚合函数,它允许我们将多行的字符串组合成一个字符串,非常方便我们输出。
比如:查询名字和价格合体在一起
select group_concat(name,'-',price) from tet;
-- 排序查询
select(列) from(表) order by (列) desc/asc;(asc 为升序,desc为降序)
***group by 用于结合聚合函数,根据一个或多个列对结果集进行分组
-- 分页查询
select * from 表名 limit (页码-1) *每页数量,每页数量;
-- mysql表关系
1、一对一表关系:
一对一(1:1)表关系是一种较为特殊的表关系,表示一个表中的一条记录与另一个表中的一条记录有唯一的对应关系。这种关系通常用于将一个表的某些列分离到一个新的表中以便保持数据的清晰性和模块化。
2、一对多表关系:
这意味着在一个表中,可以有多个记录与另一个表中的单个记录相关联。常用于表示两个表之间的连接,其中一个表中的多行可以与另 一个表中的单行相关联。这种关系通常通过外键(ForeignKey)来实现。
-- 多表查询
1、union查询:
用于合并两个或多个select语句的结果集,同时去处重复的记录。每个select语句必须拥有相同数量的列,列的数据类型也必须兼容。union默认为union all,但union all会包含所有的重复记录,而union会去除重复记录。
比如:select * from person union select name,price,stock,id from tet;
2、子查询:
子查询是一种在sql语言中嵌套查询下层的程序模块。当一个查询是另一个查询的条件时,这个被嵌套的查询就会被称为子查询。子查询也被称为内查询或内部选择,而包含的语句则被称为主查询或外部查询。
比如:select name,age from person where age=(select max(age) from person);
数据库加固
笔者用通俗的语言写一下什么是数据库加固,它是一个非常复杂的工作,他是去保护数据库的安全,去解决它存在的一些安全问题,每一种安全问题做一些方案,保证业务系统稳定的运行。
怎么样加固呢?笔者老师当时交的是6种,数据库加固有非常多的方法,朋友们可以去其他大神那里学习一下,笔者在这里就简单的写一下。
1、强密码---复杂的密码
比如:root的密码就是弱口令(数字大小写密码)
2、修改账号名
比如:修改账号root账号名(但是不建议大家尝试阿,笔者有一款游戏的安全锁密码给忘了手机号也换了导致交易不了东西,悲!!!)
3、禁止远程连接数据库
update user set host=‘localhaost’ where user=‘joker’and host=‘%’
4、关闭端口
默认端口3306,nmap可以扫描端口,定期修改数据库端口or不开mysql端口
5、安装最新补丁
select version()
6、web应用防火墙
买一些数据库审计设备,这需要强大的财力。
总结笔者把数据库里面最基础的知识已经写完,数据库后篇内容笔者会结合php与数据库连接。在浅淡一下sql注入。遇到了学习瓶颈不要放弃,可以听听红歌,看看以前的红书,颓废的感觉和负能量一扫而空。最后,希望和大家一起努力,一起变得更强。