(Structured Query Language)结构化查询语言

SQL简介

什么是sql?

  • SQL 指结构化查询语言
  • SQL 使我们有能力访问数据库
  • SQL 是一种 ANSI 的标准计算机语言

SQL能做什么

  • SQL 面向数据库执行查询
  • SQL可从数据库取回数据
  • 可以在数据库中插入新的记录
  • 可以更新数据库中的数据
  • 可以从数据库中删除数据
  • 可以创建新数据库
  • 可以创建表
  • 可以创建储存过程
  • 可以创建视图
  • 可以设置表、存储过程、和视图的权限

SQL是一门ANSI的标准计算机语言,可以和数据库程序协同工作,比如DB2、MS SQL Server、MySQL、Oracle、Sybase等数据库系统。

RDBMS

关系型数据库管理系统

RDBMS是SQL的基础,

SQL语法

注意

SQL对大小写不敏感。

MS Access和sql server 2000,不需要在每条语句后面加分号,不过有些数据库必须使用分号。

SQL的DML和DDL

SQL分为两个部分:

数据操作语言(DML)

  • SELECT 从数据库表中获取数据
  • update 更新数据库表中数据
  • delete 删除数据表中数据
  • insert into 向数据库表中插入数据

数据定义语言(DDL)

  • create database 创建新的数据库

  • alert database 修改数据库

  • create table 创建数据表

  • alter table 修改数据表

  • drop table 删除表

  • create index 创建索引

  • drop index 删除索引

SQL学习

学习可以使用在线SQL功能

我所使用的数据库为MySQL 5.7,数据库管理工具是Navcat Premium,可以自行去官网下载。

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `persons`  (
`id` int(0) NOT NULL AUTO_INCREMENT,
`firstname` varchar(255),
`lastname` varchar(255),
`adress` varchar(255),
`sex` varchar(2),
PRIMARY KEY (`id`)
);
INSERT INTO `persons` VALUES (1, 'Adans', 'John', '中国湖南', '男');
INSERT INTO `persons` VALUES (2, '李', '四', '中国上海', '男');
INSERT INTO `persons` VALUES (3, '欧', '尼酱', '中国湖南', '女');

练习使用的表结构和数据如上。

SQL SELECT

语法

1
SELECT 列名 from 表名

其中列名可以用*表示,*表示查询所有疾苦

实例

有如下表:

1 Adans John 中国湖南 男
2 李 四 中国上海 男
3 欧 尼酱 中国湖南 女

查询firstname列和lastname数据,

1
2
3
4
5
6
7
8
9
mysql> select firstname,lastname from persons;
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| Adans | John |
| 李 | 四 |
| 欧 | 尼酱 |
+-----------+----------+
3 rows in set (0.00 sec)

SQL SELECT DISTINCT

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

语法

1
SELECR distinct 列名 from 表名

查询adress列

1
2
3
4
5
6
7
8
9
mysql> select adress from persons;
+--------------+
| adress |
+--------------+
| 中国湖南 |
| 中国上海 |
| 中国湖南 |
+--------------+
3 rows in set (0.00 sec)

发现中国湖南数据出现了两次,现在使用distinct关键字再查询一次

1
2
3
4
5
6
7
8
mysql> select distinct adress from persons;
+--------------+
| adress |
+--------------+
| 中国湖南 |
| 中国上海 |
+--------------+
2 rows in set (0.00 sec)

SQL where

语法

SELECT 列名 from 表名 where 列 运算符 值

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

操作符 描述
= 等于
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式

实例

查询adress中国上海的数据

1
2
3
4
5
6
7
mysql> select * from persons where adress = '中国上海';
+----+-----------+----------+--------------+------+
| id | firstname | lastname | adress | sex |
+----+-----------+----------+--------------+------+
| 2 | 李 | 四 | 中国上海 | 男 |
+----+-----------+----------+--------------+------+
1 row in set (0.00 sec)

查询姓李的数据

请注意,我们在例子中的条件值周围使用的是单引号。

SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

SQL and & or

and实例

an用来显示并且的意思

查询adres在中国,且sex为男的数据。

1
2
3
4
5
6
7
8
mysql> select * from persons where adress like '中国%' and sex = '男';
+----+-----------+----------+--------------+------+
| id | firstname | lastname | adress | sex |
+----+-----------+----------+--------------+------+
| 1 | Adans | John | 中国湖南 | 男 |
| 2 | 李 | 四 | 中国上海 | 男 |
+----+-----------+----------+--------------+------+
2 rows in set (0.00 sec)

or实例

or用来表示或者的意思

查询姓李或者姓欧的数据

1
2
3
4
5
6
7
8
mysql> select * from persons where firstname = '李' or firstname = '欧';
+----+-----------+----------+--------------+------+
| id | firstname | lastname | adress | sex |
+----+-----------+----------+--------------+------+
| 2 | 李 | 四 | 中国上海 | 男 |
| 3 | 欧 | 尼酱 | 中国湖南 | 女 |
+----+-----------+----------+--------------+------+
2 rows in set (0.00 sec)

or和and可以结合使用。

SQL order by

用语指定语句进行排序。

默认按照升序排序。如果需要按照降序排序可以使用desc关键字。

像上面数据表中添加两行数据:

1
2
INSERT INTO `persons`(`firstname`, `lastname`, `adress`, `sex`) VALUES ('锐', '雯', '洛克萨斯', '女');
INSERT INTO `persons`(`firstname`, `lastname`, `adress`, `sex`) VALUES ('亚', '索', '艾欧尼亚', '男');

实例

按照firstname升序排序

1
2
3
4
5
6
7
8
9
10
11
mysql> select * from persons order by firstname;
+----+-----------+----------+--------------+------+
| id | firstname | lastname | adress | sex |
+----+-----------+----------+--------------+------+
| 1 | Adans | John | 中国湖南 | 男 |
| 4 | 亚 | 索 | 艾欧尼亚 | 男 |
| 2 | 李 | 四 | 中国上海 | 男 |
| 3 | 欧 | 尼酱 | 中国湖南 | 女 |
| 5 | 锐 | 雯 | 洛克萨斯 | 女 |
+----+-----------+----------+--------------+------+
5 rows in set (0.00 sec)

注: 中文会按照字母顺序排序。

SQL insert into

语法

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

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

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

实例

向上面表中添加一条数据

1
2
mysql> insert into persons(firstname,lastname,adress,sex) values ('卡','特','洛克萨斯','女');
Query OK, 1 row affected (0.01 sec)

SQL update

update语句用语修改表中数据

语法

1
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

实例

1
2
3
mysql> update persons set firstname = '张' where firstname = '李';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

也可以修改多条数据,使用,分隔数据。

SQL delete

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

语法

1
DELETE FROM 表名称 WHERE 列名称 = 值

SQL top(MySQL limit)

top子句用语规定要返回的记录的数目,在MySQL中使用的是limit关键字。

实例

返回两条数据

1
2
3
4
5
6
7
8
mysql> select * from persons limit 2;
+----+-----------+----------+--------------+------+
| id | firstname | lastname | adress | sex |
+----+-----------+----------+--------------+------+
| 1 | Adans | John | 中国湖南 | 男 |
| 2 | 张 | 四 | 中国上海 | 男 |
+----+-----------+----------+--------------+------+
2 rows in set (0.00 sec)

拓展

Oracle 语法

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

例子

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

SQL Server 的语法:

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