数据库学习笔记

一、数据库概念

数据库:按照数据结构来组织、存储和管理数据的仓库。

数据库相比文件存储,在操作时速度会更快。日常使用最多的就是关系型数据库。

1.关系型数据库:

  • 1.数据以表格的形式出现
  • 2.每行为各种记录名称
  • 3.每列为记录名称所对应的数据域
  • 4.许多的行和列组成一张表单
  • 5.若干的表单组成database

2.术语:

  • 数据库: 数据库是一些关联表的集合。
  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
  • 行: 一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余: 存储两倍数据,冗余降低了性能,但提高了数据的安全性。
  • 主键: 主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
  • 外键: 外键用于关联两个表。
  • 复合键:(组合键)将多个列作为一个索引键,一般用于复合索引。
  • 索引: 使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。

二、MySQL数据库(版本8.0.11)

1.安装和验证

参考菜鸟教程:http://www.runoob.com/mysql/mysql-install.html

2.启动关闭MySQL

mysql是一种服务,在使用时,需要先将服务启动,才可以进行连接和使用。说的通俗一些,MySQL服务是控制数据库信息的操作,而链接到数据库,相当于向MySQL服务发送操作指令,告诉MySQL服务干什么工作。

a.window:
  • 进入管理员模式(一定要进入管理员权限,否则没有办法启动)
  • net start mysql
  • net stop mysql
b.linux
  • systemctl start mysqld
  • systemctl stop mysqld

linux启动错误

Failed to start MySQL Server.
(code=exited, status=1/FAILURE)
  • 使用 tail -n 100 /var/log/mysqld.log查看日志
  • 使用systemctl status mysqld.service查看sql状态
  • 通过日志查询,发现问题在于The innodb_system data file ‘ibdata1’ must be writable
  • 解决方案(安装mysql8.0版本):
    • 打开mysql安装目录/var/lib/mysql,删除以下2个文件:ib_logfile0ib_logfile1
    • chmod -R 777 /var/lib/mysql,修改权限
    • 重新启动

ps:如果不是通过yum安装的话:find / -name ibdata1 找到对应目录更改权限~

还有一个linux安装mysql的大坑
https://blog.csdn.net/konghouy/article/details/86627707

​ 在安装时,可能会出现初始化没有输出默认密码的情况,导致不知道初始密码无法登陆的问题。

尝试登录时,就出现(反正输不输密码都有问题,都登录不上):

# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  • 在网上搜索,试了好多方法都不管事,很多处理方案都是按照忘记密码的思路去解决,都是进入安全模式,修改配着文件什么的。

  • 最后查了mysql文档,才把问题解决。在安装好mysql,第一次启动SQL服务的时候,用时会比之后关闭在启动mysql耗时要长。这是因为在首次启动SQL服务时,会发生:

    • MySQL的data文件夹中生成SSL证书和key文件;
    • 密码验证组件被安装并且生效;
    • 创建一个超级管用户’root’@‘localhost’。
  • 按照常理来说,首次初始密码,应该及时将生成的密码告知用户。但是mysql就是没有这样做,导致用户不论怎么测试密码,都无法登录。好在超级用户设置的密码被保存在错误日志文件中,可以通过以下命令查看:

  •    sudo grep 'temporary password' /var/log/mysqld.log
    
  • 然后就按照查询的密码,登录数据库,修改密码。

3.登录到MySQL

a.命令行
  • mysql -u root -p
  • Enter password
b.Navicat链接

这里有一个坑: 密码在数据库中应该加密保存,防止数据库信息泄露导致的密码暴露。同样在数据库的链接用户管理数据中,authentication_string(密码)也是被加密存储的。

在MySQL8.0中,使用了caching_sha2_password加密方式,而Navicat使用的是mysql_native_password加密方式,这就导致在密码验证环节出现问题无法成功链接。

  • 解决方案:
    • 使用命令行登录mysql,先修改密码方式,再修改一下密码。
    • 一定要在改变加密方式后,再修改一下密码,否则原来的密码,因为加密方式的改变,对应不到原来设置的密码,导致无法登录。
ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘authentication_string’; 
#更新一下root用户的密码加密方式
set password = "pwd";#修改密码
FLUSH PRIVILEGES; #刷新权限 

4.登录管理,设置权限

在安装mysql中,在没有添加数据库的时候,就会发现有几个默认的数据库存在,这些数据库存储着数据库的管理权限,和系统设置。

其中mysql.user中就存储着,所有用户的登录信息。这些信息中包括了权限设置,密码,密码有效期等一系列设置。我们可以查看对应的用户信息,也可以修改对应信息。操作权限有相关命令,所以这个表我们可以查看,但一般不要修改。

