SQL语句Trick...

sql语句对大小写不敏感。

show语句

show语句用于展示当前所有数据库或者数据表

1
2
show databases;
show tables;


SELECT语句

语法:
SELECT 列名称 FROM 表名称
SELECT * FORM 表名称
星号(*)是选取所有列的快捷方式。

1
2
select * from users;
select id,username from users;

SELECT DISTINCT语句

语法:
SELECT DISTINCT 列名称 FROM 表名称
关键字distinct 意思是去除查询中的重复值。
注意点:只能查询单个列才能去除重复值,如下图:
当查询id,username两个列名的时候是没有去除的,当只查询username的时候才去除成功。

WHERE子句

WHERE子句用于规定选择的标准。
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
语法:
select 列名称 from 表名称 where 列名称 运算符 值
下面的运算符可在where子句中使用:

在某些版本的 SQL 中,操作符 <> 可以写为 !=。

1
select * from users where id = 5
1
2
3
select * from users where id != 5;
select * from users where id <> 5
select * from users where username <> 'admin'
1
select * from users where id > 20

这里就有个注意点:字符串比较的时候是逐位比较的,如一下语句:

1
select * from users where username >'adc';

这个语句会将username列的所有字段和abc逐个比较,例如:
字段内容admin和abc的比较顺序:
admin的第一位先和abc的第一个比较,如果符合比较的条件,继续往后移位比较。
如果第一位不满足就退出比较,不再往后进行。

比较是按ascii的顺序进行的。
但是我们发现上图中的结果中出现了’Admin’ A的ascii码小于a的ascii码,应该不会出现在结果集中。这是因为sql语句比较也属于弱类型的比较,所以再比较的时候会将A转换成a。
注意点:
1.进行比较的支持16进制,需要在在16进制数前面加上0x,这个时候就比较就不按照ascii了,而是按照16进制的顺序进行比较的。
2.如果将字符串和数字进行比较,则字符串是不参与比较的,也不会显示结果集中。

如下图:

1
2
3
4
select * from users where username > 0x61;
// 0x61='a'
select * from users where username > 0x6165
// 0x6165 = 'ad'

注意一点:如果比较字符和字段内容相等的时候,会继续向后比较,等到大于或小于的时候,才会停止,如下图所示

我们看到当和’ad’比较的时候,前几个字段前两个字符和ad相等,会继续向后比较,当比较到m的时候,’ad’就没有了字符,相当于最小的ascii码,所以就会返回admin这个字段内容。
而当和’admin’这个字段比较的时候,前几个字段都和admin相等,而且都比较到了尾部,所以不会返回。

1
select * from users where username between 'admin' and 'da4er';
1
2
select * from users where username like 'adm%';
select * from users where username regexp '^admin$';

like和regexp相当于模糊匹配的功能

引号的使用

SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
数值使用引号引起来,就表示这个数值的ascii。 文本值可以使用16进制代替,这就不需要使用引号。

AND&OR

AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。

AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

1
2
select * from users where username='admin'and id>7 ;
select * from users where username='admin'or id>7 ;

ORDER BY

ORDER BY 语句用于对结果集进行排序。

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照升序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

1
2
select username,password from users order by username asc; //默认升序
select username,password from users order by username desc; //逆序

INSERT语句

INSERT INTO 语句用于向表格中插入新的行。
语法:

1
2
3
4
5
6

INSERT INTO 表名称 VALUES (值1, 值2,....)

也可以指定所要插入数据的列:

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

1
insert into users(username) values('zzzz');

指定列名的话就不需要将所有列名都要赋值。

1
insert into users values(null,'fff','https://da4er.top',0);

不知道列名就要对全部列都要指定值。

UPDATE语句

Update 语句用于修改表中的数据。

语法:

1
update 表名 set 列名称=新值 where 列名称=旧值
1
update users set username='http://da4er.top' where username='111';

上面这条语句就会把username=111的更新为http://da4er.top

DELETE语句

DELETE 语句用于删除表中的行。
语法:

1
2
3
4
5
delete from 表名称 where 列名称=值 //删除某一行

delete from table_name
delete * from table_name
//删除所有行

TOP语句

top语句用于规定要返回的记录的数目。
并非所有的数据库都支持top子句。
sql server语法:

1
2
SELECT TOP number|percent column_name(s)
FROM table_name

mysql语法:
mysql中使用limit代替top
1
2
3
4

SELECT column_name(s)
FROM table_name
LIMIT number

1
select * from users limit 5;


1
select * from users limit 0,5;

意思是从第一位开始读取连续的五位

oracle语法:

1
2
3
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number

1
2
3
SELECT *
FROM Persons
WHERE ROWNUM <= 5

LIKE语句

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
语法:

1
2
3
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern

例子:
选取以a开头的字段:
1
select * from users where username like 'a%';

提示:”%” 可用于定义通配符(模式中缺少的字母)

选取以n结尾的字段:

1
select * from users where username like '%n';

选取字段中包含min的字段:

1
select * from users where username like '%min%';

IN语句

IN 操作符允许我们在 WHERE 子句中规定多个值。
语法:

1
2
3
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

1
select * from users where username in('admin');


注入语句:
如果sql注入过滤了><=%,regexp则可以使用in操作符。

1
select * from users where username = 'admin' and mid(user(),1,1) in ('r')

BETWEEN语句

操作符 BETWEEN … AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。SQL BETWEEN 语法

1
2
3
4
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2

1
select * from users where username  between 'admin' and 'da4er';


注入语法:
between…and… 语法必须两个值都得满足,即两个值都要在字段中存在。

1
select mid(user(),1,1) between 'r' and 'r';

AS语法

通过使用 SQL,可以为列名称和表名称指定别名(Alias)。

表名的as语法:

1
select column_name(s) from table_name as alias_name

1
select a.username from users as a;


列名的as语法:

1
select column_name as alias_name from table_name
1
select username as a from users;
1
select p.username,a.username from users as p,member as a;

将users取别名p,member取别名a 查询p和a的username字段。

JOIN语句

SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
join语句分为:join, inner join, left join, right join。
mysql默认join是inner join 内连接的方式。
内连接:寻找连接建共同的字段显示出来。

1
select users.password,member.address from users  join member on users.username=member.username;


左连接:以join左边的表为基础,显示左边表的全部字段,右边与左边连接键值相等也把左边的字段显示,没有就显示null。

右连接:以join右边的为基础
1
select users.password,member.address from users right join member on users.username=member.username;

UNION语句

UNION 操作符用于合并两个或多个 SELECT 语句的结果集
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

1
select * from users where username='admin'union select 1,2,3,4;


这里有个特性:如果union 前面没有就不会显示出来。

1
select * from users where username='1'union select 1,2,3,4;

Create语句

1
2
3
4
5
6
7
8
9
创建数据库
Create database database_name
创建表
Create table table_name(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
......
)

SQL约束

1.NOT NULL约束
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

1
2
3
4
5
6
7
8
9

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

2.UNIQUE约束
UNIQUE 约束唯一标识数据库表中的每条记录。
1
2
3
4
5
6
7
8
9
10

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)

3.PRIMARY KEY 约束

PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键

1
2
3
4
5
6
7
8
9
10

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)

分组查询

1.count(*)

COUNT() 函数返回匹配指定条件的行数。

1
select count(*) from users;

count(*)返回表中的记录数

  1. group by 分组查询
    1
    select * from users group by password;
    group by 和 order by区别: 3.having
    增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
1
select count(*) from users group by id having id > 11;
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×