MySQL学习笔记
Mysql是关系型数据库管理系统,管理的数据库是一堆关联表的集合。这里的表可以看作是一个二维表格,里面的每一行表示一条记录,是一组相关的数据。每一列存储的是一个属性对应的数据。 相关的概念如下:
冗余: 同样的数据存储多份,冗余会导致存储空间的浪费,适当的冗余可以提高查询速度。 冗余存在于多种level上: 表的冗余/属性的冗余/元组的冗余以及属性值的冗余 参考: https://blog.csdn.net/weixin_29985807/article/details/113223373
主键:一个表中主键是唯一的,可以用主键来查询数据。
外键: 用于表和表之间的连接,关联两个表。
复合键:将多个列作为一个组合键,一般用于复合索引。
索引:使用索引可以快速访问数据库表中的特定信息,索引是对数据库表中的一列或者多列进行排序的一种结构。
参照完整性:要求关系中不允许引用不存在的实体。参照完整性和实体完整性是关系模型中必须满足的完整性约束条件,目的是保证数据一致性。
记录一下本人不太熟悉的mysql 知识点:
在这里执行SQL语句:https://www.db-fiddle.com/
MySQL创建数据库
使用下面的命令创建一个名为 DBTest的数据库
mysqladmin -u root -p create DBTest
MySQL删除数据库
使用下面的命令删除名为DBTest的数据库
mysqladmin -u root -p drop DBTest
创建数据表
使用下面的命令创建数据表
CREATE TABLE table_name(column_name column_type)
创建数据表student
CREATE TABLE IF NOT EXISTS student( sid INT, sname VARCHAR(20), sbirth DATE, sgender VARCHAR(10) );
创建数据表class
create table IF NOT EXISTS class( sid INT, sname varchar(20), sclass varchar(10) );
插入数据
使用下面的命令插入数据
INSERT INTO table_name( field1, field2, field3,...fieldN) VALUES ( value1, value2, value3,...valueN);
向student表中插入数据
INSERT INTO student values
(1 , '赵雷' , '1990-01-01' , '男'),
(2 , '钱电' , '1990-12-21' , '男'),
(3 , '孙风' , '1990-12-20' , '男'),
(4 , '李云' , '1990-12-06' , '男'),
(5 , '周梅' , '1991-12-01' , '女'),
(6 , '吴兰' , '1992-01-01' , '女'),
(7 , '郑竹' , '1989-01-01' , '女'),
(9 , '张三' , '2017-12-20' , '女'),
(0 , '李四' , '2017-12-25' , '女');
向class表中插入数据
INSERT INTO class values (1 , '赵雷' , '一班'), (2 , '钱电' , '二班'), (3 , '孙风' , '三班'), (4 , '孙六' , '四班');
查询数据
SELECT column_name,column_name FROM table_name [WHERE Clause] [OFFSET M ][LIMIT N]
- 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
- 你可以使用 LIMIT 属性来设定返回的记录数。
连接
INNER JOIN(内连接/等值连接):获取两个表中字段匹配的记录 得到的是两个表的交集
1 SELECT * 2 FROM TableA A 3 INNER JOIN TableB B 4 on A.key = B.key
LEFT JOIN(左连接): 获取左表的所有记录,右表获取的是和左表的交集
当使用 WHERE B.key is NULL过滤时,得到的是 A-(A和B的交集)
查询语句:
SELECT * FROM student s LEFT JOIN class c ON s.sid = c.sid AND s.sname = c.sname WHERE c.sid is NULL
结果:
RIGHT JOIN(右连接):获取右表的所有记录 左表获取的是和右表的交集
SELECT * FROM student s RIGHT JOIN class c ON s.sid = c.sid AND s.sname = c.sname WHERE s.sid is NULL
查询语句
SELECT * FROM student s RIGHT JOIN class c ON s.sid = c.sid AND s.sname = c.sname WHERE s.sid is NULL
当使用 WHERE A.key is NULL过滤时,得到的是 B-(A和B的交集)
结果
FULL OUTER JOIN:外连接,得到的是A和B的并集
SELECT FROM Table A FULL OUTER JOIN Table B ON A.key = B.key
MySQL中不支持 FULL OUTER JOIN
事务
MySQL事务主要用于处理操作量大,复杂度高的数据。多个操作对应一个事务。
- 在MySQL中,只有使用了Innodb数据库引擎的数据库或表才支持事务。
- 事务处理用来维护数据库的完整性,保证成批的SQL语句 要么全都执行,要么全都不执行。
- 事务用来管理 insert,update,delete语句。
事务必须满足四个条件:
A(Atomicity)原子性:一组事务,要么成功,要么撤回,即事务在执行过程中出错会回滚到事务开始前的状态。
C(Consistency)一致性:一个事务不论是开始前还是结束后,数据库的完整性没有被破坏。
I(Isolation)隔离性:数据库允许多个事务并发的同时对其数据进行读写修改等操作,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致性。
事务隔离分为:读未提交/读提交/可重复读/串行化
D(Durability)持久性:事务在处理结束后对数据做出的修改是永久的,无法丢失。
MySQL ALTER
MySQL ALTER命令用来修改表名,修改表🀄️的字段以及索引等。
MySQL 索引
建立索引能够大大提高数据的检索速度。
索引分为 单列索引 和 复合索引。
索引其实也是一张表,里面记录了主键和 索引列,同时指向实体表的记录。建立索引会占用磁盘空间,虽然建立索引可以提高查询速度,但是会降低更新表的速度,因为更新表时,不仅需要保存数据,还要保存索引文件。
MySQL 和SQL注入
如果通过网页获取用户输入的数据并将其插入到一个MySQL数据库,就有可能发生SQL注入安全问题。
SQL注入就是 把SQL语句插入到 Web表单或输入页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
为了防止SQL注入,需要注意以下几点:
- 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
- 2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
- 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
- 4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
- 5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
- 6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
参考: https://www.w3cschool.cn/mysql/mysql-sql-injection.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)