如果你手动地修改授权表(使用INSERT、UPDATE或DELETE等等),你应该执行mysqladmin reload告诉服务器再装载授权表,否则你的更改将不会生效,除非你重启服务器。

  • 添加用户:CREATE USER ‘a’@’%’ IDENTIFIED BY ‘123’;
  • 删除用户:DROP USER ‘a’@’%’;
  • 重命名用户:rename user ‘jack’@’%’ to ‘jim’@’%’;
  • 显示权限:SHOW GRANTS FOR ‘a’@’%’;
  • 添加权限:GRANT SELECT ON mysql.user TO ‘a’@‘localhost’;
  • 去除权限:REVOKE SELECT ON . FROM ‘a’@’%’;
  • 修改密码:SET PASSWORD FOR ‘a’@’%’ = ‘456’;
  • 刷新权限: flush privileges;
  • 重载授权表:mysqladmin reload -u root -p

注意:当给不同库和表添加权限时,可以添加多条规则,但是不会合并。所以在删除权限时,一定要留意。但是给同一个库或表添加权限,权限是可以合并的。

注意:当设置权限之后,再通过修改user表来修改名称,会导致原来的权限被隐藏。即名字改了,权限还在,但是grants里面不再显示(即使刷新权限,也不显示)。这样可能会导致权限泄露,所以,为保证权限同步,一定要使用rename命令。

- 实战1
mysql> grant all privileges on *.* to jack@'localhost' identified by "jack" with grant option;
Query OK, 0 rows affected (0.01 sec)

​ GRANT命令说明:

  • ALL PRIVILEGES 是表示所有权限,你也可以使用select、update等权限。

  • ON 用来指定权限针对哪些库和表。

  • . 中前面的号用来指定数据库名,后面的号用来指定表名。

  • TO 表示将权限赋予某个用户。

  • jack@‘localhost’ 表示jack用户,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。

  • 注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。

  • IDENTIFIED BY 指定用户的登录密码。

  • WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。

5.数据库的基本数据类型

a.数值
  • TINYINT–整数—1字节
  • TSMALLINT–整数—2字节
  • MEDIUMINT – 整数— 3字节
  • INT–整数—4字节
  • BIGINT–整数—8字节
  • FLOAT–浮点数–4字节
  • DOUBLE–浮点数–8字节
  • DECIMAL–浮点数(有效数字,小数点位数)–MAX(参数+2)
b.日期和时间
  • DATE–3–YYYY-MM-DD
  • TIME—-3 – HH:MM:SS
  • YEAR– 1 –YYYY
  • DATATIME – 8 –YYYY-MM-DD HH:MM:SS
  • TIMESTAMP– 4 毫秒数
c.字符串
类型大小用途
CHAR0-255字节定长字符串
VARCHAR0-65535 字节变长字符串
TINYBLOB0-255字节不超过 255 个字符的二进制字符串
TINYTEXT0-255字节短文本字符串
BLOB0-65 535字节二进制形式的长文本数据
TEXT0-65 535字节长文本数据
MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215字节中等长度文本数据
LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据
LONGTEXT0-4 294 967 295字节极大文本数据
d.枚举类型
  • ENUM:最多65536个元素
  • SET:最多64个元素

结合数据库的严格模式,起到check约束作用

注意:

  • char和varchar区别:char类型是定长字符串,varchar类型是变长字符。char的长度如果没有填满,会用空白补齐。varchar在字符串的后部有一部分空间存储字符串长度。所以在字符串中如果字符串长度稳定,可以使用char,长度变化较大使用varchar。MySQL官方建议使用varchar。
  • text类型的特征:不能有默认值,不知道最大长度时使用。一般都使用varchar类型来代替text。
  • nchar、nvarchar类型,存储中文字符集。正常情况下,我们使用varchar也可以存储中文字符,但是如果遇到操作系统是英文操作系统并且对中文字体的支持不全面时, 会出现乱码(显示为??).
  • mysql中不会显示nchar、nvarchar,因为mysql是通过字符集来进行设置的。可以直接选择支持中文的字符集进行选择。
  • blob存储二进制,可以将图片存储进数据库
  • 在数据库中最小的存储单位是页,对于TEXT,BLOB这种类型来说,数据也只存储了一部分内容,溢出的内容会扩充到其他几页,这些也专门存储溢出的内容。但是我们在实际操作中,不需要管这个,数据库会帮我们自动处理好。

6.数据库的编码方式

数据库的在开发之初就要考虑到使用场景的需求,根据需求设计合理的字符编码集,便于数据库后期的维护和扩展。要想支持更改国家的文字,就要选择容量更大的编码。

