第十三章 创建高级联结
1、别名:缩短SQL语句,允许在一条Select语句中多次使用相同的表
SELECT A.Name, A.Maths, A.English FROM transcript AS A INNER JOIN student_id As B ON A.Name = B.Name;
2、Oracle数据库中没有AS关键字,直接在表名或者列名后加上别名即可
SELECT A.Name, A.Maths, A.English FROM transcript A INNER JOIN student_id B ON A.Name = B.Name;
3、联结类型:自联结、自然联结、外联结
4、自联结:针对相同的表进行的连接被称为“自联结”
SELECT A.Name AS name1, B.Name AS name2 FROM transcript AS A JOIN transcript AS B ON A.Name == B.Name
5、外联结
外联结分为主表和从表,在内联结里可以将两个表的数据都列出来,但是外联结会把主表的数据都列出来,如果从表中没有对应的数据,那么输出就会设置为null。
SELECT transcript.English, transcript.Name FROM transcript LEFT JOIN student_id ON student_id.Name = transcript.Name
6、不同的数据库管理器不是支持所有的外联结类型,例如SQLite支持左联结,但是不支持右联结类型,MariaDB、MySQL 和 SQLite 不支持 FULL OUTER JOIN 语法
7、外联结的基本形式:左外联结和右外联结。他们之间的唯一的差别是所关联表的顺序。调整FROM或者WHERE子句中表的顺序,左外联结可以转换为右外联结。这两种联结方式可以互换使用。
第十四章 组合查询
1、使用UNION操作符将多条SELECT语句组成一个结果集
2、
SELECT transcript.Maths FROM transcript WHERE transcript.Name = 'Lily'
UNION
SELECT transcript.Maths FROM transcript WHERE transcript.Name in ('Tom', 'Ben')
SELECTs to the left and right of UNION do not have the same number of result columns
3、UNION可以进行多条组合,具体条数SQL里没有限制,要看具体的DBMS
4、多条UNION和多个where子句的性能没有明确的区别,要在具体的DBMS和查询条件去对比使用,但是UNION ALL是WHERE无法取代的,如果确实需要每个条件的匹配行全部出现(包括重复行), 就必须使用 UNION ALL,而不是 WHERE
5、UNION规则:
a.UNION 必须由两条或两条以上的 SELECT 语句组成,语句之间用关键字 UNION 分隔(因此,如果组合四条 SELECT 语句,将要使用三个 UNION 关键字);
b.UNION 中的每个查询必须包含相同的列、表达式或聚集函数(不过, 各个列不需要以相同的次序列出);
c.列数据类型必须兼容:类型不必完全相同,但必须是 DBMS 可以隐含 转换的类型(例如,不同的数值类型或不同的日期类型)
第十五章 插入数据
INSERT INTO transcript VALUES('Tony', 99, 97); //按照字段顺序插入
INSERT INTO transcript (Name, Maths, English) VALUES ('Jim', 88, 78);//更推荐方式,列出表字段名称,并按照其顺序插入
3、插入行的一部分
INSERT INTO transcript (Name, Maths) VALUES ('Fox', 79);
这里要注意,未插入的字段在要确保不是非空字段或者索引字段,否则这些字段在INSERT不插入时,SQL语句会报错
INSERT INTO transcript (Name) SELECT Name from student_id WHERE No = 4;
INSERT 和SELECT的组合可以一次性插入多条符合查询到条件的语句。
5、表的内容复制创建
CREATE TABLE transcript_bak AS SELECT * FROM transcript;
第十六章 更新和删除数据
UPDATE transcript SET Maths = 99 WHERE Name = 'Tom';
3、Update可以结合SELECT查询子句使用
4、删除数据方式:删除表中所有行;删除表中的特定行
5、删除指定行:
DELETE FROM transcript WHERE Name = 'Ball'
两个要素:1、表名transcript;2:条件Name = 'Ball'
6、如果在更新和删除中没有WHERE 条件,就代表针对全表的记录做操作
7、下面是许多 SQL 程序员使用 UPDATE 或 DELETE 时所遵循的重要原则。
a.除非确实打算更新和删除每一行,否则绝对不要使用不带 WHERE 子句 的 UPDATE 或 DELETE 语句。
b.保证每个表都有主键,尽可能 像 WHERE 子句那样使用它(可以指定各主键、多个值或值的范围)。
c. 在 UPDATE 或 DELETE 语句使用 WHERE 子句前,应该先用 SELECT 进 行测试,保证它过滤的是正确的记录,以防编写的 WHERE 子句不正确。
d. 使用强制实施引用完整性的数据库, 这样 DBMS 将不允许删除其数据与其他表相关联的行。
e.有的 DBMS 允许数据库管理员施加约束,防止执行不带 WHERE 子句 的 UPDATE 或 DELETE 语句。如果所采用的 DBMS 支持这个特性,应 该使用它