规范化

约束

  1. NOT NULL
  2. UNIQUE
  3. PRIMARY KEY
  4. DEFAULT
  5. FOREIGN KEY:引用父表的某个唯一值
    引用完整性:插入外键列的值必须已经存在于父表的来源列中

    --创建外键
    create table interest(
    int_id varchar(50) NOT NULL,
    contact_id INT NOT NULL,
    FOREIGN KEY (contact_id)
    REFERENCES my_contacts(contact_id)
    );
  6. UNIQUE约束

    --当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:
    ALTER TABLE Persons
    ADD UNIQUE (Id_P)
    --如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:
    ALTER TABLE Persons
    ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
  7. CHECK约束

    --如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束,请使用下面的 SQL:
    ALTER TABLE Persons
    ADD CHECK (Id_P>0)
    --如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
    ALTER TABLE Persons
    ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
    CREATE TABLE piggy_bank
    (
    id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    coin CHAR(1) CHECK (coin IN ('P','N','D','Q'))
    )

原子性

具有原子性的列不会有多个类型相同的值

food_name ingredients
bread flour,milk,egg,oil
salad lettuce,tomato,cucumber

具有原子性数据的表中不会有多个存储同类数据的列

teacher student1 student2
Mr.Tang Joe Ron

第一范式 1NF

每个数据必须包含具有原子性的值
每个数据必须有独一无二的识别项,人称主键(
Primary Key)

数据模式

  1. 一对一
    父表中的一条记录只与子表中的一条记录相关联

    1. 抽出数据写出更快的查询
    2. 某列包含未知的值,单独存储,以避免出现null
    3. 隔离数据,现在访问
    4. 大块数据,例如BLOB
  2. 一对多
    父表中的一条记录与子表中的多条记录关联
    但子表中的一条记录只与父表中的一条记录关联

  3. 多对多
    一张表的多行记录与另一张表的多行记录相关联
    使用junction table(连接表)转化为两个一对多关系

依赖

T.x->T.y表示为在表T中,y列函数依赖于x列

  1. 部分函数依赖
    非主键的列依赖于组主合键的某个部分(但不完全依赖于组合主键)

  2. 传递函数依赖
    任何非键列与另一个非键类有关联

  3. 第二范式2NF
    符合第一范式且没有部分函数依赖

  4. 第三范式3NF
    符合第二范式且没有传递函数依赖

联接查询

交叉联接(AKA 笛卡尔联接,叉积)

CROSS JOIN 返回两张表的每一行相乘的结果

SELECT b.boy,t.toy
FROM boys as b CROSS JOIN toys as t
--CROSS JOIN可以用逗号代替
SELECT b.boy,t.toy
FROM boys as b, toys as t

内联接

内联接就是通过查询中的条件移除了某些结果数据行后的交叉联接

  1. 相等联接

    SELECT boys.boy ,toys.toy
    FROM boys
    INNER JOIN toys
    ON boys.toy_id=toys.toy_id
  2. 不等联接

    SELECT boys.boy ,toys.toy
    FROM boys
    INNER JOIN toys
    ON boys.toy_id<>toys.toy_id
    ORDER BY boys.boy
  3. 自然联接
    利用相同列名的内联接

    SELECT boys.boy ,toys.toy
    FROM boys
    NATURAL JOIN toys

子查询

子查询一般只返回一个值,使用IN是列外情况

非关联子查询:如果子查询可以独立运行且不会引用外层查询的任何结果,即称为非关联子查询
关联子查询:内层查询的解析需要依赖外层查询的结果

SELECT mc.name ,mc.email
FROM my_contacts mc
WHERE NOT EXISTS
(SELECT * FROM job_current jc
WHERE mc.contact_id = jc.contact_id);--mc在外层指定

外联接

  1. 左外联接
    LEFT OUTER JOIN会匹配左表中的每一行及右表中符合条件的行
    左外联接的结果集中的NULL表示右表中没有找到与左表相符的记录

  2. 右外联接
    与左外联接相反

