2019-02-26 SQL语言基础(1)

参考资料:
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)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,268评论 0 9
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,790评论 5 116
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,714评论 0 44
  • SQL 语法大全 标签(空格分隔): SQL DB2 SQL语法大全 SQL SELECT SQL SELECT ...
    lumicinta阅读 12,614评论 3 196
  • **SQL TOP 子句 TOP 子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说,TOP 子句是...
    廖马儿阅读 3,170评论 1 46