参考资料:
http://www.runoob.com/sql/sql-tutorial.html
《细说PHP》
SQL语言是什么?
SQL是结构化查询语言(Structured Query Language)的缩写。
SQL语言的功能
- 面向数据库执行查询
- 从数据库取回数据
- 在数据库中插入新的记录
- 更新数据库中的数据
- 从数据库删除记录
- 创建新数据库
- 在数据库中创建新表
- 在数据库中创建存储过程
- 在数据库中创建视图
- 设置表、存储过程和视图的权限
RDBMS
RDBMS 指关系型数据库管理系统,全称 Relational Database Management System。
RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如 MS SQL Server、IBM DB2、Oracle、MySQL 以及 Microsoft Access。
RDBMS 中的数据存储在被称为表的数据库对象中。
表是相关的数据项的集合,它由列和行组成。
RDBMS术语
一些RDBMS术语如下:
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成。
- 表头(header): 每一列的名称;
- 列(col): 具有相同数据类型的数据的集合;
- 行(row): 每一行用来描述某条记录的具体信息;
- 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
- 键(key): 键的值在当前列中具有唯一性。
SQL语法
数据库表
一个数据库通常包含一个或多个表。每个表由一个名字标识(例如:"dvwa"),表包含带有数据的记录(行)。
我的电脑上安装了DVWA,在数据库dvwa的users表中存储着一些用户记录。
我们可以通过以下命令查看 "users" 表的数据:
mysql> use dvwa;
Database changed
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM users;
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
| user_id | first_name | last_name | user | password | avatar | last_login | failed_login |
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
| 1 | admin | admin | admin | 5f4dcc3b5aa765d61d8327deb882cf99 | /hackable/users/admin.jpg | 2019-02-24 21:07:27 | 0 |
| 2 | Gordon | Brown | gordonb | e99a18c428cb38d5f260853678922e03 | /hackable/users/gordonb.jpg | 2019-02-24 21:07:27 | 0 |
| 3 | Hack | Me | 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b | /hackable/users/1337.jpg | 2019-02-24 21:07:27 | 0 |
| 4 | Pablo | Picasso | pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 | /hackable/users/pablo.jpg | 2019-02-24 21:07:27 | 0 |
| 5 | Bob | Smith | smithy | 5f4dcc3b5aa765d61d8327deb882cf99 | /hackable/users/smithy.jpg | 2019-02-24 21:07:27 | 0 |
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
5 rows in set (0.02 sec)
解析
- use dvwa; 命令用于选择数据库。
- set names utf8; 命令用于设置使用的字符集。
- SELECT * FROM users; 读取数据表的信息。
SQL 语句
在数据库上执行的大部分工作都由 SQL 语句完成。例如,下面的语句从“users"表中选取所有记录:
SELECT * FROM users;
注意:SQL语言对大小写不敏感。
SQL 语句后面的分号
某些数据库系统要求在每条 SQL 语句的末端使用分号。
分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的 SQL 语句。最好在所有的SQL语句后使用分号。
一些SQL命令
- SELECT - 从数据库中提取数据
- UPDATE - 更新数据库中的数据
- DELETE - 从数据库中删除数据
- INSERT INTO - 向数据库中插入新数据
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
SELECT 语句
SELECT语句用于从数据库中选取数据。结果被存储在一个结果表中,称为结果集。
语法
SELECT column_name,column_name
FROM table_name;
SELECT * FROM table_name;
实例
下面的 SQL 语句从 "users" 表中选取 "user" 和 "password" 列:
SELECT user, password FROM users;
输出:
mysql> SELECT user, password FROM users;
+---------+----------------------------------+
| user | password |
+---------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
| gordonb | e99a18c428cb38d5f260853678922e03 |
| 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b |
| pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 |
| smithy | 5f4dcc3b5aa765d61d8327deb882cf99 |
+---------+----------------------------------+
5 rows in set (0.00 sec)
SELECT DISTINCT 语句
SELECT DISTINCT语句用于返回唯一不同的值。
在表中,一个列可能会包含多个重复值,DISTINCT 关键词用于返回唯一不同的值。
语法
SELECT DISTINCT column_name,column_name
FROM table_name;
实例
下面的 SQL 语句仅从 "users" 表的 "password" 列中选取唯一不同的值,也就是去掉 "password" 列重复值:
SELECT DISTINCT password FROM users;
输出:
mysql> SELECT DISTINCT password FROM users;
+----------------------------------+
| password |
+----------------------------------+
| 5f4dcc3b5aa765d61d8327deb882cf99 |
| e99a18c428cb38d5f260853678922e03 |
| 8d3533d75ae2c3966d7e0d4fcc69216b |
| 0d107d09f5bbe40cade3de5c71e9e9b7 |
+----------------------------------+
4 rows in set (0.00 sec)
WHERE 子句
WHERE子句用于过滤记录,提取那些满足指定标准的记录。
语法
SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;
实例
下面的 SQL 语句从 "users" 表中选取用户名为 "admin" 的所有用户,并列出用户名和密码:
SELECT user,password FROM users WHERE user='admin';
输出:
mysql> SELECT user,password FROM users WHERE user='admin';
+-------+----------------------------------+
| user | password |
+-------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
+-------+----------------------------------+
1 row in set (0.00 sec)
数值字段
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。
在上个实例中 ,'admin' 文本字段使用了单引号。
数值字段不需要使用引号。
例如:
SELECT user, password FROM users WHERE user_id = 1;
输出:
mysql> SELECT user, password FROM users WHERE user_id = 1;
+-------+----------------------------------+
| user | password |
+-------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
+-------+----------------------------------+
1 row in set (0.00 sec)
WHERE 子句中的运算符
WHERE子句中可以使用运算符,以下是一些运算符:
运算符 | 描述 |
---|---|
= | 等于 |
<> | 不等于。在 SQL 的一些版本中,该操作符可被写成 != |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
IN | 指定针对某个列的多个可能值 |
AND & OR 运算符
AND & OR运算符用于基于一个以上的条件对记录进行过滤。
如果第一个条件和第二个条件都成立,则AND运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则OR运算符显示一条记录。
AND运算符实例
下面的 SQL 语句从 "users" 表中选取密码的MD5值为 "5f4dcc3b5aa765d61d8327deb882cf99" 且user_id大于 "3" 的所有用户:
SELECT * FROM users WHERE password='5f4dcc3b5aa765d61d8327deb882cf99' AND auser_id > 3;
输出:
mysql> SELECT * FROM users WHERE password = '5f4dcc3b5aa765d61d8327deb882cf99' AND user_id > 3;
+---------+------------+-----------+--------+----------------------------------+----------------------------+---------------------+--------------+
| user_id | first_name | last_name | user | password | avatar | last_login | failed_login |
+---------+------------+-----------+--------+----------------------------------+----------------------------+---------------------+--------------+
| 5 | Bob | Smith | smithy | 5f4dcc3b5aa765d61d8327deb882cf99 | /hackable/users/smithy.jpg | 2019-02-24 21:07:27 | 0 |
+---------+------------+-----------+--------+----------------------------------+----------------------------+---------------------+--------------+
1 row in set (0.00 sec)
OR运算符实例
下面的 SQL 语句从 "users" 表中选取user_id为 "1" 或者 "2" 的所有用户:
SELECT * FROM users WHERE user_id='1' OR user_id='2';
输出:
mysql> SELECT * FROM users WHERE user_id='1' OR user_id='2';
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
| user_id | first_name | last_name | user | password | avatar | last_login | failed_login |
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
| 1 | admin | admin | admin | 5f4dcc3b5aa765d61d8327deb882cf99 | /hackable/users/admin.jpg | 2019-02-24 21:07:27 | 0 |
| 2 | Gordon | Brown | gordonb | e99a18c428cb38d5f260853678922e03 | /hackable/users/gordonb.jpg | 2019-02-24 21:07:27 | 0 |
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
2 rows in set (0.00 sec)
AND&OR运算符的综合使用
可以把 AND 和 OR 结合起来,使用圆括号来组成复杂的表达式。
下面的 SQL 语句从 "users" 表中选取user_id大于 "2" 且user为 "smithy" 或 "1337" 的所有用户:
SELECT * FROM users WHERE user_id > 2 AND (user='1337' OR user='smithy');
输出:
mysql> SELECT * FROM users WHERE user_id > 2 AND (user='1337' OR user='smithy');
+---------+------------+-----------+--------+----------------------------------+----------------------------+---------------------+--------------+
| user_id | first_name | last_name | user | password | avatar | last_login | failed_login |
+---------+------------+-----------+--------+----------------------------------+----------------------------+---------------------+--------------+
| 3 | Hack | Me | 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b | /hackable/users/1337.jpg | 2019-02-24 21:07:27 | 0 |
| 5 | Bob | Smith | smithy | 5f4dcc3b5aa765d61d8327deb882cf99 | /hackable/users/smithy.jpg | 2019-02-24 21:07:27 | 0 |
+---------+------------+-----------+--------+----------------------------------+----------------------------+---------------------+--------------+
2 rows in set (0.00 sec)
ORDER BY 关键字
ORDER BY关键字用于对结果集按照一个列或者多个列进行排序。
ORDER BY 关键字默认按照升序对记录进行排序,即使用ASC关键字。如果需要按照降序对记录进行排序,可以使用 DESC 关键字。
语法
SELECT column_name,column_name FROM table_name ORDER BY column_name,column_name ASC|DESC;
实例
下面的 SQL 语句从 "users" 表中选取所有用户,并按照 "user_id" 列排序:
SELECT * FROM users ORDER BY user_id;
输出:
mysql> SELECT * FROM users ORDER BY user_id;
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
| user_id | first_name | last_name | user | password | avatar | last_login | failed_login |
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
| 1 | admin | admin | admin | 5f4dcc3b5aa765d61d8327deb882cf99 | /hackable/users/admin.jpg | 2019-02-24 21:07:27 | 0 |
| 2 | Gordon | Brown | gordonb | e99a18c428cb38d5f260853678922e03 | /hackable/users/gordonb.jpg | 2019-02-24 21:07:27 | 0 |
| 3 | Hack | Me | 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b | /hackable/users/1337.jpg | 2019-02-24 21:07:27 | 0 |
| 4 | Pablo | Picasso | pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 | /hackable/users/pablo.jpg | 2019-02-24 21:07:27 | 0 |
| 5 | Bob | Smith | smithy | 5f4dcc3b5aa765d61d8327deb882cf99 | /hackable/users/smithy.jpg | 2019-02-24 21:07:27 | 0 |
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
5 rows in set (0.00 sec)
DESC子句实例
下面的 SQL 语句从 "users" 表中选取所有用户,并按照 "user_id" 列降序排序:
SELECT * FROM users ORDER BY user_id DESC;
输出:
mysql> SELECT * FROM users ORDER BY user_id DESC;
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
| user_id | first_name | last_name | user | password | avatar | last_login | failed_login |
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
| 5 | Bob | Smith | smithy | 5f4dcc3b5aa765d61d8327deb882cf99 | /hackable/users/smithy.jpg | 2019-02-24 21:07:27 | 0 |
| 4 | Pablo | Picasso | pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 | /hackable/users/pablo.jpg | 2019-02-24 21:07:27 | 0 |
| 3 | Hack | Me | 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b | /hackable/users/1337.jpg | 2019-02-24 21:07:27 | 0 |
| 2 | Gordon | Brown | gordonb | e99a18c428cb38d5f260853678922e03 | /hackable/users/gordonb.jpg | 2019-02-24 21:07:27 | 0 |
| 1 | admin | admin | admin | 5f4dcc3b5aa765d61d8327deb882cf99 | /hackable/users/admin.jpg | 2019-02-24 21:07:27 | 0 |
+---------+------------+-----------+---------+----------------------------------+-----------------------------+---------------------+--------------+
5 rows in set (0.00 sec)