由于我们在平时注入的时候,可能碰到最多的数据库就是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='不详';
最后修改:2020 年 08 月 26 日 03 : 00 PM