约 1900 字

SQL的简介

介绍

  最近选修了一门 “数据库技术应用”,遂入门了数据库。下面大部分的内容摘自《MySQL 必知必会》,这本书很好,推荐大家去看看,我只讲部分重点内容:

  • 创建数据库
  • 检索数据
  • 排序检索数据
  • 过滤数据
  • 正则表达式
  • 插入数据

  我是在 Linux 上安装 MySQL 来学习的,所以下面都是命令行的形式。

创建数据库

1
CREATE DATEBASE <数据库名>;

创建一个数据库。

1
CREATE DATABASE IF NOT EXISTS <数据库名> DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

创建数据库,该命令的作用:

  1. 如果数据库不存在则创建,存在则不创建。
  2. 创建RUNOOB数据库,并设定编码集为utf8

删除数据库

1
DROP DATABASE <数据库名>;

删除数据库。

选择数据库

1
USE <数据库名>;

选择数据库(即打开数据库)

创建数据表

1
CREATE TABLE <表名> (column_name column_type, ...);

创建数据表,括号里面可以指定多个列名(必需)、数据类型(必需)和约束条件,还可以指定主值处理引擎字符集等。比如:

1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
   `runoob_title` VARCHAR(100) NOT NULL,
   `runoob_author` VARCHAR(40) NOT NULL,
   `submission_date` DATE,
   PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

删除数据表

1
DROP TABLE <表名>

检索数据

SELECT 语句

检索列

1
SELECT 1,列2 FROM <表名>

检索所有列

1
SELECT * FROM <表名>

* 是通配符,可以匹配多个名字

如果后面有多个表,则结果是表相乘

1
SELECT * FROM <1,列2>

检索不同行

如果要删除列中的重复行,可以用:

1
SELECT DISTINCT 1,列2 FROM <表名>

这要就会删去 “列1,列2” 这两个属性相同的重复行

DISTINCE 只能放在列名的前面,并且要应用于列出的所有列。

限定表名

如果列在多个表内,则在同时检索这两个表时,需要在列名前面加上限制表名:

1
SELECT . FROM 1,表2

LIKE 语句

如果要搜索特定特征的文本,可以使用 LIKE 语句:

1
SELECT  FROM  WHERE  LIKE "匹配文本"

注:特殊的是,如果匹配文本中没有统配符,则即使列中的值完全等于匹配文本,也不会有输出

通配符

MySQL 中有三种通配符:

  1. % 匹配 0~n 个任意字符
  2. _ 匹配 1 个任意字符

正则表达式

正则表达式和 LIKE 语句相类似:

1
SELECT  FROM  WHERE  REGEXP "匹配模式"

排序数据

ORDER BY 语句

SELECT ... FROM ... WHERE ... 后面加上 ORDER BY,可以将数据按一定顺序输出:

1
SELECT  FROM  WHERE 判断语句 ORDER BY 

多个列排序

排序方向

过滤数据

WHERE 语句

使用 SELECT 会检索所有行,如果要提取特定的行,可以用 WHERE

1
SELECT 1,列2 FROM  WHERE 判断语句

操作符

操作符说明
=等于
<> 或 !=不等于
<,<= ,>,>=小于,小于或等于,大于,大于或等于
BETWEEN value1 AND value2在指定值之间(包括两端)
IS NULL是空值

逻辑符

操作符说明
AND
OR
NOT

注:在 MySQL 中,NOT 只能对 IN, BETWEEN, EXISTS 取反,但在 SQL Server 中,NOT 可以对各种条件取反。

示例:

1
SELECT  FROM  WHERE 条件1 AND 条件2
1
SELECT  FROM  WHERE 条件1 OR 条件2
1
SELECT  FROM  WHERE NOT IN/BETWEEN/EXISTS

优先级:(和大多数 SQL 语言一样)在 MySQL 中,AND 的优先级大于 OR 的优先级。可以通过括号改变优先级。

汇总数据

用于计算数据的和、平均值等。

聚集函数

聚集函数作用在一个 行组 上,计算并返回一个值,包括:

函数说明
AVG( )平均值
COUNT( )行数
MAX( )最大值
MIN( )最小值
SUM( )

注:

  1. AVG( ) 只能用于单列,要用于多列,要用多个 AVG( )
  2. COUNT(*) 会包括空行,但 COUNT(column) 则不包括空行
  3. MAX( ) 会返回数字或日期的最大值,对于文本,返回最后一行。

示例:

1
SELECT AVG() AS 别名 FROM  #给结果提供一个别名,方便使用
1
SELECT COUNT(*) AS 别名 FROM 

插入数据

插入行

插入可以使用 INSERT 语句,它要求指定表明和插入的行的值:

1
2
INSERT INTO sustomers
VALUES(NULL, 'Todd', 'CN');

INSERT 语句不会产生输出,如果列没有值,则要使用 NULL 值,上面的值的顺序取决于表中定义的列的顺序,因此这种 INSERT 语句很不安全,推荐使用更安全的方法:

1
2
INSERT INTO customers(cust_address, cust_name, cust_conutry)
VALUES(NULL, 'Todd', 'CN')

这样 VALUES 中的值的顺序对应前面的列名顺序。

但无论上面哪种语法,都必须给出 VALUES 的正确数目,对于某些列,如果满足以下一个条件,则可以省略:

  1. 该列允许为空值
  2. 在表定义中给出默认值

如果要插入多个行,只需将每组值用圆括号括起来,用逗号分隔,统一放在 VALUES 后面:

1
2
INSERT INTO customers(cust_address, cust_name, cust_conutry)
VALUES(NULL, 'Todd', 'CN'), (NULL, 'Andy', 'USA');

复制行

我们可以用 SELECT 代替 VALUES,将其他表的行复制到选中的表:

1
2
INSERT INTO customers(cust_address, cust_name, cust_conutry)
SELECT cust_address, cust_name, cust_conutry FROM custnew;

使用游标

前面说过,SELECT 操作返回的是结果的集合,如果要选中其中一行,则需要用游标(相当于鼠标点击),游标可以在数据中滚动,这个主要用于于交互式应用。

使用游标的步骤:

  1. 声明游标
  2. 打开游标
  3. 读取游标
  4. 关闭游标

声明游标

语句如下:

1
2
3
DECLARE [游标名] CURSOR
FOR
SELECT ...;

打开/关闭游标

1
OPEN [游标名];
1
CLOSE [游标名];

使用游标

游标打开后,位于 -1 行,即位于第一条数据的前面。我们用 FETCH 语句读取下一行:

1
FETCH [游标名] FROM [] INTO [变量];