由于我们在平时注入的时候,可能碰到最多的数据库就是Mysql,所以我们学习数据库的基本操作,有主于我们对注入的理解。
Mysql数据库的基本操作
-- 创建数据库,在数据库不存在的时候创建它,并设置编码和排序顺序
CREATE DATABASE IF NOT EXISTS db_test CHARACTER SsET utf8 COLLATE utf8_general_ci;
-- 显示当前的所有数据库
SHOW DATABASES;
-- 显示数据库的创建语句,可以用于查看默认编码方式
ALTER DATABASE db_test CHARACTER SET GBK;
-- 如果数据库存在则删除它
DROP DATABASE IF EXISTS db_test;
-- 使用某一个数据库
USE db_test;
-- 创建一张表,设置其中的字段信息(名称\类型)
CREATE TABLE my_table(
m_id INT,
m_name VARCHAR(32),
m_sex Enum('男','女','保密'),
m_class VARCHAR(32),
m_test VARCHAR(32),
m_start_date DATETIME
)CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 显示指定表的字段信息
DESC my_table;
-- 查看数据库的所有表
SHOW TABLES;
-- 查看创建表的时候实际使用的语句
SHOW CREATE TABLE my_table;
-- 使用CHANGE 修改指定表中某一列的信息
ALTER TABLE my_table CHANGE test2 test2_new DOUBLE;
-- 在指定表的指定一个位置后添加一个相同数据类型的字段[FIRST\AFTER column]
ALTER TABLE my_table ADD test3 INT AFTER m_test;
-- 使用MODIFY修改指定表中某一列的类型
ALTER TABLE my_table MODIFY m_test INT;
-- 删除表中指定字段
ALTER TABLE my_table DROP test2_new;
ALTER TABLE my_table DROP test3;
-- 删除表
DROP TABLE my_table;
-- 为指定表的所有字段添加一条记录
INSERT INTO my_table VALUE(1,'doudou','男','55','??',"2011-1-1 01:01:01");
-- 显示表中信息
SELECT * FROM my_table;
-- 清空表中数据
truncate table my_table;
DELETE * FROM my_table;
-- 给指定表的所有字段添加多行内容
INSERT INTO my_table VALUES
(2,'baobao1','女','55','??',"2011-1-1 01:01:01"),
(3,'baobao2','女','55','??',"2011-1-1 01:01:01"),
(4,'baobao3','女','55','??',"2011-1-1 01:01:01"),
(5,'baobao4','女','55','**',"2011-1-1 01:01:01"),
(6,'baobao5','女','55','??',"2011-1-1 01:01:01"),
(7,'baobao6','女','55','??',"2011-1-1 01:01:01"),
(8,'baobao7','女','55','??',"2011-1-1 01:01:01");
-- 设置所有的用于性别为保密
UPDATE my_table SET m_sex="保密";
-- 按条件设置性别
UPDATE my_table SET m_sex="女" WHERE m_test="**";
-- 删除宝宝7
DELETE FROM my_table WHERE m_name="baobao7";
-- 班级表,描述班级的信息
CREATE TABLE my_class(
m_id INT PRIMARY KEY AUTO_INCREMENT,
m_name VARCHAR(32) NOT NULL UNIQUE,
m_count INT NOT NULL DEFAULT 0
)CHARACTER SET utf8 COLLATE utf8_general_ci;
SELECT * FROM my_class;
INSERT INTO my_class VALUE
(1,"lili",19),
(2,"lili1",19),
(3,"lili2",19),
(4,"lili3",19),
(5,"lili4",19);
DROP TABLE my_student;
-- 表的约束类型
CREATE TABLE my_student(
-- 主键:非空且唯一的,通常是id值,并且是自增的
m_id INT PRIMARY KEY AUTO_INCREMENT,
-- 唯一约束:不能重复的,且非空的
m_name VARCHAR(32) UNIQUE NOT NULL,
-- 默认约束,设置了默认约束的字符按可以不进行手动的添加
m_sex Enum('男','女','不详') DEFAULT NULL,
-- 外键,关联到班级里的主键
m_class INT NOT NULL
)CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 为my_student中的m_class添加外键关联到my_class中的m_id
-- 在添加数据的时候,外键必须是一个已经存在的主键
ALTER TABLE my_student ADD FOREIGN KEY(m_class) REFERENCES my_class(m_id);
INSERT INTO my_student VALUE
(1,"lala","女",4),
(2,"lala1","女",2),
(3,"lala2","女",4),
(4,"lala3","女",3),
(5,"lala4","女",3),
(6,"lala5","女",3);
UPDATE my_student SET m_sex="不详" WHERE m_id%2=1;
-- 简单的查询所有数据
SELECT * FROM my_student;
-- 查询指定表的某一列数据
SELECT m_name,m_sex FROM my_student;
-- 当前的学生分布在哪些班级[去重]
SELECT DISTINCT m_class FROM my_student;
-- 对查询到的数据去别名,对取到的数据进行运算
SELECT m_name 名字,m_class*100 FROM my_student;
-- 带条件的查询值关系运算符
SELECT m_name FROM my_student WHERE m_class >3;
-- 带条件的查询之IN,位于某些数据之中
SELECT m_name,m_class FROM my_student WHERE m_class IN(1,3);
-- 带条件的查询之 BETWEEN AND,位于某个区间
SELECT m_name,m_class FROM my_student WHERE m_class BETWEEN 1 AND 3;
-- 带条件的查询之LIKE _(匹配一个任意字符) %(匹配任意个字符)
SELECT m_name FROM my_student WHERE m_name LIKE "%3";
SELECT m_name FROM my_student WHERE m_name LIKE "____2";
-- 查询所有大于50且性别为女的同学
SELECT * FROM my_student WHERE m_class > 2 AND m_sex="女";
-- 对查询到的结果按照学生的分数以升序ASC(降序DESC)进行排序
SELECT * FROM my_student ORDER BY m_class DESC;
-- 以降序查询分数最高的三位同学的信息 从0开始,3条信息
SELECT * FROM my_student ORDER BY m_class DESC LIMIT 0,3
-- 统计学生个数COUNT(*|列名) 统计记录的条数
SELECT COUNT(*) FROM my_student;
-- 统计玩家平均积分 AVG(数值类型列名) 平均值
SELECT AVG(m_score) FROM my_student;
-- 统计学生总分和 求和
SELECT SUM(m_class) FROM my_student;
SELECT MAX(m_class) FROM my_student;
-- 可以使用MD5和shal等函数获取加密之后的数据
SELECT md5("123");
-- 分组查询,枚举出指定列的指定信息进行运算
SELECT m_class,COUNT(*) FROM my_student GROUP BY m_class;
-- 查询班级数大于3的班级每一个班实际有多少同学
SELECT m_class,COUNT(*) FROM my_student GROUP BY m_class HAVING m_class >3;
-- 多表查询,交叉链接,查询到的是两张表的乘积(笛卡尔积)
SELECT * FROM my_class,my_student;
-- 多表查询,内连接,将两张表的字段进行比较
SELECT * FROM my_class,my_student WHERE my_class.m_id = my_student.m_class;
-- 左外链接查询,on后面是条件,以左边的my_class为主,如果左边有的数据右边没有,还是会显示null
SELECT * FROM my_class LEFT JOIN my_student ON my_class.m_id = my_student.m_class;
-- 右链接
SELECT * FROM my_class RIGHT JOIN my_student ON my_class.m_id = my_student.m_class;
-- 子查询:外层的查询结果依赖于内层的查询,in条件,结果是否在集合中
SELECT DISTINCT * FROM my_class WHERE m_id in (SELECT m_class FROM my_student WHERE m_sex='女');
-- 判断有没有任何一个同学分数小于50,如果有则输出后三名
SELECT * FROM my_student,my_class WHERE EXISTS(SELECT m_class FROM my_student WHERE m_class>2)
AND my_student.m_class = my_class.m_id ORDER BY m_class ASC LIMIT 0,3;
-- 如果有不详和任何一个女生的班级相同就输出信息
SELECT * FROM my_student,my_class WHERE m_class=ANY(SELECT m_class FROM my_student WHERE m_sex='女')
AND my_student.m_class = my_class.m_id AND m_sex='不详';
select * from my_class;
INSERT INTO my_class VALUE (100,'linali',200);
INSERT INTO my_student VALUE(10,'linali','不详',100);
select * from my_student;
-- 如果有不详的成绩大于任何一个女生的成绩就输出
SELECT * FROM my_student,my_class WHERE m_class>ALL(SELECT m_class FROM my_student WHERE m_sex='女')
AND my_student.m_class = my_class.m_id AND m_sex='不详';