一些容易混淆的

在字符串表达式中的字符串需要用引号 “ 包含,如果不用引号,SQL会认为是一个属性列的名字,如:col_name = color 表示 col_name和color两个属性一样的行 col_name = “color” 表示 col_name 属性为字符串 “color”的行.

ORDER BY 排序

ORDER BY 接多字段时,前一个字段对应的列中的内容相同才order后一字段

GROUP BY 分组

借助 SQL 聚合函数,可以对分组的数据进行再次加工,例如:
SUM( ) 函数可以对指定字段的值进行求和;
COUNT( ) 函数可以计算某个分组内数据的条数;
AVG( ) 函数可以对指定字段的值求平均数。
TURNCATE() 截断

SELECT country, SUM(uv) AS total FROM website
GROUP BY country;

TURNCATE(SUM(score), 2)
保留总score 两位小数

DISTINCT

后接多个字段时,只有所有字段都同时满足重复,才会被过滤掉


约束

添加

ALTER TABLE tbname
ADD CONSTRAINT constraintName xxxxxx

这是“二次新建法”,也有初始新建法——在CREATE TABLE的时候添加

删除

ALTER TABLE tbname
DROP CONSTRAINT constraintName

例外:在MySQL中,删除UNIQUE约束的方法是DROP INDEX,而不是DROP CONSTRAINT,为什么呢,因为创建UNIQUE约束时,MySQL会在幕后创建一个UNIQUE的索引

FOREIGN KEY 约束

对外键约束的几点说明:

  • 一个表可以有多个外键,但是只能有一个主键。

  • 外键约束用于防止破坏两个表之间的关联性,保证数据的完整性和一致性。

  • 外键约束能够防止非法数据进入外键字段,因为它的值必须存在于它指向的主键中。

  • 从表的外键类型,必须与主表的主键类型一致。

  • 删除/更新主表记录时,可以选择同时删除/更新从表中的相关记录,也可以选择不删除/更新,您可以在定义外键时对此进行设置。

  • 删除主表记录时,必须先删除从表中的关联记录,否则主表中的记录将无法删除。

  • 删除主表时,必须先删除从表,否则主表将无法删除。

    references table_name(primary_key_name)

也可以使用 ALTER TABLE 来添加:

ALTER TABLE `order`
ADD FOREIGN KEY (uid) REFERENCES user (id);

CHECK 约束

初始新建法

CREAT TABLE food (
    id INT NOT NULL AUTO_INCREMENT,
    name varchar(32) NOT NULL,
    price INT NOT NULL DEFAULT '0',
    PRIMARY KEY(id),
    CONSTRAINT priceCheck CHECK(price>=0 and price<=100)
)

二次新建法

ALTER TABLE food
MODIFY price INT NOT NULL CHECK(price>=0 AND price<=100)

INDEX 约束

  • 仅在被频繁检索的字段上创建索引。
  • 尽量不要在有大量重复值得字段上建立索引,比如性别字段、季度字段等。

示例

CREATE INDEX foodNameIndex
ON food(name)

UNION

SQL UNION 子句/运算符用于合并两个或者多个 SELECT 语句的结果集。

默认: UNION 运算符会过滤掉两个结果集中重复的记录,只保留其中一条,也就是对两个结果集进行并集操作;此外,UNION 还会按照默认规则对结果集进行排序。

UNION ALL:不会过滤重复的记录,也不会进行排序。

  • 每个 SELECT 语句都必须拥有相同数量的字段;
  • SQL 会将第一个 SELECT 语句的字段名作为结果集的字段名

TURNCATE

TRUNCATE TABLE 和 DROP TABLE

前者清空表,后者删除表

注意

TURNCATE TABLE 会重置auto increment(DELETE FORM 不会)

VIEW

CREATE VIEW

CREATE VIEW CUSTOMERS_VIEW AS
SELECT id, name, age
FROM  CUSTOMERS
WHERE SALARY > 2000;

在创建时,其实没有执行SELECT,只有使用时(比如SELECT * FROM CUSTOMERS_VIEW),才会去执行。

  • 视图不需要物理存储空间(除非视图添加索引)
  • 对视图来执行其他语句相当于多了一层门槛(可以在视图中添加限制条件)。

DROP VIEW

DROP VIEW CUSTOMERS_VIEW;

HAVING

  • 常在GROUP BY分组中使用
  • 弥补WHERE的不足,WHERE不支持对聚合函数处理。
  • WHERE用在GROUP BY前,HAVING 用在GROUP BY后面。
  • SELECT…FROM…JOIN…ON…WHERE…GROUP BY…HAVING…ORDER BY….

事务

BEGIN;
xxxxxx;
SAVEPOINT xx; (可选)
ROLLBACK;/COMMIT;/ROLLBACK TO xx;
  1. 原子性
    一个事务中的所有 SQL 语句,要么全部执行成功,要么全部执行失败.

  2. 一致性
    在事务开始之前和事务结束以后,数据库的完整性没有被破坏。

  3. 隔离性
    数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
    在Mysql中,默认情况下,一个会话可以看到自己未COMMIT的事务改变的数据,其他会话看不到。

  4. 持久性
    事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。