Ⅰ sql 查询 一个表中某几列数据
查询表格中的指定列数据,是select
语句其中一种语法
即:select
columna,columnb
from
table
如表格table有列
a,b,c,d
1、select
*
from
table
=
select
a,b,c,d
from
table
即显示表格式所以列
2、select
a,b
from
table
即指定显示表格式a,b两列
Ⅱ sql怎么查询一个数据库所有表列数
--读取库中的所有表名
select name from sysobjects where xtype='u'
--读取指定表的所有列名
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名')
获取数据库表名和字段
sqlserver中各个系统表的作用
sysaltfiles 主数据库 保存数据库的文件
syscharsets 主数据库 字符集与排序顺序
sysconfigures 主数据库 配置选项
syscurconfigs 主数据库 当前配置选项
sysdatabases 主数据库 服务器中的数据库
syslanguages 主数据库 语言
syslogins 主数据库 登陆帐号信息
sysoledbusers 主数据库 链接服务器登陆信息
sysprocesses 主数据库 进程
sysremotelogins主数据库 远程登录帐号
syscolumns 每个数据库 列
sysconstrains 每个数据库 限制
sysfilegroups 每个数据库 文件组
sysfiles 每个数据库 文件
sysforeignkeys 每个数据库 外部关键字
sysindexs 每个数据库 索引
sysmenbers 每个数据库 角色成员
sysobjects 每个数据库 所有数据库对象
syspermissions 每个数据库 权限
systypes 每个数据库 用户定义数据类型
select 列名=name from syscolumns where id=object_id(N'要查的表名')
Ⅲ sql 查询 一个表中某几列数据
sql查询一个表中某几列数据语法:
1、SELECT 列名称1、列名称2.....列名称n FROM 表名称 WHERE 列 运算符 值;
2、SELECT * from 表名称 where 列 运算符 值(列 运算符 值,这个可以是多个,中间用and隔开)。
解析:使用sql查询时,作为查询的筛选限制条件,只需要对有限制要求的字段使用where进行限制即可,无需对非限制要求的字段进行特别限制。
所以你的语句可以修改为"select * from test1 where id=‘2’;"就可以了。其中,你原语句中的name=全部和age=全部,属于多余的,如果不对name和age字段做任何限制的话,sql本身就是会查询全部name和age,而无需你另外加设条件。
再比如你这样写:“select * from test1;”在不加任何where条件的情况下,这个sql查询本身就是查询全部数据。而当加入id='2'之后,就限制了只能返回id值是2的某一条或者多条数据。
通过几个例子来加深一下对上表各查询条件使用的理解:
1、查询计算机科学系全体学生的名单;
SELECT Sname FROM StudentWHERE Sdept='CS';
2、查询所有年龄在20岁以下的学生姓名及其年龄;
SELECT Sname,Sage FROM StudentWHERE Sage<20;
3、查询考试成绩不合格的学生的学号;
SELECT DISTINCT Sno FROM SCWHERE Grade<60;
4、查询年龄在20~23岁之间的学生的姓名、系别和年龄;
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
5、查询年龄在20~23岁之间的学生的姓名、系别和年龄;
SELECT Sname,Sdept,Sage FROM StudentWHERE Sage NOT BETWEEN 20 AND 23;
6、查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名、系别和年龄。
SELECT Sname,Ssex FROM Student WHERE Sdept IN('CS','MA','IS')。
Ⅳ sql 查询 一个表中某几列数据
所有数据可以用到sql中的通配符%,用来进行模糊查询。
用法是 select
*
from
test1
where
id=‘2’and
name
like
'%'
and
age like
'%',表示从test1表中查询id为2,name和age任意的数据。
1、为了对比前后查询数据,先查询表test1中的所有数据,select
*
from
test1,如下图所示。
2、再用通配符%进行模糊查询,select
*
from
test1 where
id='2'
and
name
like
'%'
and
age
like
'%',可以看到筛选后后的结果除去了id为1的数据。
(4)sql注入查询表的列数扩展阅读:
sql语言中还有其它的通配符,例如“_”,它表示仅代替一个字符,从"Persons"
表中选取名字的第一个字符之后是
"eorge"
的人,SELECT
*
FROM
表名
WHERE
列名LIKE
'_eorge'。
通配符[charlist]代表字符列中的任何单一字符,从
"Persons"
表中选取居住的城市以
"A"
或
"L"
或
"N"
开头的人,SELECT
*
FROM
Persons
WHERE
City
LIKE
'[ALN]%'。
Ⅳ sql语句查询一个表的列数
看的出来你初学,可以先看看数据库基础,以EXCEL表格的方法给你讲一遍。
count(name) 查找出来的行数(看成EXCEL中以某一些条件找出来的行数)
syscolumns 表的名字 (看成EXCEL中的工作表A名)
id 表里的一个字段 (看出EXCEL中的某一列)
sysobjects 表的名字 (看成EXCEL中的工作表B名)
xtype='u' 一个字段=U (看出EXCEL中的某一列=U这个字符)
Ⅵ 部分sql注入总结
本人ctf选手一名,在最近做练习时遇到了一些sql注入的题目,但是sql注入一直是我的弱项之一,所以写一篇总结记录一下最近学到的一些sql注入漏洞的利用。
在可以联合查询的题目中,一般会将数据库查询的数据回显到首页面中,这是联合注入的前提。
适用于有回显同时数据库软件版本是5.0以上的MYSQL数据库,因为MYSQL会有一个系统数据库information_schema, information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等
联合注入的过程:
判断注入点可以用and 1=1/and 1=2用于判断注入点
当注入类型为数字型时返回页面会不同,但都能正常执行。
sql注入通常为数字型注入和字符型注入:
1、数字型注入
数字型语句:
在这种情况下直接使用and 1=1/and 1=2是都可以正常执行的但是返回的界面是不一样的
2、字符型注入
字符型语句:
字符型语句输入我们的输入会被一对单引号或这双引号闭合起来。
所以如果我们同样输入and 1=1/and 1=2会发现回显画面是并无不同的。
在我们传入and 1=1/and 1=2时语句变为
传入的东西变成了字符串并不会被当做命令。
所以字符型的测试方法最简单的就是加上单引号 ' ,出现报错。
加上注释符--后正常回显界面。
这里还有的点就是sql语句的闭合也是有时候不同的,下面是一些常见的
这一步可以用到order by函数,order by 函数是对MySQL中查询结果按照指定字段名进行排序,除了指定字 段名还可以指定字段的栏位进行排序,第一个查询字段为1,第二个为2,依次类推,所以可以利用order by就可以判断列数。
以字符型注入为例:
在列数存在时会正常回显
但是列数不存在时就会报错
这步就说明了为什么是联合注入了,用到了UNION,UNION的作用是将两个select查询结果合并
但是程序在展示数据的时候通常只会取结果集的第一行数据,这就让联合注入有了利用的点。
当我们查询的第一行是不存在的时候就会回显第二行给我们。
讲查询的数据置为-1,那第一行的数据为空,第二行自然就变为了第一行
在这个基础上进行注入
可以发现2,3都为可以利用的显示点。
和前面一样利用union select,加上group_concat()一次性显示。
现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了
报错注入的利用步骤和联合注入一致,只是利用函数不同。
以updatexml为例。
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target: 需要操作的xml片段
xpath_expr: 需要更新的xml路径(Xpath格式)
new_xml: 更新后的内容
此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。
这个函数当xpath路径错误时就会报错,而且会将路径内容返回,这就能在报错内容中看到我们想要的内容。
而且以~开头的内容不是xml格式的语法,那就可以用concat函数拼接~使其报错,当然只要是不符合格式的都可以使其报错。
[极客大挑战 2019]HardSQL
登录界面尝试注入,测试后发现是单引号字符型注入,且对union和空格进行了过滤,不能用到联合注入,但是有错误信息回显,说明可以使用报错注入。
利用updatexml函数的报错原理进行注入在路径处利用concat函数拼接~和我们的注入语句
发现xpath错误并执行sql语句将错误返回。
在进行爆表这一步发现了等号也被过滤,但是可以用到like代替等号。
爆字段
爆数据
这里就出现了问题flag是不完整的,因为updatexml能查询字符串的最大长度为32,所以这里要用到left函数和right函数进行读取
报错注入有很多函数可以用不止updatexml一种,以下三种也是常用函数:
堆叠注入就是多条语句一同执行。
原理就是mysql_multi_query() 支持多条sql语句同时执行,用;分隔,成堆的执行sql语句。
比如
在权限足够的情况下甚至可以对数据库进行增删改查。但是堆叠注入的限制是很大的。但是与union联合执行不同的是它可以同时执行无数条语句而且是任何sql语句。而union执行的语句是有限的。
[强网杯 2019]随便注
判断完注入类型后尝试联合注入,发现select被过滤,且正则不区分大小写过滤。
那么就用堆叠注入,使用show就可以不用select了。
接下去获取表信息和字段信息
那一串数字十分可疑大概率flag就在里面,查看一下
这里的表名要加上反单引号,是数据库的引用符。
发现flag,但是没办法直接读取。再读取words,发现里面有个id字段,猜测数据库语句为
结合1'or 1=1#可以读取全部数据可以利用改名的方法把修改1919810931114514为words,flag修改为id,就可以把flag读取了。
最终payload:
盲注需要掌握的几个函数
在网页屏蔽了错误信息时就只能通过网页返回True或者False判断,本质上是一种暴力破解,这就是布尔盲注的利用点。
首先,判断注入点和注入类型是一样的。
但是盲注没有判断列数这一步和判断显示位这两步,这是和可回显注入的不同。
判断完注入类型后就要判断数据库的长度,这里就用到了length函数。
以[WUSTCTF2020]颜值成绩查询为例
输入参数后,发现url处有个get传入的stunum
然后用到length函数测试是否有注入点。
发现页面有明显变化
将传入变为
页面回显此学生不存在
那么就可以得出数据库名长度为3
测试发现过滤了空格
然后就是要查数据库名了,这里有两种方法
一、只用substr函数,直接对比
这种方法在写脚本时可以用于直接遍历。
二、加上ascii函数
这个payload在写脚本时直接遍历同样可以,也可用于二分法查找,二分法速度更快。
接下来的步骤就和联合注入一样,只不过使用substr函数一个一个截取字符逐个判断。但是这种盲注手工一个一个注十分麻烦所以要用到脚本。
直接遍历脚本
二分法脚本
时间盲注用于代码存在sql注入漏洞,然而页面既不会回显数据,也不会回显错误信息
语句执行后也不提示真假,我们不能通过页面的内容来判断
所以有布尔盲注就必有时间盲注,但有时间盲注不一定有布尔盲注
时间盲注主要是利用sleep函数让网页的响应时间不同从而实现注入。
sql-lab-less8:
无论输入什么都只会回显一个you are in...,这就是时间盲注的特点。
当正常输入?id=1时时间为11毫秒
判断为单引号字符型注入后,插入sleep语句
明显发现响应时间为3053毫秒。
利用时间的不同就可以利用脚本跑出数据库,后续步骤和布尔盲注一致。
爆库
爆表
爆字段
脚本
在进行SQL注入时,发现union,and,or被完全过滤掉了,就可以考虑使用异或注入
什么是异或呢
异或是一种逻辑运算,运算法则简言之就是:两个条件相同(同真或同假)即为假(0),两个条件不同即为真(1),null与任何条件做异或运算都为null,如果从数学的角度理解就是,空集与任何集合的交集都为空
即 1^1=0,0^0=0,1^0=1
利用这个原理可以在union,and,or都被过滤的情况下实现注入
[极客大挑战 2019]FinalSQL
给了五个选项但是都没什么用,在点击后都会在url处出现?id。
而且union,and,or都被过滤
测试发现?id=1^1会报错
但是?id=1^0会返回?id=1的页面,这就是前面说的原理,当1^0时是等于1的所以返回?id=1的页面。
根据原理写出payload,进而写出脚本。
爆库
爆表
爆字段
据此可以写出基于异或的布尔盲注脚本
实验推荐:课程:SQL注入初级(合天网安实验室)
Ⅶ sql语句中查询含有a数据的列数,b数据的列数,c数据的列数
select count(a) as 'count(a)',
count(b) as 'count(b)',
count(c) as 'count(c)'
from t1
这样就行了啊。
count(a),他只计算a不为空的列数。结果是2.
Ⅷ 如何通过SQL语句查询出表中的列数
是MSSQL SERVER吧,
在MASTER库里或你自己的库里,不是有一些默认的表吗,就是记录这些信息的。记不住了。自己找找看。
Ⅸ sql语句如何实现实现查询多列的数据
可以,我看Id列应该是唯一的吧。根据proctID分组的时候,取max(id),然后通过此id关联,就可以把其他列数据也查询出来了