SQL的简介
介绍
最近选修了一门 “数据库技术应用”,遂入门了数据库。下面大部分的内容摘自《MySQL 必知必会》,这本书很好,推荐大家去看看,我只讲部分重点内容:
- 创建数据库
- 检索数据
- 排序检索数据
- 过滤数据
- 正则表达式
- 插入数据
我是在 Linux 上安装 MySQL 来学习的,所以下面都是命令行的形式。
创建数据库
CREATE DATEBASE <数据库名>;
创建一个数据库。
CREATE DATABASE IF NOT EXISTS <数据库名> DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
创建数据库,该命令的作用:
- 如果数据库不存在则创建,存在则不创建。
- 创建RUNOOB数据库,并设定编码集为utf8
删除数据库
DROP DATABASE <数据库名>;
删除数据库。
选择数据库
USE <数据库名>;
选择数据库(即打开数据库)
创建数据表
CREATE TABLE <表名> (column_name column_type, ...);
创建数据表,括号里面可以指定多个列名(必需)、数据类型(必需)和约束条件,还可以指定主值、处理引擎、字符集等。比如:
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;
删除数据表
DROP TABLE <表名>
检索数据
SELECT 语句
检索列
SELECT 列1,列2 FROM <表名>
检索所有列
SELECT * FROM <表名>
*
是通配符,可以匹配多个名字
如果后面有多个表,则结果是表相乘
SELECT * FROM <列1,列2>
检索不同行
如果要删除列中的重复行,可以用:
SELECT DISTINCT 列1,列2 FROM <表名>
这要就会删去 “列1,列2” 这两个属性相同的重复行
DISTINCE
只能放在列名的前面,并且要应用于列出的所有列。
限定表名
如果列在多个表内,则在同时检索这两个表时,需要在列名前面加上限制表名:
SELECT 表.列 FROM 表1,表2
LIKE 语句
如果要搜索特定特征的文本,可以使用 LIKE 语句:
SELECT 列 FROM 表 WHERE 列 LIKE "匹配文本"
注:特殊的是,如果匹配文本中没有统配符,则即使列中的值完全等于匹配文本,也不会有输出
通配符
MySQL 中有三种通配符:
%
匹配 0~n 个任意字符_
匹配 1 个任意字符
正则表达式
正则表达式和 LIKE
语句相类似:
SELECT 列 FROM 表 WHERE 列 REGEXP "匹配模式"
排序数据
ORDER BY 语句
在 SELECT ... FROM ... WHERE ...
后面加上 ORDER BY
,可以将数据按一定顺序输出:
SELECT 列 FROM 表 WHERE 判断语句 ORDER BY 列
多个列排序
排序方向
###
过滤数据
WHERE 语句
使用 SELECT
会检索所有行,如果要提取特定的行,可以用 WHERE
:
SELECT 列1,列2 FROM 表 WHERE 判断语句
操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> 或 != | 不等于 |
<,<= ,>,>= | 小于,小于或等于,大于,大于或等于 |
BETWEEN value1 AND value2 | 在指定值之间(包括两端) |
IS NULL | 是空值 |
逻辑符
操作符 | 说明 |
---|---|
AND | 与 |
OR | 或 |
NOT | 非 |
注:在 MySQL 中,NOT 只能对 IN, BETWEEN, EXISTS 取反,但在 SQL Server 中,NOT 可以对各种条件取反。
示例:
SELECT 列 FROM 表 WHERE 条件1 AND 条件2
1 |
|
SELECT 列 FROM 表 WHERE NOT IN/BETWEEN/EXISTS
优先级:(和大多数 SQL 语言一样)在 MySQL 中,AND 的优先级大于 OR 的优先级。可以通过括号改变优先级。
汇总数据
用于计算数据的和、平均值等。
聚集函数
聚集函数作用在一个 行组 上,计算并返回一个值,包括:
函数 | 说明 |
---|---|
AVG( ) | 平均值 |
COUNT( ) | 行数 |
MAX( ) | 最大值 |
MIN( ) | 最小值 |
SUM( ) | 和 |
注:
AVG( )
只能用于单列,要用于多列,要用多个AVG( )
COUNT(*)
会包括空行,但COUNT(column)
则不包括空行MAX( )
会返回数字或日期的最大值,对于文本,返回最后一行。
示例:
SELECT AVG(列) AS 别名 FROM 表 #给结果提供一个别名,方便使用
SELECT COUNT(*) AS 别名 FROM 表
插入数据
插入行
插入可以使用 INSERT
语句,它要求指定表明和插入的行的值:
INSERT INTO sustomers
VALUES(NULL, 'Todd', 'CN');
INSERT
语句不会产生输出,如果列没有值,则要使用 NULL 值,上面的值的顺序取决于表中定义的列的顺序,因此这种 INSERT
语句很不安全,推荐使用更安全的方法:
INSERT INTO customers(cust_address, cust_name, cust_conutry)
VALUES(NULL, 'Todd', 'CN')
这样 VALUES 中的值的顺序对应前面的列名顺序。
但无论上面哪种语法,都必须给出 VALUES 的正确数目,对于某些列,如果满足以下一个条件,则可以省略:
- 该列允许为空值
- 在表定义中给出默认值
如果要插入多个行,只需将每组值用圆括号括起来,用逗号分隔,统一放在 VALUES 后面:
INSERT INTO customers(cust_address, cust_name, cust_conutry)
VALUES(NULL, 'Todd', 'CN'), (NULL, 'Andy', 'USA');
复制行
我们可以用 SELECT 代替 VALUES,将其他表的行复制到选中的表:
INSERT INTO customers(cust_address, cust_name, cust_conutry)
SELECT cust_address, cust_name, cust_conutry FROM custnew;
使用游标
前面说过,SELECT
操作返回的是结果的集合,如果要选中其中一行,则需要用游标(相当于鼠标点击),游标可以在数据中滚动,这个主要用于于交互式应用。
使用游标的步骤:
- 声明游标
- 打开游标
- 读取游标
- 关闭游标
声明游标
语句如下:
DECLARE [游标名] CURSOR
FOR
SELECT ...;
打开/关闭游标
OPEN [游标名];
CLOSE [游标名];
使用游标
游标打开后,位于 -1 行,即位于第一条数据的前面。我们用 FETCH
语句读取下一行:
FETCH [游标名] FROM [表] INTO [变量];