常用编码:

  • 中文编码 :GBK、GB2312,big5(繁体)
  • 万国码:utf8(3字节),utf8mb4(4字节)

编码的排序后缀含义:
  _BIN 二进制排序
  _CI(CS) 是否区分大小写,CI不区分,CS区分
  _AI(AS) 是否区分重音,AI不区分,AS区分
  _KI(KS) 是否区分假名类型,KI不区分,KS区分
  _WI(WS) 是否区分宽度 WI不区分,WS

注意:

  • Unicode字符编码,是在通用字符集基础上发展的一种可以容纳世界上所有文字的字符编码方案。utf-8是遵循这个编码方案的字符集。

7.数据库框架的基本操作

  • 查看所有数据库:SHOW DATABASES;

  • 切换到数据库:USE XXX;

  • 查看数据库中所有的表:SHOW TABLES;

  • 查看数据表属性:SHOW COLUMNS FROM XXX;

  • 查看数据表的详细索引信息:SHOW INDEX FROM XXX;

  • 查看当前表的统计信息:SHOW TABLE STATUS FROM XXX LINK XXX;

  • 创建数据库:CREATE DATABASE XXX;

  • 删除数据库:DROP DATABASE XXX;

    或在未进入系统模式下mysqladmin -u root -p drop xxx

  • 重命名数据库:官方没有给标准方法,可以使用创建新库,然后导入实现

  • 创建数据表:

    CREATE TABLE table_name (column_name column_type);
    
    CREATE TABLE IF NOT EXISTS `runoob_tbl`(
       `runoob_id` INT UNSIGNED AUTO_INCREMENT,
       `runoob_title` VARCHAR(100) NOT NULL,
       `runoob_author` VARCHAR(40) NOT NULL,
       `num` float default 6.8,
       `submission_date` DATE,
       PRIMARY KEY ( `runoob_id` ),
       INDEX [indexName] (username(length))
    )ENGINE=InnoDB DEFAULT CHARSET=utf8 collate utf8_bin;
    

    ​ 注意:

    • 创建数据库是必须要设置PRIMARY KEY,且主键不唯一
    • 括号后面的内容,可以省略,在数据库文档中有默认设置
    • 设置结构,必须包括名字和数据类型(not null,auto_increment,default为可选项)
  • 删除数据表:drop table XXX;

  • 重命名数据表:alter命令

8.数据库语句的基本操作

a.增添
INSERT INTO runoob_tbl 
(runoob_title, runoob_author, submission_date)
VALUES
("学习 PHP", "菜鸟教程", NOW());

注意:

  • 在实际的添加中,如果表中设置有auto_increment创建时,可以不提供参数或参数为0、null。
  • 如果提供合法参数(与之前的数据不冲突)在有auto_increment属性的字段中,会根据新给定的id建立。之后的自动增加,会根据当前表中最大数字递增。
  • 一个对象设置了自动递增,那么必须给这个数据分配主键。
b.查找
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
  • 使用 WHERE 语句来包含任何条件。
  • 使用 LIMIT 属性来设定返回的记录数。
  • 通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。offset 必须和 limit结合使用,否则不会生效。
  • 输出的属性顺序和命令的顺序相同
c.修改
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
d.删除
DELETE FROM table_name [WHERE Clause]

删除行信息,删除某一行的数据。不使用where语句进行筛选,会删除全部表中数据。

e.WHERE 筛选
  • WHERE 字符比较没有区分大小写,添加BINARY启动大小写。
  • 使用表中字段进行比较,来筛选需要的信息。
f.LIKE 模糊查找
SELECT * from runoob_tbl  WHERE runoob_author LIKE '%COM';
  • where和like结合使用,实现文本的模糊搜索。
  • %来表示任何字符
g.UNION 查找合并
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
  • UNION可以合并多个查询的信息,将多张表的相关信息筛选合并。
  • UNION的参数可选,一个是UNION DISTINCT(默认)表示过滤掉重复的信息。另一个是 UNION ALL返回所有结果集,包含重复数据。
  • 可以对多个属性进行数据合并,筛选时要求属性的个数和类型相同。
  • 使用UNION时筛选过滤出相同的数据,当有多个属性时,必须完全相同,才会剔除
h.ORDER BY 排序
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE conditions LINK ...];
ORDER BY field1, [field2...] [ASC [DESC]]
  • 可以设定多个字段来排序。每个字段设置排序规则,然后用“,”分开
  • 可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
  • 可以添加 WHERE…LIKE 子句来设置条件。
