第四章 SQL与数据库的基本操作
数据查询
- 数据查询是SQL语言的核心功能‘
SELECT 语句
常用语法格式:
SELECT 列名称 FROM 表名称;
列的选择与指定
选择指定的列
选择一个或多个表中的某个或某些列作为 SELECT 语句的查询列。
定义并使用列的别名
语法格式如下:
column_name[AS]column_alias;
替换查询结果集中的数据
需要用到 CASE 表达式,语法格式如下:
CASC
WHEN 条件1 THEN 表达式1
WHEN 条件2 THEN 表达式2
...
ELSE 表达式
END[AS] column_alias;
计算列值
方法是将 SELECT 语句的语法项指定为对应列参与计算的表达
式。
聚合函数
- SELECT 语句的语法项也可以指定为聚合函数。
- 聚合函数通常是数据库系统中一类系统内置函数,常用于对一组值进行计算,然后返回单个值。它通常与 GROUP BY 子句一起使用。
FROM 子句与多表连接查询
- SELECT 子句的查询对象是由 FROM 子句指定的,可根据用户的查询需求实现单表或多表查询。
- 若一个查询同时涉及两个或两个以上的表,则称之为多表连接查询,也称多表查询或连接查询。
- 为了减少数据的冗余,以及增强数据库的稳定性和灵活性,在表与表之间通过**设置“键”**的方式来保持多表之间的关联关系。
- 多表连接查询式关系数据库中最主要的查询。
- 其连接方式主要包括交叉连接、内连接和外连接。
交叉连接
又称笛卡尔积。
内连接
- 是一种最常用的连接类型,它是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行之后的交叉连接.
- 通过 FROM 子句中使用关键字**“INNER JOIN”连接两张表**,语法格式如下:
SELECT some_columns
FROM tablel
INNER JOIN
table2
ON some conditions;
- 等值连接
在 FROM 子句中使用关键字“INNER JOIN”或“JOIN”连接两张表时,如若在ON 子句的连接条件中使用运算符“=”(即等号),即进行相等性测试,则此连接方式称为等值连接,也称为相等连接。
在等值连接额条件设置中会包含一个主键和一个外键。 - 非等值连接
在 FROM 子句中使用关键字“INNER JOIN”或“JOIN”连接两张表时,如若在ON 子句的连接条件中使用除运算符“=”之外的其他比较运算符,即进行不相等性测试,则此连接方式称为非等值连接,也称为不等连接。 - 自连接
在 FROM 子句中使用关键字“INNER JOIN”或“JOIN”连接两张表时,可以将一个表与它自身进行连接,这种连接方式称为自连接。
外连接
外连接是首先将连接的两张表分为基表和参考表,然后再以基表为依据返回满足和不满足条件的记录。
- 左外连接
也称左连接。区别在 FROM 子句中使用关键字“LEFT OUTER JOIN”或关键字“LEFT JOIN” 来连接两张表。 - 右外连接
也称右连接。区别在 FROM 子句中使用关键字**“RIGHT OUTER JOIN”或关键字“RIGHT JOIN”**来连接两张表。
WHERE 子句与条件查询
使用 WHERE 子句指定过滤条件,方法如下:
比较运算
用于比较两个表达式的值。 比较运算符如下表所示:
判定范围
关键字是**“BETWEEN”和“IN**”两个。
- BETWEEN…AND
使用语法格式如下:
expression [NOT] BETWEEN expression1 AND expression2;
- IN
可以指定一个值的枚举表,语法格式如下:
expression IN(expression[,…n]
判定空值
用关键字“**IS NULL”**来实现,语法格式如下:
expression IS[NOT] NULL
子查询
MySQL 中,区分如下四类子查询:
- 表子查询,子查询返回的结果集是一个表。
- 行子查询,子查询返回的结果集是带有一个或多个值的一行数据。
- 列子查询,子查询返回的结果集是一列数据,该列可以有一行或多行,但每行只有一个值。
- 标量子查询, 即子查询返回的结果集仅仅是一个值。
- 子查询与关键字**“IN”“EXIST”** 和比较运算符结合使用。
- 结合**关键字“IN”**使用的子查询
语法格式如下:
expression [NOT] IN(subquery)
- 结合比较运算符使用的子查询
语法格式如下:
expression {=|<=|>|>=|<=>|<>|!=}{ALL|SOME|ANY}(subquery)
- 结合关键字“EXIST”使用的子查询
语法格式如下:
EXEIST(subquery)
GROUP BY 子句与分组数据
允许使用 GROUP BY 子句,将结果集中的数据行 genuine 选择列的值进行逻辑分组,以便能汇总表内容的子集,即实现对每个组的聚集计算。
语法格式如下:
GROUP BY{col_name|expr|position}[ASC|DESC],…[WITH ROLLUP]
对于 GROUP BY 子句的使用,需要注意以下几点:
- GROUP BY 子句可以包含任意数目的列,使得其可对分组进行嵌套,为数据分组提供更加细致的控制。
- 如果在 GROUP BY 子句中嵌套了分组,那么将按 GROUP BY 子句中列的排列顺序的逆序方式依次进行汇总,并将在最后规定的分组上进行一个完全汇总。
- GROUP BY 子句中列出的每个列都必须是检索列或有效的表达式,但不能是聚合函数,
- 除聚合函数之外, SELECT 语句中的每个列都必须在 GROUP BY 子句中给出。
- 如果用于分组的列中含有 NULL 值,则 NULL 将作为一个单独的分组返回;
如果该列中存在多个 NULL 值,则将这些 NULL 值所在的行分为一组。
HAVING 子句
语法格式如下:
HAVING where_condition
where_condition 用于指定过滤条件。
HAVING 子句与 WHERE 子句非常相似, HAVING 子句支持 WHERE 子句中所有的操作符和句法,但两者之间仍存在以下几点差异:
- WHERE 子句主要用于过滤加粗样式数据行,而 HAVING 子句主要用于过滤分组,即HAVING 子句可基于分组的聚合值而不是特定行的值来过滤数据。
- HAVING 子句中的条件可以包含聚合函数,而 WHERE 子句中则不可以。
- WHERE 子句会在数据分组前进行过滤, HAVING 子句则会在数据分组后进行过滤。 因而, WHERE 子句排除的行不包含在分组中,这就会可能改变计算值,从而影响 HAVING 子句基于这些值过滤掉的分组。
ORDER BY 子句
语法格式如下:
ORDER BY {col_name|expr|posion}[ASC|DESC],…
LIMIT 子句
使用 LIMIT 子句来限制被 SELECT 语句返回的行数。
使用语法格式如下:
LIMIT{[offset,]row_count OFFSET offset}
第六节 视图
- 外模式对应到数据库中的概念就是视图。
- 视图是数据库中的一个对象,它是数据库管理系统提供给用户的以多种角度观察数据库中数据的一种重要机制。
- 视图仍不同于数据库中真实存在的基本表,它们存在以下区别:
- 视图不是数据库中真实的表,而是一张虚拟表.
- 视图的内容是由存储在数据库中进行查询操作的 SQL 语句来定义的,它的列数据与行数据均来自于定义视图的查询所引用的真实表,并且这些数据是在引用视图时动态生成的。
3.视图不是以数据集的形式存储在数据库中,它所对应的数据实际上是存储在视图所引用的真实表中。
4.视图是用来查看存储在别处的数据的一种虚拟表,而其自身并不存储数据。
使用视图有如下优点;
- 集中分散数据;
- 简化查询语句;
- 重用 SQL 语句:保护数据安全;共享所需数据;更改数据格式。
创建视图
用 CREATEVIEW 语句来创建视图,语法格式如下:
CREATEVIEW view_name [(column_list)]
AS selest_statement
[WTTH[CASCADED|LOCAL]CHECK OPTION]
删除视图
用 DROP VIEW 语句来删除视图,语法格式如下:
DROP VIEW[IF EXISTS]
view_name[,view_name]…
[RESTRICT|CASCADE]
修改视图定义
用 ALTER VIEW 语句来对已有视图的定义进行修改,语法格式如下:
ALTERVIEW view_name[(column_list)]
AS select_statement
[WITH[CASCADED|LOCAL]CHECK OPTION]
查看视图定义
用 SHOW CREATE VIEW 语句来查看已有视图的定义,语法格式如下:
SHOW CREATE VIEW view_name
更新视图数据
视图是一个虚拟表,通过插入、修改和删除等操作方式来更新视图中的数据,实质上更新视图所引用的基本表中的数据。 对于更新的视图,需要该视图中的行和基本表中的行之间具有一对一的关系。
使用 INSERT 语句通过视图向基本表插入数据
例如在数据库 mysql_test 中,向视图 customers_view 插入一条记录:
(909,‘周明’,’M’,’武汉市’,‘洪山区’)。
输入如下语句实现:
mysql>INSERT INTO mysql_test.customers_view
-> VALUES(909,‘周明’,’M’,’武汉市’,‘洪山区’) ;
Query OK,I row affected(0.20sec)
使用 UPDATE 语句通过视图修改基本表的数据
例如将视图 customers_view 中所有客户的 cust_address 列更新为“上海市”。
输入如下语句实现:
mysql>UPDATE mysql_test.customers_view
-> SET cust_address=‘上海市’;
Query OK,5rows affected(0.09sec)
Rows matched:5 Changed:5 Warnings:0
使用 DELETE 语句通过视图删除基本表的数据
例如:删除“周明”信息,语句如下:
mysql>DELETE FROM mysql_test.customers_view
-> WHERE cust_name=‘周明’;
Query OK,1row affected(0.08sec)
对于依赖多个基本表的视图,也是不能使用 DELETE 语句的。
查询视图数据
视图用于查询检索,主要体现的应用:利用视图简化复杂的表连接;使用视图重新格式化检索出新的数据;使用视图过滤不想要的数据。