关系数据库以行为单位读写数据。
一个单元格中只能输入一个数据。
DDL(Data Definition Language,数据定义语言)
用来创建或者删除存储
数据用的数据库以及数据库中的表等对象。DDL 包含以下几种指令。
CREATE:创建数据库和表等对象
DROP: 删除数据库和表等对象
ALTER: 修改数据库和表等对象的结构
●DML
DML(Data Manipulation Language,数据操纵语言)
用来查询或者变更
表中的记录。DML 包含以下几种指令。
SELECT:查询表中的数据
INSERT:向表中插入新数据
UPDATE:更新表中的数据
DELETE:删除表中的数据
●DCL
DCL(Data Control Language,数据控制语言)
用来确认或者取消对数据
库中的数据进行的变更。除此之外,还可以对 RDBMS 的用户是否有权限
操作数据库中的对象(数据库表等)进行设定。DCL 包含以下几种指令。
COMMIT: 确认对数据库中的数据进行的变更
ROLLBACK:取消对数据库中的数据进行的变更
GRANT:
赋予用户操作权限
REVOKE:
取消用户的操作权限
实际使用的 SQL 语句当中有 90% 属于 DML。
SQL语句以分号(;)结尾
关键字不区分大小写。
-
书写规则:
字符串和日期常数需要使用单引号(')括起来。
数字常数无需加注单引号(直接书写数字即可)。
7.单词之间需要使用半角空格或者换行符进行分隔。
数据库名称、表名和列名等可以使用以下三种字符。
● 半角英文字母 ● 半角数字 ● 下划线(_)
名称必须以半角英文字母作为开头。
在同一个数据库中不能创建两个相同名称的表!!!! 同一个表中,,,也不能创建两个名称相同的列
主键可以确定唯一一行数据
删除了的表是无法恢复的。 在执行DROP TABLE语句之前请务必仔细确认。
ALTER TABLE 语句和DROP TABLE 语句一样,执行之后无法恢复。
误添的列可以通过 ALTER TABLE 语句删除,或者将表全部删除之后
重新再创建。
设定汉语别名时需要使用双引号(")括起来。
在SELECT语句中使用DISTINCT可以删除重复行。
SELECT语句中的WHERE子句
SELECT <列名>, ……
FROM <表名>
WHERE <条件表达式>;
举例说明:
SELECT product_name, product_type
FROM Product
WHERE product_type = '衣服';
首先通过WHERE 子句 查询出符合条件的记录, 然后在选取出,, SELECT 后面指定的列
包含NULL的运算,, 结果肯定为NULL
字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不
是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。
AND运算符的优先级高于OR运算符。想要优先执行OR运算符时可以使用括号。
想要计算表中全部数据的行数时,可以像 SELECT COUNT(*)~ 这
样使用星号。如果想得到 purchase_price 列(进货单价)中非空行
数的话,可以像代码清单 3-2 那样,通过将对象列设定为参数来实现。
SELECT COUNT(purchase_price)
FROM Product;
执行结果
count
6
COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据
行数,而COUNT(<列名>)会得到NULL之外的数据行数。
聚合函数会将NULL排除在外,,但是COUNT(*)例外,他不会排除
NULL
MAX/MIN 函数和 SUM/AVG 函数有一点不同,那就是 SUM/
AVG 函数只能对数值类型的列使用,而 MAX/MIN 函数原则上可以适用
于任何数据类型的列。
SELECT COUNT(DISTINCT product_type)
FROM Product;
这时 DISTINCT 必须写在括号中。这是因为必须要在计算行数之前删除 product_type 列中的重复数据。
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type;
不使用GROUP BY的话,,是将表中所有数据作为一组来对待的!!!而使用GROUP BY 子句时,,,会
将表中的数据分为多个进行处理!!!
此外,GROUP BY 子句的书写位置也有严格要求,一定要写在
FROM 语句之后(如果有 WHERE 子句的话需要写在 WHERE 子句之后)
只有SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数。
记住ORDER BY 子句都需要写
在SELECT语句的末尾,,废话么,,肯定在获得查询数据之后在进行排序的啊!!!
子句的书写顺序
SELECT 子句 → 2. FROM 子句 → 3. WHERE 子句 → 4. GROUP BY 子句 → 5. HAVING 子句 → 6. ORDER BY 子句
GROUP 不能使用SELECT中的别名,,是因为GROUP BY 早于 SELECT执行
使用 HAVING 子句时 SELECT 语句的顺序FROM → WHERE → GROUP BY → HAVING →SELECT → ORDER BY
使用INSERT..SELECT可以从其他表中复制数据!!!!
A 列清单→ (product_id, product_name, product_type,
sale_price, purchase_price, regist_date)
B 值清单→ ('0001', 'T恤衫', '衣服', 1000, 500,'2009-09-20')
当然,表名后面的列清单和 VALUES 子句中的值清单的列数必须保
持一致。如下所示,列数不一致时会出错,无法插入数据 B。
对表进行全列INSERT的时候,,可以省略表名后面的清单,,
但是VALUES的顺序要和表中列的字段保持一致!!!!
DELETE 语句的删除对象并不是表或者列,,而是记录(行)
与 DELETE 不同的是,TRUNCATE 只能删除表中的全部数据,而不能通过
WHERE 子句指定条件来删除部分数据。也正是因为它不能具体地控制删除对象,
所以其处理速度比 DELETE 要快得多。实际上,DELETE 语句在 DML 语句中也
属于处理时间比较长的,因此需要删除全部数据行时,使用 TRUNCATE 可以缩短
执行时间。
使用逗号对列进行分隔排列
UPDATE Product
SET sale_price = sale_price * 10,
purchase_price = purchase_price / 2
WHERE product_type = '厨房用具';
简单来讲,,事务就是需要在同一个处理单元中执行的一系列
更新处理的集合
事务的四大特性:::原子性,,持久性,,隔离性,,一致性
MySQL
START TRANSACTION;
-- 将运动T恤的销售单价降低1000日元
UPDATE Product
SET sale_price = sale_price - 1000
WHERE product_name = '运动T恤';
-- 将T恤衫的销售单价上浮1000日元
UPDATE Product
SET sale_price = sale_price + 1000
WHERE product_name = 'T恤衫';
COMMIT;
实际上视图保存的是SELECT 语句,,我们从视图中读取数据
的时候,,视图会在内部执行该SELECT语句并创建出一张
临时表
第一个优点是:::节省存储设备的容量
第二个优点是,,可以将频繁使用的SELECT语句保存成视图,,这样就不用每次都重新书写了,,,特别是在进行汇总以及复杂的查询条件导致SELECT语句非常庞大的时候,,视图可以大大提高效率!!!
应该将经常使用的SELECT语句做成视图
CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type;
但是我们还是应该尽量避免在视图的基础上创
建视图。这是因为对多数 DBMS 来说,多重视图会降低 SQL 的性能。
定义视图时不能使用ORDER BY子句
不能像这样定义视图
CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
ORDER BY product_type;
如果定义视图的 SELECT 语句能够
满足某些条件,那么这个视图就可以被更新。下面就给大家列举一些比较
具有代表性的条件。
① SELECT 子句中未使用 DISTINCT
② FROM 子句中只有一张表
③ 未使用 GROUP BY 子句
④ 未使用 HAVING 子句
这样才可以更新视图 否则不可以
视图和表需要同时进行更新,因此通过汇总得到的视图无法进行更新。
但是真的要更新视图么,第一点,,设计出既可更新,,又满足要求的视图,妥协的
写法应该会占很多,,到最后可能随着需求的变化,,又不能更新,,又不满足要求
,,,,,,所以,,既然叫做视图,,那就只做符合名字的事情,,
标量子查询虽然好用,,但是也有需要注意的事项,,,,标量子查询不能返回多行
结果,,也就是说,,如果子查询返回了多个结果,,那就仅仅是一个普通的子查询了,,而且,,也不能出现在SELECT中
SELECT product_type, product_name, sale_price
FROM Product AS P1 ①
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product AS P2 ②
WHERE P1.product_type = P2.product_type
GROUP BY product_type);
SELECT product_name,
CASE WHEN product_type = '衣服'
THEN 'A :' | | product_type
WHEN product_type = '办公用品'
THEN 'B :' | | product_type
WHEN product_type = '厨房用具'
THEN 'C :' | | product_type
ELSE NULL
END AS abc_product_type
FROM Product;
集合运算符会除去重复的记录UNION集合运算符通常都会去除重复
的记录
不仅限于 UNION,之后将要学习的所有运算符都要遵守这些注意事项。
记录的列数必须相同!!!!!!列的类型必须一致!!!!!!!可以使用任何SELECT语句,,但是ORDER BY子句只能在最后用。
在集合中使用ALL选项,,可以保留重复行
UNION 是以行位单位,,而联结则是以列为单位
窗口函数可以进行排序,,生成序列号等一般聚合函数无法实现的高级操作