2.3数据查询
2.3.1基本查询
(1)SELECT子句的规定
SELECT [ ALL | DISTINCT] * | <列名或列名表达式序列>
说明:
DISTINCT选项表示输出无重复结果的记录;
ALL选项是默认的,表示输出所有记录,包括重复记录
* 表示选取表中所有的字段
(2)列起别名的操作
原字段名 [AS] 列别名
(3)使用WHERE子句指定查询条件
运算符名称 | 符号及格式 | 说 明 |
算术比较判断 | <表达式1> θ <表达式2> θ代表的符号有:<、<=、>、>=、<>或!=、= | 比较两个表达式的值 |
逻辑比较判断 | <比较表达式1> θ <比较表达式2> θ代表的符号按其优先级由高到低的顺序为: NOT、AND、OR | 两个比较表达式进行非、与、或的运算 |
之间判断 | <表达式> [NOT] BETWEEN <值1> AND <值2> | 搜索(不)在给定范围内的数据 |
字符串模糊判断 | <字符串> [NOT] LIKE <匹配模式> | 查找(不)包含给定模式的值 |
空值判断 | <表达式> IS [NOT] NULL | 判断某值是否为空值 |
之内判断 | <表达式> [NOT] IN (<集合>) | 判断表达式的值是否在集合内 |
(4)使用ORDER BY子句对查询结果排序
当SELECT语句中同时包含多个子句,如WHERE、GROUP BY、HAVING、ORDER BY,ORDER BY 子句必须是最后一个子句
可以使用列的别名、列的位置进行排序
2.3.2分组查询
(1)聚合函数
函 数 | 说 明 |
COUNT(*) COUNT(<列名>) | 计算记录的个数 对一列中的值计算个数 |
SUM(<列名>) | 求某一列值的总和 |
AVG(<列名>) | 求某一列值的平均值 |
MAX(<列名>) | 求一列值的最大值 |
MIN(<列名>) | 求一列值的最小值 |
注意以下几点:
聚合函数只能出现在所查询的列、ORDER BY子句、HAVING子句中,而不能出现在WHERE子句、GROUP BY子句中
除了COUNT(*)之外,其他聚合函数(包括COUNT(<列名>))都忽略对列值为NULL值的统计
(2)使用GROUP BY子句
(3)使用HAVING子句
2.3.3连接查询
连接查询时的注意事项:
① 要连接的表都要放在FROM子句中,表名之间用逗号分开,比如FROM detp,emp。
② 为了书写方便,可以为表起别名,表的别名在FROM子句中定义,别名放在表名之后,它们之间用空格隔开。注意,别名一经定义,在整个查询语句中就只能使用表的别名而不能再使用表名。
③ 连接的条件放在WHERE子句中,比如WHERE emp.deptno=dept.deptno。
④ 如果多个表中有相同列名的列时,在使用这些列时,必须在这些列的前面冠以表名来区别,表名和列名之间用句号隔开。比如SELECT emp.detpno
(1)相等连接
(2)自身连接
(3)不等连接
(4)左外连接
(5)右外连接
2.3.4子查询
子查询的执行步骤如下:
首先取外层查询中表的第一个记录,根据它与内层查询相关的列值进行内层查询的处理(如WHERE子句的处理),若处理结果为真,则取此记录放入结果集
然后再取外层表的下一个记录进行内层查询的处理
重复这一过程,直至外层查询中表的全部记录处理完为止
(1)返回单值的子查询
(2)返回多值的子查询
在WHERE子句中使用多值子查询时,必须使用多值比较运算符:[NOT] IN、[NOT] EXISTS、ANY、ALL,其中ALL、ANY必须与比较运算符结合使用
2.3.5合并查询结果
UNION的语法格式为:
SELECT 语句1
UNION [ALL]
SELECT 语句2
2.4数据的维护
2.4.2插入数据
(1) INSERT语句
INSERT INTO 表名 [ (列名1[,列名2……]) ]
VALUES (值1[,值2……])
[,(值1[,值2……]),……,(值1[,值2……])]
(2)利用子查询向表中插入数据
INSERT INTO 表名 [ (列名1[,列名2……]) ]
SELECT语句
2.4.2更新数据
UPDATE语句
UPDATE 表名
SET 列名=值[,列名=值,……]
[WHERE <条件>]
MySQL运行在SAFE_UPDATES模式下,该模式会导致非主键条件下无法执行UPDATEA或DELETE命令。需要执行命令 SET SQL_SAFE_UPDATES=0; 修改数据库模式
2.4.3删除数据
DELETE语句
DELETE [ FROM ] 表名
[WHERE <条件>]
2.5索引和视图
2.5.1索引的创建与删除
(1)创建索引
CREATE [UNIQUE] INDEX 索引名
ON 表名(列名[,列名]……)
(2)查看索引
SHOW INDEX FROM <表名>;
(3)删除索引
DROP INDEX 索引名 ON 表名;
2.5.2视图
(1)创建视图
CREATE [OR REPLACE] VIEW <视图名> [(<别名>[,<别名>]…)]
AS
<SELECT语句>
[WITH CHECK OPTION ]
(2)修改视图
CREATE OR REPLACE VIEW;
用创建视图的语句将原来的视图覆盖掉
使用ALTER语句是MySQL提供的另外一种修改视图的方法:
ALTER VIEW 视图名[(别名[,别名]…)]
AS
SELECT语句
[WITH CHECK OPTION];
(3)删除视图
DROP VIEW 视图名[,视图名,…];
(4)使用视图进行DML操作
① 数据是仅从一个表中提取的
② 不包含函数和分组数据
③ 可以通过该视图进行DML操作
<2>复杂视图:
① 数据是从多个表中提取的
② 包含函数和分组数据
③ 不一定能够通过该视图进行DML操作
<3>通过视图进行DML操作的规则:
① 可以在简单视图上执行DML操作
② 如果在一个视图中包含了分组函数,或GROUP BY子句,或DISTINCT关键字,则不能通过该视图进行DELETE、UPDATE、INSERT操作
③ 如果在一个视图中包含了由表达式组成的列,则不能通过该视图进行UPDATE、INSERT操作
④ 如果在一个视图中没有包含引用表中那些不能为空的列,则不能通过该视图进行INSERT操作