《HeadFirst SQL》笔记
规范化
约束
- NOT NULL
- UNIQUE
- PRIMARY KEY
- DEFAULT
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)
);
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)
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)
数据模式
一对一
父表中的一条记录只与子表中的一条记录相关联- 抽出数据写出更快的查询
- 某列包含未知的值,单独存储,以避免出现null
- 隔离数据,现在访问
- 大块数据,例如BLOB
一对多
父表中的一条记录与子表中的多条记录关联
但子表中的一条记录只与父表中的一条记录关联多对多
一张表的多行记录与另一张表的多行记录相关联
使用junction table(连接表)转化为两个一对多关系
依赖
T.x->T.y表示为在表T中,y列函数依赖于x列
部分函数依赖
非主键的列依赖于组主合键的某个部分(但不完全依赖于组合主键)传递函数依赖
任何非键列与另一个非键类有关联第二范式2NF
符合第一范式且没有部分函数依赖第三范式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
内联接
内联接就是通过查询中的条件移除了某些结果数据行后的交叉联接
相等联接
SELECT boys.boy ,toys.toy
FROM boys
INNER JOIN toys
ON boys.toy_id=toys.toy_id
不等联接
SELECT boys.boy ,toys.toy
FROM boys
INNER JOIN toys
ON boys.toy_id<>toys.toy_id
ORDER BY boys.boy
自然联接
利用相同列名的内联接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在外层指定
外联接
左外联接
LEFT OUTER JOIN会匹配左表中的每一行及右表中符合条件的行
左外联接的结果集中的NULL表示右表中没有找到与左表相符的记录右外联接
与左外联接相反
自联接
- 自引用外键
用属于同一张表的其他列作为外键。
ID NAME BOSS_ID 1 TOM 1 2 JACK 1
BOSS_ID引用了ID字段
- 自联接
自联接把单一的表当成两张具有相同信息的表来进行查询SELECT c1.name,c2.name as BOSS
FROM clown_info c1
INNER JOIN clown_info c2
ON c1.boss_id =c2.id
集合
联和(UNION)
将多张表的查询结果合并至一张表,默认无重复(相当于去并集?)SELECT title FROM job_current
UNION
SELECT title FROM job_desired
UNION
SELECT title FROM job_listings
限制
每个SELECT中列必须一致,统计函数与表达式也必须相同,类型相同或者可以转换
SELECT语句顺序不重要
默认无重复,需要重复可使用UNION ALL交集(INTERSECT)
SELECT title FROM job_current
INTERSECT
SELECT title FROM job_desired
差集(EXCEPT)
SELECT title FROM job_current
EXCEPT
SELECT title FROM job_desired
事务
ACID
原子性
事务里的每一个步骤都必须完成,否则只能都不完成。一致性
事务完成后应该维持数据库的一致性。隔离性
表示每次事务都会看到具有一致性的数据库,无论其他事务有什么行动。持久性
事务完成后,数据库需要正确存储数据并保护数据免受断电或其他威胁的伤害。
管理事务
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)
注意
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);
不要在SQL中使用双引号
- 不要直接查找null而要使用IS NULL
- BETWEEN AND 可以替代<= AND >=,而且可以用于字符,但是较小的值必须放在前面
- 除了NOT IN,AND,OR之外,NOT必须接在WHERE之后
- 在删除和更新之前先查询
《HeadFirst SQL》笔记的更多相关文章
- HTML+CSS笔记 CSS笔记集合
HTML+CSS笔记 表格,超链接,图片,表单 涉及内容:表格,超链接,图片,表单 HTML+CSS笔记 CSS入门 涉及内容:简介,优势,语法说明,代码注释,CSS样式位置,不同样式优先级,选择器, ...
- CSS笔记--选择器
CSS笔记--选择器 mate的使用 <meta charset="UTF-8"> <title>Document</title> <me ...
- HTML+CSS笔记 CSS中级 一些小技巧
水平居中 行内元素的水平居中 </a></li> <li><a href="#">2</a></li> &l ...
- HTML+CSS笔记 CSS中级 颜色&长度值
颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 语法: p{co ...
- HTML+CSS笔记 CSS中级 缩写入门
盒子模型代码简写 回忆盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左. 语法: margin:10px 15p ...
- HTML+CSS笔记 CSS进阶再续
CSS的布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上, ...
- HTML+CSS笔记 CSS进阶续集
元素分类 在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1&g ...
- HTML+CSS笔记 CSS进阶
文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...
- HTML+CSS笔记 CSS入门续集
继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...
- HTML+CSS笔记 CSS入门
简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...
随机推荐
- Spark2 ML 学习札记
摘要: 1.pipeline 模式 1.1相关概念 1.2代码示例 2.特征提取,转换以及特征选择 2.1特征提取 2.2特征转换 2.3特征选择 3.模型选择与参数选择 3.1 交叉验证 3.2 训 ...
- [OAuth]基于DotNetOpenAuth实现Client Credentials Grant
Client Credentials Grant是指直接由Client向Authorization Server请求access token,无需用户(Resource Owner)的授权.比如我们提 ...
- 【译】Unity3D Shader 新手教程(5/6) —— Bumped Diffuse Shader
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 动机 如果你满足以下条件,我建议你阅读这篇教程: 你想学习片段着色器(Fragment Shader). 你想实现 ...
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(18)-权限管理系统-表数据
系列目录 这一节,我们插入数据来看看数据流,让各位同学,知道这个权限表交互是怎么一个流程,免得大家后天雾里来雾里去首先我再解释一些表,SysUser和SysRole表不用解释了. SysRoleSys ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
- 安卓第一次启动引导页使用ViewPager实现
我们在安装某个APP的时候,基本都会有一个引导页的提示,他们可以打广告,或者介绍新功能的加入和使用说明等.一般都支持滑动并且下面有几个点,显示共有多少页和当前图片的位置,在IOS上这个实现起来比较简单 ...
- css3 transition animation nick
时光转眼即逝,又到周六了,今天写点某部分人看不起的css玩玩! 转换 转换属性transform: 浏览器前缀: -webkit-transform;-o-transform;-moz-transfo ...
- 介介介是一个ORM
介个是一个ORM,介个ORM基于Dapper扩展. 为什么需要一个ORM呢? 支持简单的LINQ查询 但是不能连表查询,why?why?why?为什么不能连接查询 ^.^ ok.但是就是不支持.哈哈哈 ...
- github常见问题【转自百度知道】
1 git config --global user.name "Your Real Name" 2 git config --global user.email you@emai ...