自联接

  1. 自引用外键
    用属于同一张表的其他列作为外键。
ID NAME BOSS_ID
1 TOM 1
2 JACK 1

BOSS_ID引用了ID字段

  1. 自联接
    自联接把单一的表当成两张具有相同信息的表来进行查询

    SELECT c1.name,c2.name as BOSS
    FROM clown_info c1
    INNER JOIN clown_info c2
    ON c1.boss_id =c2.id

集合

  1. 联和(UNION)
    将多张表的查询结果合并至一张表,默认无重复(相当于去并集?)

    SELECT title FROM job_current
    UNION
    SELECT title FROM job_desired
    UNION
    SELECT title FROM job_listings
  2. 限制
    每个SELECT中列必须一致,统计函数与表达式也必须相同,类型相同或者可以转换
    SELECT语句顺序不重要
    默认无重复,需要重复可使用UNION ALL

  3. 交集(INTERSECT)

    SELECT title FROM job_current
    INTERSECT
    SELECT title FROM job_desired
  4. 差集(EXCEPT)

    SELECT title FROM job_current
    EXCEPT
    SELECT title FROM job_desired

事务

ACID

  1. 原子性
    事务里的每一个步骤都必须完成,否则只能都不完成。

  2. 一致性
    事务完成后应该维持数据库的一致性。

  3. 隔离性
    表示每次事务都会看到具有一致性的数据库,无论其他事务有什么行动。

  4. 持久性
    事务完成后,数据库需要正确存储数据并保护数据免受断电或其他威胁的伤害。

管理事务

START TRANSACTION--持续追踪后续所有SQL语句,直到输入COMMIT或ROLLBACK为止
COMMIT--提交
ROLLBACK--回滚

常用语句

SHOW CREATE TABLE tablename 显示创建表的SQL语句
SHOW WARNINGS 显示错误信息
SHOW INDEX FROM tablename 显示索引
ALTER TABLE tablename
ADD COLUMN columnname varchar(10) AFTER colname
新列的顺序除了AFTER还有 BEFORE,FIRST,SECOND可供选择

ALTER TABLE projekt_list
CHANGE COLUMN num proj_id INT NOT NULL auto_increment,
ADD PRIMARY KEY (proj_id) ALTER TABLE projekt_list
MODIFY COLUMN num proj_id INT NOT NULL auto_increment ALTER TABLE projekt_list
DROP COLUMN star_date--删除一列会删除该列的所有数据,在删除之前先选出列以确定那是你要删除的列
--一些字符串操作函数
SELECT SUBSTRING(,)
UPPER()
LOWER()
REVERSE()
LTRIM()
RTRIM()
LENGTH()
UPDATE movie_table
SET category =
CASE --根据条件更新,还可以搭配SELECT,INSERT,DELET
WHEN comedy='T' THEN 'comedy'
WHEN cartoon='T' AND rating='G' THEN 'family'
ELSE 'misc'
SELECT first_name,SUM(sales) AS sale
FROM cookie_sales
GROUP BY first_name
ORDER BY sale DESC
--常用函数
SUM() COUNT() MIN() MAX() --组合使用
SELECT COUNT(DISTINCT sale_date)
FROM cookie_sales DISTINCT--去重
LIMIT--限制返回行数(限MySQL)

注意

  1. null代表未定义,它不是0也不是空字符串,值可以是null但不会等于null,两个null也不能比较
    注意和编程语言的不同

       // Equals applied to any null object returns false.
    bool b = (t.Equals(s));
    Console.WriteLine(b);
    // Equality operator also returns false when one
    // operand is null.
    Console.WriteLine("Empty string {0} null string", s == t ? "equals": "does not equal"); // Returns true.
    Console.WriteLine("null == null is {0}", null == null);
  2. 不要在SQL中使用双引号

  3. 不要直接查找null而要使用IS NULL
  4. BETWEEN AND 可以替代<= AND >=,而且可以用于字符,但是较小的值必须放在前面
  5. 除了NOT IN,AND,OR之外,NOT必须接在WHERE之后
  6. 在删除和更新之前先查询

