MySQL知识梳理

关系数据库以行为单位读写数据。

一个单元格中只能输入一个数据。

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语句以分号(;)结尾

关键字不区分大小写。

  1. 书写规则:

    字符串和日期常数需要使用单引号(')括起来。

    数字常数无需加注单引号(直接书写数字即可)。

    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 是以行位单位,,而联结则是以列为单位

     

    窗口函数可以进行排序,,生成序列号等一般聚合函数无法实现的高级操作

     

     

     

     

     

     

     

     

     

     

     

     

     

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值