基础知识
数据库系统的组成
- 数据库
- 存储数据的容器
- 数据库管理系统
- 软件
- 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) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
- 查询和更新指令构成了 SQL 的 DML 部分:
- 数据控制语言
- grant语句
- 给用户增加权限
- revoke语句
- 收回用户权限
- commit语句
- 提交事务
- rollback语句
- 回滚事务
- MySQL权限级别介绍
- 全局——可以管理整个MySQL
- 库——可以管理指定的数据库
- 表——可以管理指定数据库的指定表
- 字段——可以管理指定数据库的指定表的指定字段
- 权限存储在mysql库的user, db, tables_priv, columns_priv, procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中
- grant语句
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
- alter database + 数据库名 default character set +编码 collate +编码_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 +表名 (字段名1,字段名2..) values(值1,值2,..);
-
同时添加多条记录
- insert into +表名
values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
- insert into +表名
-
-
更新数据
- update
- 利用 where控制要更新的范围
- update
-
删除数据
- 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)
);
- CREATE TABLE 创建表名;
-
单表查询
- 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 ;
- 查询所有字段
- select
-
其他查询
- 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;
- COUNT()函数:统计记录的条数
-
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;
- 如果连接串中存在NULL,则返回结果为NULL;
- concat_ws(separator,str1,str2… … );该函数第一个参数是其他参数的分隔符,分隔符在连接字符串之间加入。分隔符可以是一个字符串,也可以是其它参数。
- 分隔符为NULL,则返回结果为NULL;
- 如果参数中存在NULL,则会被忽略;
- 可以对NULL进行判断,并用其它值进行替换
- group_concat(str1,str2… … );将多行查询的结果以逗号为分隔符连接成为一
行结果。- 在注入时,由于回显位的问题,concat() 不能一次性将多行内容展示出来,需要使用 limit 控制挨个去显示,这时使用 group_concat(),可将多行内容在一行显示。
- 在注入时,由于回显位的问题,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中。
- 即将数据库test数据库导出到mysql.test文件,后者是一个文本文件
导入数据
- source D:ceshi.sql
- 这是sql文件存放的地址