《HeadFirst SQL》笔记的更多相关文章

  1. HTML+CSS笔记 CSS笔记集合

    HTML+CSS笔记 表格,超链接,图片,表单 涉及内容:表格,超链接,图片,表单 HTML+CSS笔记 CSS入门 涉及内容:简介,优势,语法说明,代码注释,CSS样式位置,不同样式优先级,选择器, ...

  2. CSS笔记--选择器

    CSS笔记--选择器 mate的使用 <meta charset="UTF-8"> <title>Document</title> <me ...

  3. HTML+CSS笔记 CSS中级 一些小技巧

    水平居中 行内元素的水平居中 </a></li> <li><a href="#">2</a></li> &l ...

  4. HTML+CSS笔记 CSS中级 颜色&长度值

    颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 语法: p{co ...

  5. HTML+CSS笔记 CSS中级 缩写入门

    盒子模型代码简写 回忆盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左. 语法: margin:10px 15p ...

  6. HTML+CSS笔记 CSS进阶再续

    CSS的布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上, ...

  7. HTML+CSS笔记 CSS进阶续集

    元素分类 在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1&g ...

  8. HTML+CSS笔记 CSS进阶

    文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...

  9. HTML+CSS笔记 CSS入门续集

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...

  10. HTML+CSS笔记 CSS入门

    简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...

随机推荐

  1. 拉格朗日插值法——用Python进行数值计算

    插值法的伟大作用我就不说了.... 那么贴代码? 首先说一下下面几点: 1. 已有的数据样本被称之为 "插值节点" 2. 对于特定插值节点,它所对应的插值函数是必定存在且唯一的(关 ...

  2. VS2010开发工具使用技巧<之简单讲解>

    俗语云:工欲善其事必先利其器! 1.代码放大 效果:放大前----------------------------------------------------------------->放大 ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(9)-MVC与EasyUI结合增删改查

    系列目录 文章于2016-12-17日重写 在第八讲中,我们已经做到了怎么样分页.这一讲主要讲增删改查.第六讲的代码已经给出,里面包含了增删改,大家可以下载下来看下. 这讲主要是,制作漂亮的工具栏,虽 ...

  4. 微软Power BI技术文章与资源目录

    下面是本博客原创的微软Power BI技术相关文章,对于部分转载文章和资源,会注明出处. 本博客将发布基于微软Power BI相关的基础入门文章,视频教程等资源,敬请关注. 个人建立的Power BI ...

  5. 读书笔记--SQL必知必会07--创建计算字段

    7.1 计算字段 字段(field),基本与列(column)含义相同. 利用计算字段可以直接从数据库中检索出转换.计算或格式化过的数据. 计算字段不实际存在于数据库表中,是运行时在SELECT语句内 ...

  6. IDEA+weblogic部署运行项目

    前段时间再服务器上为了部署一个系统,一直存在各种问题,不过过程中倒是把weblogic的部署掌握地特别熟练,下面就一些主要步骤做个记录:1.自己用的是IDEA,所以打开项目之后需要设置src/main ...

  7. ASP.NET MVC 登录验证

     好久没写随笔了,这段时间没 什么事情,领导 一直没安排任务,索性 一直在研究代码,说实在的,这个登录都 搞得我云里雾里的,所以这次我可能也讲得不是 特别清楚,但是 我尽力把我知道的讲出来,顺便也对自 ...

  8. [Servlet] 初识Servlet

    什么是Servlet? 定义 Servlet的全称是 Server Applet,顾名思义,就是用 Java 编写的服务器端程序. Servlet 是一个 Java Web开发标准,狭义的Servle ...

  9. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  10. 关于for循环的几个小练习,例如奇数偶数,阶乘,求和等

    1 .100以内的奇数和偶数 var js = ""; var os = ""; for(var i=1;i<101;i++) { if(i%2 == 0 ...