基础知识
数据库系统的组成
数据库
存储数据的容器
数据库管理系统
软件
MySQL
Oracle
SQL Sever
只能在windows上运行
DB2
数据库应用程序
SQL语言
介绍
用来管理数据库中的数据
可以嵌套到其他语言中
SQL的DML和DDL
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
查询和更新指令构成了 SQL 的 DML 部分:
SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据
SQL 中最重要的 DDL 语句:
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
数据控制语言
grant语句
给用户增加权限
revoke语句
收回用户权限
commit语句
提交事务
rollback语句
回滚事务
MySQL权限级别介绍
全局——可以管理整个MySQL
库——可以管理指定的数据库
表——可以管理指定数据库的指定表
字段——可以管理指定数据库的指定表的指定字段
权限存储在mysql库的user, db, tables_priv, columns_priv, procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中
MySQL目录下的文件
bin目录
放置可执行文件
mysql.exe等
data目录
放置日志及数据库
include目录
放置头文件
mysql.h等
lib目录
放置库文件
share目录
放置字符集、语言等
my.ini
是MySQL正在使用的配置文件
MySQL数据库使用的配置文件
my-huge.ini
my-template.ini
配置文件的模板
cmd下MySQL使用
启动mysql服务
net start mysql
net stop mysql
登录
mysql -h 服务器地址 -u 用户名 -p
或者使用MySQL Command Line Client登录
数据库和表的操作
注意
打开CMD,将工作目录切换到MySQL的bin下
库名、表名需要用反引号包裹
操作要记得分号结尾
常用语法
查询当前数据库版本:select version();
查询当前数据库:select database();
查询当前数据库用户:select user();
查看数据库文件存放的目录:select @@datadir;
查询当前路径:select @@basedir;
查询所有数据库:show databases;
查询所有表名:show tables;
选择一个数据库:use+数据库名;
创建一个数据库:create database `数据库名`;
删除一个数据库:drop database `数据库名`;
创建一个表:create table 表名(字段名 数据类型 字符集);
查询一个表结构:desc 表名;
查询当前系统:select @@global.version_compile_os;
修改数据库编码
alter database + 数据库名 default character set +编码 collate +编码_bin
例:alter database test default character set gbk collate gbk_bin
对数据库用户的基本操作
查询当前数据库用户:select user();
查看所有用户(用户名、给谁授权):select user,host from mysql.user; 或 select mysql.user;
添加用户:create user 用户名@'主机地址' identified by '密码';
创建用户同时授权:grant all privileges on mq.* to 用户名@主机名 identified by '密码';
设置与更改用户密码:SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
删除用户:drop user 用户名@'主机地址';
查看当前用户权限:show grants for 用户名@'主机地址';
给用户授权:grant 权限 on 数据库名.表名 to 用户名@'主机名' (在这里加上 WITH GRANT OPTION,可以使他有赋权能力)
撤销权限:revoke 权限 on 数据库名.表名 from 用户名@'主机名'
每次更新权限后记得刷新权限:FLUSH PRIVILEGES;
切换用户:
使用命令 -u 用户名 -p 即可
注意:不同用户的主机得是一样的,否则无法切换;
数据表的基本操作
操作表应先指定数据库
use + 数据库名称;
查看数据表
查看所有数据表
show tables;
查看表中字段
show columns from +表名
show create table +数据表名;
describe + 表名
修改数据表
修改表名
alert table + 旧表名 rename to +新表名
修改字段名
alter table +表名 change +旧字段名+新字段名 +新数据类型(数据完整性约束条件)
修改字段的数据类型
alter table +表名 modify +字段名 +数据类型(数据完整性约束条件);
添加字段
alter table +表名 add +新字段 +数据类型(数据完整性约束条件);
删除字段
alter table +表名 drop +字段名;
修改字段排列
删除数据表
drop table +表名;
对数据的操作
添加数据
为表中字段添加数据
insert into +表名 (字段名1,字段名2..) values(值1,值2,..);
其他写法: INSERT INTO 表名
SET 字段名1=值1,字段名2=值2, ..
举例: insert into student
set id=10,name='zhangba',chengji=72;
同时添加多条记录
insert into +表名
values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
更新数据
update
利用 where控制要更新的范围
删除数据
delete from + 表名 where id= ;
为表中所有字段添加规则
CREATE TABLE 创建表名;
语句中指定所有字段名规则
语法: CREATE TABLE '表名'(字段名1,规则,
字段名2 规则,
...
);
命令:CREATE TABLE `student`(
id INT(3) PRIMARY KEY AUTO_INCREMENT设置整数以及主键,
name VARCHAR字符集(20) NOT NULL不能为空,
grade FLOAT浮点型,gender CHAR男女(2)
);
单表查询
select
查询所有字段
*通配符,代替所有字段名
select * from + 表名
查询指定字段
select +字段名1,字段名2 from +表名
按条件查询
select +字段名1,字段名2 from +表名 where id= ;
in关键字的查询
in关键字用来判断某个字段的值在不在指定集合中,若在,则可被查询出
select 字段1,字段2 from +表名 where id in(1,2,3);
between and关键字查询
between and关键字用来判断某个字段的值在不在指定范围内,若在,则可被查询出
select 字段1,字段2 from +表名 where id between 2 and 4;
空值查询 is null
select 字段1,字段2 from +表名 where id is null;
select 字段1,字段2 from +表名 where id is not null;
distinct查询
过滤掉查询记录中的重复值
select distinct +字段名 from +表名;
like关键字查询
判断两个字符串是否匹配
select 字段名1,字段名2 from +表名 where id like “c%” ;
select 字段名1,字段名2 from +表名 where id not like 'c%' ;
匹配字符串
注:若匹配的字符串中有 %和_ 则需要转义 +&或+_
常规字符串
%通配符
匹配任意长度字符串
如 c%匹配以c开头的任意字符串
_通配符
匹配单个字符
如c_匹配 ca 或cb等
and关键字的多条件查询
可使用多个查询条件(多个条件必须同时满足)
select 字段名1,字段名2 from +表名 where id like ‘c%’ and id < 3 ;
or关键字的多条件查询
可使用多个查询条件(多个条件中有满足的即可)
select 字段名1,字段名2 from +表名 where id like ‘c%’ or id < 3 ;
其他查询
COUNT()函数:统计记录的条数
语法::SELECT COUNT(字段名) FROM表名
举例:查询student表中的id字段一 共有多少条记录
命令:select count(id) from student;
SUM()函数:求出表中某个字段所有值的总和
语法::SELECT SUM(字段名) FROM表名;
举例:求出student表中id字段的总和
命令::SELECT SUM(id) FROM student;
AVG()函数:求出表中某个字段所有值的平均值
语法:SELECT AVG(字段名) FROM表名;
举例:求出student表中id字段的平均值
命令:SELECT AVG(id) FROM student;
UNION联合查询
UNION 操作符用于合并两个或多个SELECT 语句的结果集
注意:UNION 内部的SELECT 语句必须拥有相同数量的列。且第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称。列也必须拥有相似的数据类型。同时,每条SELECT 语句中的列的顺序必须相同。
如 select version() union select id from users;
version()的查询结果是int型,且只有一列,所以 union 之后的那个select查询结果也必须只有一列,而且数据类型也需要类似 int
mysql常用函数
concat(str1,str2 … … ); 没有分隔符的连接字符串
如果连接串中存在NULL,则返回结果为NULL;
concat_ws(separator,str1,str2… … );该函数第一个参数是其他参数的分隔符,分隔符在连接字符串之间加入。分隔符可以是一个字符串,也可以是其它参数。
分隔符为NULL,则返回结果为NULL;
如果参数中存在NULL,则会被忽略;
可以对NULL进行判断,并用其它值进行替换
group_concat(str1,str2… … );将多行查询的结果以逗号为分隔符连接成为一
行结果。
在注入时,由于回显位的问题,concat() 不能一次性将多行内容展示出来,需要使用 limit 控制挨个去显示,这时使用 group_concat(),可将多行内容在一行显示。
MySQL其他姿势(sql注入常用)
构造永真,爆出字段下的所有内容
当查询的值为true时,可正确查询
特殊的查询结构id=1=(1)=1
(该结构可以用来fuzz,只需要替换括号里的内容)
select name from users where id=a=(b)=c
b、c的值,只能为1或0,也可以是true或false
当b、c的值均为1或0时,等价于id=a
当b或c中有一个为0时,就会查询出,除id=a之外的字段下的其他值
导出数据
mysqldump –opt test > mysql.test
即将数据库test数据库导出到mysql.test文件,后者是一个文本文件
如:mysqldump -u root -p 123456 --databases dbname > mysql.dbname
就是把数据库dbname导出到文件mysql.dbname中。
导入数据
source D:\ceshi.sql
这是sql文件存放的地址