WEB安全MySQL基础

0x001 MySQL 简介


什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。

每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。

我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。

所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:

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

0x002 MySQL 安装

所有平台的 MySQL 下载地址为: MySQL 下载 。 挑选你需要的 MySQL Community Server 版本及对应的平台。

注意:安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足导致无法安装。

Linux/UNIX 上安装 MySQL
Linux平台上推荐使用RPM包来安装Mysql,MySQL AB提供了以下RPM包的下载地址:

  • MySQL - MySQL服务器。你需要该选项,除非你只想连接运行在另一台机器上的MySQL服务器。
  • MySQL-client - MySQL 客户端程序,用于连接并操作Mysql服务器。
  • MySQL-devel - 库和包含文件,如果你想要编译其它MySQL客户端,例如Perl模块,则需要安装该RPM包。
  • MySQL-shared - 该软件包包含某些语言和应用程序需要动态装载的共享库(libmysqlclient.so*),使用MySQL。
  • MySQL-bench - MySQL数据库服务器的基准和性能测试工具。

安装前,我们可以检测系统是否自带安装 MySQL:

rpm -qa | grep mysql

如果你系统有安装,那可以选择进行卸载:

rpm -e mysql  // 普通删除模式
rpm -e --nodeps mysql  // 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除

安装 MySQL:

接下来我们在 Centos7 系统下使用 yum 命令安装 MySQL,需要注意的是 CentOS 7 版本中 MySQL数据库已从默认的程序列表中移除,所以在安装前我们需要先去官网下载 Yum 资源包,下载地址为:https://dev.mysql.com/downloads/repo/yum/

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum update
yum install mysql-server

权限设置:

chown -R mysql:mysql /var/lib/mysql/

初始化 MySQL

mysqld --initialize

启动 MySQL

systemctl start mysqld

查看 MySQL 运行状态:

systemctl status mysqld

注意:如果我们是第一次启动 mysql 服务,mysql 服务器首先会进行初始化的配置。

此外,你也可以使用 MariaDB 代替,MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。开发这个分支的原因之一是:甲骨文公司收购了 MySQL 后,有将 MySQL 闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

yum install mariadb-server mariadb

mariadb数据库的相关命令是:

systemctl start mariadb  #启动MariaDB
systemctl stop mariadb  #停止MariaDB
systemctl restart mariadb  #重启MariaDB
systemctl enable mariadb  #设置开机启动

验证 MySQL 安装

在成功安装 MySQL 后,一些基础表会表初始化,在服务器启动后,你可以通过简单的测试来验证 MySQL 是否工作正常。

使用 mysqladmin 工具来获取服务器状态:

使用 mysqladmin 命令来检查服务器的版本, 在 linux 上该二进制文件位于 /usr/bin 目录,在 Windows 上该二进制文件位于 C:\mysql\bin

[root@host]# mysqladmin --version

linux上该命令将输出以下结果,该结果基于你的系统信息:

mysqladmin  Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386

如果以上命令执行后未输出任何信息,说明你的Mysql未安装成功。

使用 MySQL Client(Mysql客户端) 执行简单的SQL命令

你可以在 MySQL Client(Mysql客户端) 使用 mysql 命令连接到 MySQL 服务器上,默认情况下 MySQL 服务器的登录密码为空,所以本实例不需要输入密码。

命令如下:

[root@host]# mysql

以上命令执行后会输出 mysql>提示符,这说明你已经成功连接到Mysql服务器上,你可以在 mysql> 提示符执行SQL命令:

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.13 sec)

Mysql安装后需要做的

Mysql安装成功后,默认的root用户密码为空,你可以使用以下命令来创建root用户的密码:

[root@host]# mysqladmin -u root password "new_password";

现在你可以通过以下命令来连接到Mysql服务器:

[root@host]# mysql -u root -p
Enter password:*******

注意:在输入密码时,密码是不会显示了,你正确输入即可。

Windows 上安装 MySQL

Windows 上安装 MySQL 相对来说会较为简单,最新版本可以在 MySQL 下载 中下载中查看(更详细安装:Windows 上安装 MySQL)。

点击 Download 按钮进入下载页面,点击下图中的 No thanks, just start my download. 就可立即下载:

下载完后,我们将 zip 包解压到相应的目录,这里我将解压后的文件夹放在 C:\web\mysql-8.0.11 下。

接下来我们需要配置下 MySQL 的配置文件

打开刚刚解压的文件夹 C:\web\mysql-8.0.11 ,在该文件夹下创建 my.ini 配置文件,编辑 my.ini 配置以下基本信息:

[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
 
[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=C:\\web\\mysql-8.0.11
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
# datadir=C:\\web\\sqldata
# 允许最大连接数
max_connections=20
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

启动 MySQL 数据库:

以管理员身份打开 cmd 命令行工具,切换目录:

cd C:\web\mysql-8.0.11\bin

初始化数据库:

mysqld --initialize --console

执行完成后,会输出 root 用户的初始默认密码,如:

...
2018-04-20T02:35:05.464644Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: APWCY5ws&hjQ
...

APWCY5ws&hjQ 就是初始密码,后续登录需要用到,你也可以在登陆后修改密码。

输入以下安装命令:

mysqld install

启动输入以下命令即可:

net start mysql

注意: 在 5.7 需要初始化 data 目录:

cd C:\web\mysql-8.0.11\bin 
mysqld --initialize-insecure

初始化后再运行 net start mysql 即可启动 mysql

登录 MySQL

MySQL 服务已经运行时, 我们可以通过 MySQL 自带的客户端工具登录到 MySQL 数据库中, 首先打开命令提示符, 输入以下格式的命名:

mysql -h 主机名 -u 用户名 -p

参数说明:

  • -h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;
  • -u : 登录的用户名;
  • -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

如果我们要登录本机的 MySQL 数据库,只需要输入以下命令即可:

mysql -u root -p

按回车确认, 如果安装正确且 MySQL 正在运行, 会得到以下响应:

Enter password:

若密码存在, 输入密码登录, 不存在则直接按回车登录。登录成功后你将会看到 Welcome to the MySQL monitor... 的提示语。

然后命令提示符会一直以 mysql> 加一个闪烁的光标等待命令的输入, 输入 exitquit 退出登录。


0x003 MySQL 的基本认识

MYSQL 数据库的一些解释

注意:
数据库就相当于文件夹
表就相当于文件

mysql 注释符有三种

  1. ...

  2. "-- ..."
  3. /.../

0x004 MySQL 的基本操作

1. 库的增删改查(sql 语句)

  • 增:create database db1;
  • 删:drop database db1;
  • 改:alter database db1 charset utf8;
  • 查:show databases;#查看所有的数据库

查看指定的数据库

show create database db1;

设置默认的 utf8,在配置文件中:写上 character_set_server = utf8

查看你当前在哪个库

use db2
select database()

重命名数据库

RENAME database olddbname TO newdbname
show status; -- 显示一些系统特定资源的信息,例如,正在运行的线程数量。
desc tabl_name; 显示表结构,字段类型,主键,是否为空等属性,但不显示外键。
show databases 查看这个 mysql 里面有多少个库
use mysql 
use 选择数据库
show tables 查看当前库里面所有的表

查看当前数据库 里面的表 user 用户为 root 的密码

mysql> select password from user where user='root';
Mysql 5.7 select authentication_string,user from mysql.user;

修改 MySQL 数据库字符集为 UTF-8

alter database 数据库名 character set utf8;

2. table 表的操作

查看表结构

desc table
DESCRIBE 表名

查看表的所有内容

select * from table_name

建表

CREATE TABLE 表名 (
    属性名 数据类型 [完整约束条件],
    属性名 数据类型 [完整约束条件],
    ...
    ...
    属性名 数据类型 [完整约束条件]
    );

字段名就是属性名

完整的建立表的语句

create table users(id int(7) AUTO_INCREMENT,
                username varchar(100) not null,
                password varchar(100) not null,
                PRIMARY KEY(id)
                )ENGINE=InnoDB DEFAULT CHARSET=utf8;
                
mysql> create table users(id int(7) UNSIGNED auto_increment,username varchar(30) not null,password varchar(32) not null,email varchar(40),primary key (id))engine=myisam default charset=utf8;
Query OK, 0 rows affected (0.00 sec)

if not exists 表示当相同的表名存在时,则不执行此创建语句,避免语句执行错误

create database if not exists [table];

ENGINE 设置表的引擎和默认的字符类型

ENGINE=InnoDB DEFAULT CHARSET=utf8;

常见的数据库引擎

InnoDB myisam

数据类型

约束条件

  • PRIMARY KEY 标识该属性为该表的主键,可以唯一的标识对应的元组
  • FOREIGN KEY 标识该属性为该表的外键,是与之联系某表的主键
  • NOT NULL 标识该属性不能为空
  • UNIQUE 标识该属性的值是唯一的
  • AUTO_INCREMENT 标识该属性的值是自动增加,这是 MySQL 的 SQL 语句特色
  • DEFAULT 为该属性设置默认值

修改表的操作

修改表

ALTER TABLE 旧表名 RENAME 新表名;

修改字段的数据类型

ALTER TABLE 表名 MODIFY 属性名 数据类型;

修改字段名:

ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;

增加字段名

ALTER TABLE 表名 ADD 属性名 1 数据类型 [完整性约束条件] [FIRST | AFTER 属性名 2];

删除字段

ALTER TABLE 表名 DROP 属性名;

更改表的存储引擎

ALTER TABLE 表名 ENGINE = 存储引擎名;

0x005 数据的增删改查

为表中所有字段添加数据

语法:INSERT INTO 表名(字段名 1,字段名 2,…) VALUES(值 1,值 2,…);

mysql> insert into users(id,username,password) values(1,'test','123456');
或者
mysql> insert into users values(1,'test','123456')

语法:INSERT INTO 表名 VALUES(值 11,值 2,…);

mysql> insert into users values(null,'test','123456');

语法:INSERT INTO 表名(字段 1,字段 2,…) VALUES(值 1,值 2,…);
语法:INSERT INTO 表名 SET 字段名 1=值 1[,字段名 2=值 2,…]

mysql> INSERT INTO student SET id=4,name='zhaoliu',grade=72;

同时添加多条数据
语法:INSERT INTO 表名[(字段名 1,字段名 2,…)] VALUES (值 1,值 2,…),
(值 1,值 2,…);

mysql> insert into users (id,username,password)values(null,'moon','123456'),(null,'alex','123456');

语法:INSERT INTO 表名[(字段名 1,字段名 2,…)] VALUES(值 1,值 2,…),
(值 1,值 2,…),(值 1,值 2,…);

mysql> insert into users values(null,'moon1','123456'),(null,'alex1','123456');

语法:DELETE FROM 表名 [WHERE 条件表达式]

mysql> delete from users where id=1;

删除全部数据

若 DELETE 语句中没有使用 WHERE 语句,则会将表中所有记录都删除。

mysql> DELETE FROM 表名

删除全部数据的另一种方法——TRUNCATE

更新

语法:UPDATE 表名 SET 字段名 1=值 1,[ 字段名 2=值 2,…][ WHERE 条件表达式 ]

mysql> update users set password='aaaa' where id=1;
mysql> update users set password='123456',username='moon' where id=1;
mysql> update users set password=456789;

查询 users 表的所有字段(星号代表所有的字段)

mysql> select * from users;

查询指定的字段

mysql> select username,password from users;

按条件调节查询
语法:SELECT 字段名 1,字段名 2,…FROM 表名 WHERE 条件表达式

mysql> select username,password from users where id=1;

in 查询

mysql> SELECT * FROM student2 WHERE id IN (1,2,3);

BETWEEN AND 关键字的查询

mysql> select * from users where id not between 1 and 10;

DISTINCT 关键字的查询

mysql> select distinct username from users;

like 查询 一般都会给跟着%

mysql> select * from users where username like "%m%";

下划线 _ 匹配一个字符

mysql> select* from users where username like "moo_"

and 查询

满足多个条件

mysql> select * from users where id=1 and username='moon';

or 查询

满足任意一个条件

mysql> select * from users where id=1 or username='moon';

ORAND 一起使用的情况

ORAND 一起使用的时候,AND 的优先级高于 OR,因此二者一起使用时,
会先运算 AND 两边的表达式,再运算 OR 两边的表达式。

mysql> select * from users where id>5 and password='123456c' or username='moon1';

聚合查询

count 返回行数

mysql> select count(*) from users;
mysql> select count(id) from users;
  • COUNT() 返回某列的行数
  • SUM() 返回某列值的和
  • AVG() 返回某列的平均值
  • MAX() 返回某列的最大值
  • MIN() 返回某列的最小值

分组查询

如果报错请在 my.ini 添加

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

GROUP BY

mysql> SELECT * FROM users GROUP BY password;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 3 | moon1 | 123456 |
| 1 | moon | 456789 |
+----+----------+----------+
2 rows in set (0.01 sec)
mysql> SELECT * FROM users GROUP BY username;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 2 | alex1 | 456789 |
| 1 | moon | 456789 |
| 3 | moon1 | 123456 |
+----+----------+----------+
3 rows in set (0.01 sec)

使用 LIMIT 限制查询结果的数量

mysql> select * from users limit 2,10;
mysql> select * from users as u where u.id=1;

为表和字段取别名

mysql> select username as myname from users;

mysql 的子查询

where 型子查询(把内层查询结果当作外层查询的比较条件)

mysql> select * from users where id in (select id from users where id>10);

from 型子查询 (把内层的查询结果供外层再次查询)

mysql> select * from (select username,age from users) as agev_a where age>20;
mysql> select * from (select * from users where id>=10) as age_10;
(select * from users where id>=10)查询出来的是一个集合,别名为age_10
mysql> select * from age_10;

exists型子查询(把外层查询结果拿到内层,看内层的查询是否成立)

1
0

mysql> select * from users where EXISTS (select * from users where id>1)

联合查询(两个表的查询)

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

ALLUNION 一起使用时(即 UNION ALL),不消除重复行

UNION ALL 查询全部 而且不会消除重复的行

union

SQL UNION ALL 语法

union 的用法及注意事项
两次查询的列数必须一致

mysql> select * from users union select *,1 from news;
CREATE TABLE `news` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `title` varchar(255) not NULL,
     `content` varchar(255) not null,
     PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; 
insert into news (title,content)values('a1','a1');

0x006 更多教程

MySQL详细教程

posted @ 2022-11-17 21:11  Cx330Lm  阅读(17)  评论(0编辑  收藏  举报