Part02_SQL对数据的基本操作
------------------------------------------------------------------------------------
内容大纲:
1.查询数据
2.插入数据
3.更新数据
4.删除数据
------------------------------------------------------------------------------------
正文:
------------------------------- [ 我是每章的分界线 ] -------------------------------
00.第10章 查询数据
--------------> 我是小节的小小分界线 <--------------(单表查询)
01.基本查询语句
SELECT 属性列表
FROM 表名和视图列表
[WHERE 条件表达式1]
[GROUP BY 属性名1 [HAVING 条件表达式2]]
[ORDER BY 属性名2 [ASC|DESC]]
02.使用“*”查询所有的字段
SELECT * FROM 表名;
03.查询条件(用在WHERE那里)
比较: =、<、<=、>、>=、!=、<>、!>、!=
指定范围:BETWEEN AND、NOT BETWEEN AND
指定集合:IN、NOT IN
匹配字符:LIKE、NOT LIKE
是否为空值:IS NULL、IS NOT NULL
多个查询条件:AND、OR
04.带IN关键字的查询
1.概念:判断某个字段是否在指定的集合中
2.语法:字段[NOT] IN (元素1, 元素2, 元素3)
05.带BETWEEN AND的范围查询
1.概念:判读某个字段的值是否在指定的范围内。
2.语法:(字段) [NOT] BETWEEN 取值1 AND 取值2
06.带LIKE的字符串匹配
1.概念:匹配字符串是否相等。
2.语法:(字段)[NOT] LIKE '字符串'
3.附注:字符串可以包含“%”或“_”,“%”代表任意长度的字符串,“_”表示任意的单个字符。
如:“%”中的b%k可代表 bk、buk、book、break...
“_”中的b_k代表 bok、buk、bak...
07.使查询结果不重复: SELECT DISTINCT 属性名
08.分组查询
0.语法:
GROUP BY 属性名 [HAVING 条件表达式][WITH ROLLUP]
1.单独使用GROUP BY关键字来分组
SELECT 属性列表 FROM 表名 ORDER BY 属性名2 [ASC|DESC]
2.GROUP BY 关键字与GROUP_CONCAT()函数一起用:以分组形式显示字段值
SELECT 属性列表, GROUP_CONCAT(字段) FROM 表名 GROUP BY 属性名2 [ASC|DESC]
3.GROUP BY 关键字与集合函数一起使用
SELECT 属性列表, 集合函数 FROM 表名 GROUP BY 属性名 [HAVING 条件表达式][WITH ROLLUP];
09.用LIMIT限制查询结果的数量
1.语法1:LIMIT 记录数;
2.语法2:LIMIT 初始记录,记录数; // 从下标“0”开始记数。
--------------> 我是小节的小小分界线 <--------------(使用集合函数查询)
10.使用集合函数
0.语法: SELECT 属性列表,集合函数 FROM ...
1.COUNT():统计记录的条数。
2.SUM():求和函数。(只能计算数值类型的字段)
3.AVG():求平均值。
4.MAX():求最大值的函数。(可以计算数值和字符和字符串的最大值。)
5.MIN():求最小值的函数。
--------------> 我是小节的小小分界线 <--------------(连接查询)
11.连接查询的概念
连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据。
当不同的表中存在表示相同意义的字段时,可以通过该字段来连接这几个表。
12.内连接查询
1.概念:当两个或多个表中存在表示相同意义的字段时,可能通过该字段来连接这两个表;
当该字段的值相等时,就查询出该记录。
2.例:现在需要查询出employee表和department表中具有相同id的人的信息,用一张表输出结果。
SELECT num, name, employee.d_id, age, sex, d_name, function
FROM employee,department
WHERE employee.d_id = department.d_id; // 这里的d_id是两表共有的字段。
13.外连接查询
0.概念:指定字段进行查询连接两个或多个表,无论该字段取值是否相等,具有该字段的记录都能被查询出。
1.语法:SELECT 属性列表 FROM 表名1 LEFT|RIGHT JOIN 表名2 ON 表名1.属性名 = 表名2.属性2
2.左连接查询:可以查询出“表名1”所指的表中指定字段的所有的记录。
3.右连接查询:可以查询出“表名2”所指的表中指定字段的所有的记录。
--------------> 我是小节的小小分界线 <--------------(子查询)
14.子查询的概念
子查询是将一个查询语句嵌套在另一个查询语句中。内层查询语句的查询结果,可以为外层查询语句提供查询条件。
15.带IN关键字的子查询例子:
SELECT * FROM employee WHERE d_id IN (SELECT d_id FROM department);
16.带比较运算符的子查询例子:
SELECT name, score FROM computer_stu WHERE score >= (SELECT score FROM scholarship WHERE level=1);
17.带EXISTS关键字的子查询
0.概念:EXISTS关键字表示存在。
1.使用:使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。
2.作用:只有当内层语句返回true值时,外层查询语句才进行查询。
3.例子: SELECT * FROM employee WHERE EXISTS(SELECT d_name FROM department WHERE d_id=1005);
18.带ANY关键字的子查询(与带ALL关键字的用法一样,ALL关键字这里不做介绍)
0.概念:ANY关键字表示满足其中任一条件。
1.使用:ANY关键字通常与比较运算符一起使用。
使用ANY关键字时,只要满足内层查询语句返回的结果中的任何一个,就可以通过该条件来执行外层查询语句。
2.例:SELECT * FROM computer_stu WHERE score >= ANY(SELECT score FROM scholarship);
--------------> 我是小节的小小分界线 <--------------(合并查询结果)
19.合并查询结果的概念:将多个SELECT语句的查询结果合并到一起。
20.合并查询语句的语法:
SELECT 语句1
UNION | UNION ALL
SELECT 语句2
UNION | UNION ALL
SELECT 语句n;
21.UNION与UNION ALL的异同。
相同点:UNION关键字和UNION ALL关键字都可以合并查询结果。
不同点:UNION关键字合并查询结果时,需要将相同的记录消除掉。
而UNION ALL则相反,它不会消除掉相同的记录,而是所有的记录合并到一起。
--------------> 我是小节的小小分界线 <--------------(合并查询结果)
22.为表取别名
语法:表名 表的别名
作用:通过这种方式,“表的别名”就能在这次查询中代替“表名”了。
例子:SELECT * FROM department d WHERE d.d_id=1001; // 这里使用了d作为department的别名。
23.为字段取别名
语法:属性名 [AS] 别名
例子:SELECT d_id AS department_id, d_name AS department_name FROM department;
--------------> 我是小节的小小分界线 <--------------(使用正则表达式查询)
24.正则表达式的理解
正则表达式是用某种模式去匹配一类字符串的一个方式。
25.正则表达式的基本形式
属性名 REGEXP '匹配方式'
26.正则表达式的模式字符
^ 匹配字符串开始的部分 '^X'
$ 匹配字符串结构的部分 'X$'
. 代表字符串中的任意一个字符,包括回车和换行 '^X..X&'(两个任意字符)
[字符集合] 匹配“字符集合”中的任何一个字符。 (相当于or)
[^字符集合] 匹配除了“字符集合”外的任何一个字符。
S1 | S2 | S3 匹配S1、S2和S3中任意一个字符串
* 代表多个该符号之前的字符,包括0和1个
+ 代表多个该符号之前的字符,包括1个
字符串{N} 字符串出现N次
字符串{M, N} 字符串出现至少M次,最多N次
------------------------------- [ 我是每章的分界线 ] -------------------------------
00.第11章 插入、更新与删除数据
01.为表的所有的字段插入数据
1.不指定具体的字段名:INSERT INTO 表名 VALUES(值1, 值2, ..., 值n);
2.列出所有的字段:INSERT INTO 表名(属性1, 属性2, ..., 属性n) VALUES(值1, 值2,..., 值n);
02.为表的指定字段插入数据
注:如字段没赋值,数据库系统会为其插入默认值,若无设默认值,而且是非空,就必须为其赋值。
INSERT INTO 表名(属性1, 属性2, ..., 属性m) VALUES(值1, 值2, ..., 值m);
03.同时插入多条记录
INSERT INTO 表名(属性列表) VALUES(取值列表1), (取值列表2), ...,(取值列表n);
04.将查询结果插入到表中
INSERT INTO 表名1(属性列表1)
SELECT 属性列表2 FROM 表名2 WHERE 条件表达式;
05.更新数据
UPDATE 表名
SET 属性名1=取值1, 属性名2=取值2,
...,
属性名n=取值n
WHERE 条件表达式; // 这一句决定了要改哪行的数据
06.删除数据
DELETE FROM 表名 [WHERE 条件表达式];