HeadFirst SQL 读书摘要
数据库都是用 圆柱形表示的。
数据库中包含表
表中包含行和列
行又叫记录record, 列又叫 字段field
创建数据库
create database mypipe_l;
选择数据库
use mypipe_l;
创建表
create table doughnut(
name VARCHAR(10),
type VARCHAR(6)
);
查看表
desc doughnut;
删除表
drop table doughnut;
插入数据
insert into doughnut (name, type) values ('Park', 'g');
insert into doughnut values ('BoB', 'b'); 在插入数据的时候也可以省略列名, 但这是必须输入所有数据值。
NULL : 值可以是NULL,但不能等于NULL,NULL代表未定义的值。
指定某列不能是NULL
create table doughnut(
name VARCHAR(10) NOT NUll,
type VARCHAR(6)
);
用default填补空白
create table doughnut(
name VARCHAR(10) NOT NUll,
type VARCHAR(6) DEFAULT 'po'
);
查询
select * from doughnut where id = 1
在SQL使用 单引号 来表示varchar类型的值, 不要使用双引号, 因为 编程语言中的String用的是双引号。
如果在文本中包含单引号,用 反斜杠转义。 或者用两个单引号来转义
等于 =
不等于 <>
小于 <
大于 >
小于等于 <=
大于等于 >=
OR
用IS NULL找到NULL
LIKE 调用通配符
% 任意数量的位置字符的替身
SELECT question FROM exercise_question WHERE exercise like '%ca';
_ 下划线 是 任意一个位置字符的替身
SELECT question FROM exercise_question WHERE exercise like '_ca';
BETWEEN 10 AND 30
IN (1,2,3,4,5)
NOT IN (7,8,9,10)
NOT 可以和BETWEEN和 LIKE一起使用。这NOT的位置
SELECT question FROM exercise_question WHERE not exercise like '_ca'; SELECT question FROM exercise_question WHERE not exercise between 1 and 10;
IS NOT NULL
delete
delete from clown_info where activities = 'dancing';
慎用delete语句,不确定时,应该先用select看一下 选择了哪些行。
update 更新一列或则和多列
update clown_info set type='glazed' where type = 'plain';
set 子句 可以设置一个或者多个列。
update语句 可以和基础数学运算符一起使用
update clown_info set cost = cost+1 where type = 'plain';
原子性数据,小到已经不能再分割了。
原子性规则一:数据的列中不会有多个类型相同的值
原子性规则二:表中不会有多个存储相同数值的列
第一范式:每个数据都有主键,即独一无二的识别项。
主键用来 独一无二的 识别出记录。
查看建表语句
show create table sometable;
主键不能为空
create table xxx(
id int not null,
name varchar(11)
primary key (id)
);
反撇号 有什么作用? 标识列名
反撇号可以让 保留字也成为 列名。
`select` varchar(50)
但 这不是好的实践。
auto_increment 自动递增
再次修改建表语句
create table xxx(
id int not null auto_increment ,
name varchar(11)
primary key (id)
);
auto_increment 会 忽略NULL
给表增加列
alter table my_contacks
add column id int not null auto_increment first,
add primary key (id);
alter命令
alter table doughnut add column phone varchar(13) not null;
alter table doughnut add column phone varchar(13) not null after `name`;
change 修改列名称和数据类型
alter table doughnut change column phone3 iphone varchar(15) not null after `name`;
modify 修改数据类型或位置
alter table doughnut modify column phone2 varchar(15) not null after `name`;
drop 删除列
alter table doughnut drop column phone2 ;
修改表名
alter table doughnut rename to dough;
删除主键
alter table doughnut drop primary key
取字符的前几个 left, right也一样
select left(name,3) from dough
还有许多字符串辅助函数。
update dough set state = left(`name`,3) 将state 字段设置为 name字段的前3个字符
在SQL中写 if判断
update dough set state = CASE WHEN type = 'po'
THEN 'pXp'
ELSE 'xn' END where name = 'f'
排序
Order by
select * from dough order by iphone
select * from dough order by iphone asc ,name desc 根据两列排序,desc是倒叙, asc正序,默认是正序
对某个列求和
select sum(phone) from dough where name = 'p'
group by
select sum(phone) from dough group by name order by sum(phone)
avg 平均函数
select avg(phone) from dough group by name order by sum(phone)
最大值
select max(phone) from dough group by name order by sum(phone)
最小值
select name, min(phone) from dough group by name order by sum(phone)
eg:
select t.year, max(t.cnt), t.month from (select * from orderx order by cnt) t GROUP BY `year`
统计记录 count
select count(1) from dough group by name
limit
select name from dough order by score limit 3 只取前3个
select name from dough order by score limit 2,3 跳过前2条,再取3条
把不符合原子性的列 移出表, 再建一张 关联表。
模式schema
对数据库内的数据描述,以及任何相关对象和各种连接方式的描述就称为schema
外键是另外一个表的 主键
创建带有外键的表
create table `interest` (
id int not null auto_increment PRIMARY key,
interest VARCHAR(20),
main_id int not null,
CONSTRAINT main_id FOREIGN key (main_id) REFERENCES orderx(id)
)
引用完整性: 插入外键列的值必须已经存在于父表的来源列中。
外键约束能保证引用完整性, 如果这是你删除主键表中的行,而这个主键是其他表的外键,你就会收到警告。
一对一模式:
一对多模式:
多对多模式: 这时需要 有一张连接表 把来存储这种多对多的关系。 这张表存两外两张表的主键。
1NF 第一范式
规则一:数据列只包含具有原子性的值
规则二:没有重复的数据组。
组合键就是由多个数据列构成的主键,组合各列后形成具有唯一性的主键。
当某列的数据必须随着另一列而改变时,表示第一列 函数依赖 第二列。
举个例子
name | initials |
Fu Peng | FP |
在上面这个例子中,一个列是name,另一个是简写, 所以当name改变时,他的首字母简写也要跟着改变。
速记符号
T.name -> T.initials
有依赖列, 也有不依赖列
部分函数依赖 是指 非主键的列 依赖于 组合主键的某个部分。
比如 上面的例子中 initials依赖于name,而name是组合主键的一部分, 但是 initials又不依赖于其他列, 那么 initials就是部分函数依赖
传递函数依赖:如果改变 非键列 会造成其他列的改变,这就是传递依赖,即 任何非键列 和 其他非键列有关。
避免部分函数依赖的方法, 使用id作为 专用索引的主键, 这样就没有字段依赖它了。
2NF,第二范式
规则一,符合1NF
规则二,没有部分函数依赖性。
如果表中 有人工主键,又没有组合主键,则符合2NF
3NF,第三范式
规则一,符合2NF
规则二,没有传递函数依赖性。
表的设计应该向3NF方向靠拢, 其原则是把每一张表的职责划清楚,避免将不同的东西写在一起,然后通关关系,再将各处的数据组合起来。 这大概就是叫关系数据库的原因吧,
所有后面要将如何 连表查询。 这才是RDB的精髓。就是关系关系关系。
create insert
create table profession (
id int(11) not null auto_increment primary key,
profession varchar(20)
) as
select profession from my_contacts
group by profession
order by profession
别名alias
as 用来设置别名, 不过as也可以省略。
交叉连接
select t.toy, b.boy from
toys as t
cross join
boys as b //cross join可以省略 写成
select t.toy, b.boy from
toys as t,
boys as b
交叉连接把第一张表的每个值和第二张表的每个值配对。
cross join返回两张表的每一行相乘的结果。
内连接就是 通过查询中的条件 移除了某些结果数据行后的 交叉连接。
内连接,利用条件比较运算符 结合两张表,
内链接:相等连接
select boys.boy, toys.toy
from boys
inner join
toys
on boys.toy_id = toys.id
内链接之 不等连接
select boys.boy, toys.toy
from boys
inner join
toys
on boys.toy_id <> toys.id
自然连接 没看懂
ca ta 表别名和列别名是为了让 SQL 写的简化一些。
子查询,是被另一个查询包围的查询,也可以称为 内层查询。
selet mc.first_name, mc.last_name, jc.title
from
job_current as jc
natural join
my_contact as mc
where jc.title in (select title from job_listing);
子查询都是单一 select 语句,
一般情况 子查询只需要返回一个值, 使用 in的情况例外。
作为 预选取列的 子查询
select mc.first_name ,
(select state from zip_code where mc.zip_code = zip_code) as state
from my_contact mc
如果子查询放在 select语句中,用于表示某个预选列,则一次只能从一个列返回一个值
非关联子查询
关联子查询: 内层查询的解析需要依赖 外层结果。
关联子查询例子
select mc.first_name
from my_contact as mc
where
3 = (select count(1) from contact_interest where contact_id = mc.contact_id);
not exists 关联子查询
select mc.first_name
from my_contact mc
where not exists
(select * from job_contact jc where mc.contact_id = jc.contact_id)
外连接
left outer join ,接受左表中的所有行,并用这些行与右表进行匹配。
左连接用的比较多
select g.girl, t.toy
from girls g
left join
toys t
on g.toy_id = t.toy_id
在left join中,如果出现NULL,说明右表中没有与左表匹配的行。
自引用外键:某一列的值是 同一张表的主键。
自连接
select c1.name, c2.name boss_name
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_desire
union
select title from job_listing
使用联合的规则
每个select语句的列数量必须一致,
列的数据类型必须相同,或者可以互相转换。
select语句的顺序不重要,不会改变结果。
SQL会默认清除联合结果中的重复值
如果处于某种原因 想要看到 重复的结果, 可是使用 union all
从联合创建表
create table my_union as
select title from t1 union
select title from t2 union
select title from t3
intersect 求交集
except 求差集, MySQL没有实现这两个SQL运算符
检查约束 check
alter table my_contact
add constraint check gender in ('F','M');
视图 view
创建视图,视图好像一个 SQL语句的 简称。
视图好像一个 子查询。
给子查询一个别名,以便把它当成一个虚拟表
事务,在事务执行过程中,所有步骤如果不能不受干扰地全部完成,则不完成任何单一步骤。
acid 原子 一致,持久性,隔离性
start transaction commit
rollback
在MySQL使用事务之前,必须保证 该表的 存储引擎是 支持事务的,如Innodb。
MyISAM不支持事务。
添加用户
create user eliss
identified by ''
使用grant 语句,可以控制用户对 表和列的 可执行权限。
grant是授权的意思
grant select on clown_info to eliss
grant all on db.* to eliss
撤销权限
revoke select on clown_info from eliss
MySQL 没有 角色 功能
HeadFirst SQL 读书摘要的更多相关文章
- HeadFirst设计模式读书笔记--目录
HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...
- 《Effective C++》读书摘要
http://www.cnblogs.com/fanzhidongyzby/archive/2012/11/18/2775603.html 1.让自己习惯C++ 条款01:视C++为一个语言联邦 条款 ...
- 《HeadFirst SQL》笔记
规范化 0 约束 1 原子性 2 第一范式 1NF 3 数据模式 4 依赖 5 联接查询 6 交叉联接(AKA 笛卡尔联接,叉积) 7 内联接 8 子查询 9 外联接 10 自联接 11 集合 12 ...
- 读书摘要:第七章 闩Suan锁和自旋锁
摘要: 1.闩锁就像是内存上的锁,随着越来越多的线程参与进来,他们争相访问同一块内存,导致堵塞.2.自旋锁就是闩锁,不同之处是如果访问的内存不可用,它将继续检查轮询一段时间.3.拴锁和自旋锁是我们无法 ...
- Tomcat权威指南-读书摘要系列6
6. Tomcat 安全防护 使用SecurityManager 在Tomcat中,决定安全策略的配置文件是$CATALINA_HOME/conf/catalina.policy,在用-securit ...
- JAVA 技术手册 卷1 第十四章『多线程』 读书摘要
什么是线程 进程受CPU时间片的轮转调度,进而予人多任务并发的感觉. 线程在更低层次上扩展多任务概念,一个进程通常包含多个线程. 进程各自数据独立,而线程共享数据. 数据独立使进程相互通信变得繁难,共 ...
- 读书摘要,Hackable Projects
完整读完Google的三篇谈Hackable Projects的文章,以及一篇从Test Pyramid看UnitTest的比重.一篇谈Optimal Logging的文章,感觉这5篇在测试.日志两个 ...
- 读书摘要,一种新的黑客文化:programming is forgetting
http://opentranscripts.org/transcript/programming-forgetting-new-hacker-ethic/ 这篇文章非常有意思,作者是一个计算机教师, ...
- 《Java多线程核心技术》读书摘要
Chapter1: 进程是操作系统管理的基本单元,线程是CPU调到的基本单元. 调用myThread.run()方法,JVM不会生成新的线程,myThread.start()方法调用两次JVM会报错. ...
随机推荐
- XMLHttpRequest API 使用指南
一.实例化 XMLHttpRequest 对象 使用 Ajax API 的第一件事情就是实例化 XMLHttpRequest 对象. var xhr = new XMLHttpRequest(); 二 ...
- 浏览器特性检测插件Feature.js
<script src="js/feature.js"></script> if (feature.webGL) { console.log("你 ...
- 基于51单片机IIC通信的AT24C02学习笔记
引言 最近在学习几种串行通信协议,感觉收获很多,这篇文章是学习IIC总线协议的第一篇文章,以后还会再写一篇关于PCF8591 IIC通信的ADDA转换芯片的文章. 关于IIC总线 IIC 即Inter ...
- 什么是NoSQL
NoSQL = Not Only SQL 不仅仅是SQL NoSQL,指的是非关系型的数据库(没有声明性查询语言,没有预定义的模式,可以为键 - 值对存储,列存储,文档存储,图形数据库).不同于传统的 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十一)数据层优化-druid监控及慢sql记录
本文提要 前文也提到过druid不仅仅是一个连接池技术,因此在将整合druid到项目中后,这一篇文章将去介绍druid的其他特性和功能,作为一个辅助工具帮助提升项目的性能,本文的重点就是两个字:监控. ...
- UPS对电源故障的处理能力
UPS对电源故障的处理能力 双变换在线式UPS由于其逆变器实时在线工作,因而能对所有的电源故障具有隔离和处理功能.由于目前电网情况发生了很大变化,真正的长时间断电只占所有电源故障的30%甚至更低,而非 ...
- MySQL最常用分组聚合函数
一.聚合函数(aggregation function)---也就是组函数 在一个行的集合(一组行)上进行操作,对每个组给一个结果. 常用的组函数: AVG([distinct] expr) 求平均值 ...
- Google Earth影像数据破解之旅
"Zed, you are so excellent." 为什么要写这句英文?容我卖个关子稍后再解释. 相信大多数人都体验过Google Earth(简称GE),我对GE最初的印象 ...
- 修改maven本地仓库的默认地址
由于maven默认仓库地址为C盘,所以缓存jar文件多了会占用掉C盘很多空间,鉴于此可更改maven仓库地址来避免. 1. 打开maven解压后目录,找到conf文件夹中的settion.xml文 ...
- 安卓OKhttp请求封装
目前安卓开发中使用的网络工具为OKhttp,但是okhttp的使用还不是很方便,在okhttp的基础上再对请求进行封装会极大的方便网络调用. 下面直接上代码. 请求封装 public class Ht ...