i.GROUP BY 分组
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
  • 使用分组,将列表中某一属性相同的内容使用函数统计。
  • 可以使用function as XXX的方式替换函数命名
  • function函数参数,必须和group by 相同。
  • 使用 WITH ROLLUP可以实现在分组统计数据基础上再进行相同的统计。
  • select coalesce(a,b,c);参数说明:如果a=null,则选择b;如果b=null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。配合WITH ROLLUP使用。
j.JOIN 从多个数据表中读取数据
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
  • FROM 后面两个参数可以简化输入
  • RIGHT、LEFT、INNER JOIN根据需要产生不同组合

9.常用特殊用法

a.NULL的处理

null表示这个存储单元里没有数据。但是不可以使用=来判断。必须要使用IS NULL、IS NOT NULL

b.正则的使用
SELECT name FROM person_tbl WHERE name REGEXP '^st';

10.MySQL 事务

​ MySQL 事务主要用于处理操作量大,复杂度高的数据。在完成一个操作之后,还有一系列固定的操作,这时就可以使用事务!

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 通过事务,把原本需要多次操作数据库的命令,合并为一个事务。防止由于后续操作错误,导致数据不一致。

11.ALTER命令

可以修改表的结构:

ALTER TABLE testalter_tbl  DROP i; #删除字段
ALTER TABLE testalter_tbl ADD i INT; #增加字段
ALTER TABLE testalter_tbl MODIFY c CHAR(10);#修改字段类型及名称
ALTER TABLE testalter_tbl CHANGE old new INT;修改字段类型及名称
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;修改字段默认值
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
ALTER TABLE testalter_tbl RENAME TO alter_tbl;修改表名
  • 如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
  • 当你修改字段时,按照添加规则可以指定是否包含值或者是否设置默认值。

12.MySQL 索引

​ 索引可以大大提高MySQL的检索速度。虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

SHOW INDEX FROM table_name; 显示主键
CREATE INDEX indexName ON mytable(username(length)); 创建索引
ALTER table tableName ADD INDEX indexName(columnName);
DROP INDEX [indexName] ON mytable; 删除索引

13.数据库应用

a.自增序列
  • MySQL 中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列。

  • 可以无需指定值可实现自动增长或使用 SQL中的LAST_INSERT_ID( ) 函数来获取最后的插入表中的自增列的值。

  • 如果删除了数据表中的多条记录,并希望对剩下数据的AUTO_INCREMENT列进行重新排列,那么可以通过删除自增的列,然后重新添加来实现。 不过该操作要非常小心,如果在删除的同时又有新记录添加,有可能会出现数据混乱。操作如下所示:

mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
    -> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
    -> ADD PRIMARY KEY (id);
  • 一般情况下序列的开始值为1,但如果你需要指定一个开始值100,那我们可以通过以下语句来实现:
ALTER TABLE t AUTO_INCREMENT = 100;
b.处理重复数据
  • 可以在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键)

    或者 UNIQUE(唯一) 索引来保证数据的唯一性。

  • INSERT IGNORE INTO如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。

  • 结合使用COUNT(*)在GROUP BY子句中寻找重复的元素。

  • 使用DISTINCT来过滤重复数据。

  • 添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。

c. SQL 注入

我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。

  • 对单引号和 双"-"进行转换等。
  • 可以通过正则表达式,或限制长度。
  • 不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
  • 每个应用使用单独的权限有限的数据库连接。
  • 把机密信息直接存放,加密或者hash掉密码和敏感的信息。
d.MySQL 导入、导出数据
mysqldump -u username -p dbname table1 table2 ...-> BackupName.sql
#备份某几张表
mysqldump -u username -p --databases dbname2 dbname2 > Backup.sql
#备份某几个数据库
mysqldump -u username -p -all-databases > BackupName.sql
#备份全部数据库
  • dbname参数表示数据库的名称;
  • table1和table2参数表示需要备份的表的名称,为空则整个数据库备份;
  • BackupName.sql参数表设计备份文件的名称,文件名前面可以加上一个绝对路径。通常将数据库被分成一个后缀名为sql的文件;
mysql -u root -p dbname< C:\backup.sql
  • 导入时,会覆盖掉原来的信息。相当于数据库版本回退。备份之后的新数据会丢失。

  • 可以使用定时调用脚本来实现数据库的定时备份和关键备份。

e.数据库常用函数
  • COUNT(expression):返回查询的记录总数,expression 参数是一个字段或者 * 号

  • SUM(expression):返回指定字段的总和

  • AVG(expression):返回一个表达式的平均值

  • MAX/MIN(expression):返回字段 expression 中的最大(小)值

  • CURDATE()/CURRENT_DATE():返回当前日期

  • CURTIME()/CURRENT_TIME():返回当前时间

  • CURRENT_TIMESTAMP():返回当前日期和时间

  • DATE():从日期或日期时间表达式中提取日期值

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值