目录
1.什么是MySQL
MySQL是个数据库管理系统,用于创建,维护,管理数据库。数据库以表微单位存储数据,表内包含了字段(某一类数据的属性)和记录(某一类数据的集合 )这是一个开源的关系型数据库,支持SQL语句,支持可视化工具操作,如Navicat。下面图上是一个具体的结构模型,但是实际上当我们在库里建一个名为customer的table时id,name等都是按列排列的,同时id可以设置为AUTO_INCREMENT,这个是什么玩意待会再解释。
唠一下MySQL的前世今生:
MySQL是一种流行的关系型数据库管理系统(RDBMS),于1995年发布,由瑞典的MySQL AB公司推出。当时其首席开发人员为Monty Widenius,并在瑞典、芬兰和美国共同办公。 MySQL最初是一个类似于PostgreSQL的开源项目,但最终被设计成更快、更易于使用的解决方案。
2003年,MySQL AB 公司发布第一个商业化版本 MySQL 4.0,并逐渐发展成为一个全球性质的企业级数据库管理系统,吸引了越来越多的支持者和用户。2008年1月向公众发布了Mysql 5.1 GA稳定版,MySQL成为当时全球十分受欢迎的关系型数据库之一。
2010年Sun Microsystems被甲骨文收购,使Mysql的运营形式发生变化。甲骨文公司发布了Mysql的分支版本Open Source Database,但这个举动并没有获得广泛支持。立刻有一个社区围绕着这个项目组成了MariaDB,进行了一些对Mysql的更新改进,提供一些新特性,在开源领域获得成功,并得到了Linux发行版如Redhat、Debian等及互联网公司如Google、Yahoo、Wikipedia等的采用。
虽然MySQL数据库的所有权和掌控权发生变化,但它仍然是世界上最受欢迎的开放源代码数据库之一。如今,MySQL被广泛应用于Web开发、数据仓库、软件测试和其他领域。同时,MySQL社区也非常活跃,并继续开发新特性以满足不断发展的需求。
问就说是chatGPT说的。
总结一下就是:MySQL本身由瑞士MySQL AB推出的,然后被Oracle公司收购了。本身是免费开源的,现在听说有些版本要收费了(忘记听哪儿说的了)。
2.操作数据库
2.1基本操作语句
mysql -u root -p 这是最基本的登入语句!!!然后有密码的话还要输入密码!!!
show databases; 显示目前数据库里边的库。
create database [数据库名];创建数据库。
help 这个指令有点用,类似于cmd里边的help,能看到指令集。
drop database [数据库名]; 传说中的删库跑路!
exit; 退出MySQL,与quit是一样的。
上边的不够详细,建库的时候详细写一些语句
2.2 建库
1.建立一个名为user的数据库
create database user; 一定要写 ‘ ; ’ 不写会报错
2.告诉数据库你要使用它了
use `user`; 注意这里的`` 不是普通的单引号,而是Tab上边那个符号。
3.接下来建表:
目的:建立一个 名为customer的表,里边分别有“id”,“name”,“sex”,“birthday”四个字段,其中id为键值,Extra为AUTO_INCREMENT。AUTO_INCREMENT这个玩意是 MySQL 数据库中用于定义自增列的关键字。它可应用于整数类型的数据,int,bigint都行。
这是在终端写的sql语句,大致意思上面已经讲清楚了。现在来具体分析一下这些语句:
格式总结:
create table if not exits `表名` (
`字段名` 列类型 属性 索引 '注释',
`字段名` 列类型 属性 索引 '注释',
`字段名` 列类型 属性 索引 '注释',
`字段名` 列类型 属性 索引 '注释',
primary key (`字段名`)
)表类型 字符集设置
分析上面代码:
id,字段名为id,列类型是int类型的,不为空同时自动递增,从1递增,注释为“学号”。
name,字段名为name,列类型是varchar,长度是三十个字符,不可为空但是有默认值“匿名”。
后面的差不多是这样的......
同时该表的主键为id,字符集编码为utf-8,utf-8是什么呢?是一种字符编码方式。我们熟悉的Unicode,ASCII都是字符编码方式。顺便说一下这个表的存储引擎是InnoDB存储引擎。
InnoDB存储引擎:
MySQL不止这一个存储引擎,个人理解为是对数据库进行操作处理的一个规范。比如说,InnoDB和MyISAM这两个存储引擎,前者的出现交晚,后者是MySQL早期的存储引擎。相较于MyISAM,InnoDB具有支持事务,数据行锁定等特性,而MylSAM所支持的全文索引InnoDB并不支持。这使得InnoDB在处理并发访问下具有良好表现,而对于远程静态表查询、全文查询等方面表现弱于MyISAM。总之就是这些存储引擎各有优点,在选择时需要综合考虑。
补充:
事务的大致意思就是,当两个SQL语句同时运行,如果两个当中有一个运行失败那么就全部失败。
表锁的大致意思就是,当两个SQL语句去查询同一个表时,会锁住该表,然后第二个SQL指令就要排队。就和食堂买饭差不多。
行锁意思和表锁大致相同。
建表结果:
上面说的是用SQL语句建库,其实能直接用数据库可视化工具建库:
打开Navicat后在连接那儿建立连接,输入密码之后就有如下界面了
注意看,那个里边的一个user是我们之前用SQL语句直接建的。
这里就是建库的两种方法。
2.3 SQL详细
SQL (Structured Query Language) 是关系型数据库管理系统(RDBMS)的标准语言,用于对关系型数据库中的数据进行管理和操作,可以实现对数据的查询、更新、删除和插入等操作。SQL 被广泛应用于企业级应用的开发中,如CRM,ERP等。
SQL 语言的主要操作包括:
数据定义语言(DDL):用于定义和管理数据库对象,例如创建表、修改表结构、删除表等。
数据操纵语言(DML):用于对数据库中的数据进行删增改查操作,例如 SELECT、INSERT INTO、UPDATE、DELETE FROM等。
数据控制语言(DCL):用于对数据库访问权限进行控制,例如 GRANT 授予用户某些权限、REVOKE 撤销用户某些权限等。
事务控制语言(TCL):用于控制数据库事务,例如 COMMIT 提交事务、ROLLBACK 回滚事务等。
除此之外,SQL 还有一些常用的功能,例如汇总函数(SUM、AVG)、字符处理函数(CONCAT、SUBSTRING)、日期/时间处理函数(DATEADD、DATEDIFF)等。
需要注意的是,不同的数据库管理系统可能会存在 SQL 语法和细节上的差异,因此在使用具体的 RDBMS 时需要仔细了解其所使用的 SQL 方言,以免产生不必要的错误。
上面是chatGPT说的,目前个人只打算了解了解DML。
DML数据操作语言
insert
update
delete
1.insert into
insert into `表名` (`字段名1`,`字段名2`,`字段名3`) value ('值1','值2','值3'); 这个是往数据库里加一条记录。这里字段与表是一一对应的。
2.update
update 表名 set 字段名 = value where (定位);这个看起来比较抽象,用起来很方便。
注意:
最后面的定位条件不给的话,会修改所有指定的列。
value是一个具体的值也可以是一个变量。
这个是非常的形象了。
注意:要养成一个好习惯,字段名加` `。
看上面可以知道value值可以是变量,条件定位可以多写几个条件。
3.delete
delete from `表名` where 定位条件;记住定位条件一定要写,不然会把表里边的东西全删了。
truncate `表名`;这个会把一个表全删完。
注意:这儿delete后并没有影响自增的id,但是另一个删除语句会直接将自增序列归零。
insert into `customer`(`name`,`sex`,`birthday`) value('QQ','男','2004-04-11');
这里id直接从3开始的。
truncate `customer`;
insert into `customer`(`name`,`sex`,`birthday`) value('QQ','男','2004-04-11');
看,这里id从1开始了。
算了,我再看看DQL,浅浅地多学一点,收回只学DML的话。
DQL数据查询语言
总之一句话,select是yyds,所有的查询都用select语句,简单的、复杂的反正只要查数据,我们就用它。据一位博主说这是数据库最核心最重要的语句,那么我们就好好学学吧
最基本的语句:
select `字段1`,`字段2`,`字段3` from `表名` where 定位条件;这些语句极其易懂,其实没啥好解释的。
如果要查询所有的字段的话直接在from前面加一个*即可。
看我来进行一些基本操作:
一些比较简单的应用。
select语句进阶版
1.order by
ORDER BY 用于对查询结果进行排序,在查询语句最后面加上 ORDER BY 子句即可。可以指定按照哪一列排序,默认是升序排列。这个玩意可以按照我们所指定列的进行排序。
SELECT column1, column2, ... FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
ASC是升序排列,DESC是降序排列。
2.group by
GROUP BY 用于对某一列进行分组,并对每个分组进行统计。在查询语句最后加上 GROUP BY 子句即可。在使用 GROUP BY 时,SELECT 查询的列必须是经过聚合函数处理的列或者包含在 GROUP BY 子句中的列。同时,WHERE 子句中的条件必须是对 GROUP BY 中查询的列进行过滤,而不能对聚合计算后的值进行筛选。
3.limit
分页:LIMIT 用于限制返回的结果条数,从某个位置开始,可以用于分页显示。在查询语句最后加上 LIMIT 子句即可。
基本语法:
SELECT column1, column2, ...
FROM table_name WHERE condition
LIMIT start_index, page_size;
limit子句表示(开始索引值,查询最大条数)
注意:表中第一行的默认索引值为0而不是1(就像c语言里的数组下标索引值差不多)。
4.jion
联表查询:当需要从多张表中查询信息时,可以使用 JOIN 来连接不同的表,从而实现联表查询。JOIN 的具体实现方式包括 INNER JOIN(内连接)、LEFT JOIN(左连接)、RIGHT JOIN(右连接)和 FULL OUTER JOIN(全外连接)等,常见的是 INNER JOIN 和 LEFT JOIN。这个的语法和前面的差不多,也是最后加一个JOIN子句即可
内连接(INNER JOIN):只返回两个表中在连接条件(如 ON)中都存在的记录。
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
左连接(LEFT JOIN):返回左表的全部记录,以及右表中满足连接条件的记录。如果右表中没有与左表匹配的数据,则显示 NULL 值。
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
不展示了,这个展示的话我还要自己再建一个表,莫得时间了,其实很简单应该,自己会去实际操作一下就行了。
2.4 MySQL函数
MySQL常用函数:
COUNT:计算表中行数或某个列非 NULL 值的数量。
SUM:对某个列进行求和计算。
AVG:对某个列进行平均值计算。
MAX:找出某个列中的最大值。
MIN:找出某个列中的最小值。
SELECT customer_id,
COUNT(*) AS total_orders,
SUM(unit_price * quantity) AS total_spent,
AVG(unit_price) AS average_price,
FROM order_details,
GROUP BY customer_id;
//注:以SUM为例,()里边是将要被查询的列(字段名),AS后面的是查询后的结果放入的位置。其他也都是这样的。就不写具体例子了,需要写的时候照猫画虎总会吧。
后面还有许多内容,比如JDBC(Java数据库连接)之类的,这个留给自己动手实操(一边实操一边截图写博客太麻烦了,时间不够,那就偷个懒只实操不写博客了......),不写了,想了解的可以看看这篇博客:传送门
3.上周的servlet总结
3.1 HTTP协议
这玩意叫超文本传输协议,底层设计就先不去讲了,上周主要学的是请求协议和响应协议。
请求协议
请求行:http协议中的第一行为请求行一般包含请求类型,请求URL(Uniform Resource Locator),协议版本信息。如“GET/index.html HTTP/1.1”,GET是请求类型,index.html是一个网址,HTTP/1.1是协议版本。
请求头:紧随请求行,包含了请求信息,如客户端类型、接受的数据格式、Cookie、Referer等。例如:"Host: www.example.com"。
空白行:这玩意就是真空白一行,真是一行空白!!!!!!!!!!用来分割请求头和请求体。
请求体:这个是可以选择写不写的,一般来说是用来向服务器提供数据的。大致就是假如你要登入一个界面,那么登入的时候需要向服务器发出请求,这个时候请求应该带上用户名和密码。(应该是这样的吧应该吧应该吧)通常用于POST和PUT请求中。
请求协议有两种常用的,GET和POST。
响应协议:
状态行:包括协议版本,状态码,状态描述信息。例如,"HTTP/1.1 200 OK",前面是版本,200是状态码,OK是状态描述信息。
200表示请求响应成功。
404找不到目标资源。(不管目前写代码只遇到过404【愤怒】)
405请求类型不符(前端get请求后端只能处理post请求)。
500服务器内部错误。
响应头:形式应该和请求头差不多都是"K:V"形式,反映的是响应类型。
空白行:它顾名思义,就是一行空白的!!!!!!!!
响应体:HTTP响应中可选的响应内容部分称为响应体,通常用于向客户端发送数据,如HTML页面、JSON数据等。如果响应没有响应体,则在响应头和空白行之后就是响应结束了。意思就是响应的内容,其实可以写个html页面,比如说你登入的时候输入错密码了,就会出现某个界面,这个界面就是响应体负责的。当然也可以不写响应体。
上面这些上周学的是有作业的,写一个登入注册系统所以我就不一边实操一边复盘学了什么,到时候写这个系统的时候能用上。
3.2 HTTPServlet
这玩意很重要很重要很重要,只有写了它你才能建一个响应用户HTTP请求的程序。
HTTPServlet是Servlet接口的一个实现类,同时也是一个抽象类。在servlet.http包中。
响应流程:
1.Web用户发送http请求,Servlet接收。
2.Servlet容器解析http请求。
3.Servlet创建一个HttpRequest对象,封装接收到的http信息。
4.Servlet创建一个HttpResponse对象。
5.Servlet调用HttpServlet的service方法,把HttpResquest对象和HttpResponse对象作为sevice方法的参数传给HttpServlet对象。
6.HttpServlet调用HttpRequest的有关方法,获取http信息。
7.HttpServlet调用HttpResponse的有关方法,生成响应数据。
8.Servlet把响应数据传给Web用户。
其中HttpServlet首先必须读取Http请求的内容,Servlet容器负责创建HttpServlet对象,并把Http请求直接封装到HttpServlet对象中。
最终Servlet应用开发方法:
- 创建一个Servlet应用类继承HttpServlet。
- 重写doGet或者doPost
- 将Servlet配置到web.xml文件中或者使用注解配置
- 编写或者导入相应的前端页面,进行测试
- 注:这儿是学长博客上写的,我抄下来,到时候写作业的时候方便看。
这里的内容有很多,还是那句话写作业的时候具体写!!!!!!
3.3 Session会话机制
Session会话机制是指在 web 应用程序中,为了跟踪用户的身份、请求和状态信息而创建的一种机制。当用户打开一个网站或应用程序时,服务器会分配给该用户一个唯一的标识符,称为 session ID。这个 session ID 会以一种安全的方式(通常是作为一个 cookie)发送到用户的浏览器,并在整个会话期间保留。
在此期间,用户的所有请求将包含该 session ID,以便服务器可以识别用户并提供相关的信息。这些信息可以存储在服务器上,也可以存储在数据库或其他持久性存储设备中。
Session 机制常用于实现用户身份验证、购物车、订单处理等功能。然而,在使用 Session 时需要注意安全问题,尤其是防止会话劫持和会话固定攻击。
注意:这儿有个会话域的概念,个人理解为当用户展开会话时得到的cookie会在整个会话域中存在,在每次http请求与响应时都带上这个cookie,就表示了是同一个用户在操作。
详情请参考学长的博客:wyy yyds