您的位置:首页 > 数据库

[SQL]Head First SQL 入门书籍内容总结

2017-12-20 11:19 183 查看
1 创建数据库:

 CREATE DATABASE gred_lists;

 USEgred_lists;

 

2 设定表:

CREATE TABLE doughnut_list

(doughnut_name VARCHAR(10),

 Doughnut_typeVARCHAR(6)

);

 

3 查看与检查目标表:

DESC my_contacts;

 

4 删除表:

DROP TABLE my_contacts;

 

5 插入观测:

INSERT INTO my_contacts

(last_name, first_name, email,gender,birthday)

VALUES

(‘Anderson’,’Jillian’,’jill-anderson@breakpizza.com’,’F’,’1980-09-05’);

 

其中VARCHAR CHAR DATE 和 BLOB类型都必须添加单引号。

 

6 设置非空

CREATE TABLE my_contacts

(last_name VARCHAR(30) NOT NULL,

 first_name VARCHAR(20) NOT NULL

);

 

7 设置默认值 DEFAULT

CREATE TABLE doughnut_list

(doughnut_cost DEC(3,2) NOT NULL DEFAULT1.00);

 
二 SELECT查询

1 双重条件用AND(同理有关键字OR)

SELECT location FROM doughnut_ratings

WHERE type=’plain glazed’

AND

rating=10;

 

2 比较符(文本也可以比较)

SELECT drink_name

FROM drink_info

WHERE

drink_name>=’L’

AND

drink_name<’M’

 

3
选出缺失值 IS NULL

SELECT drink_name

FROM drink_info

WHERE

calories IS NULL;

 

5 使用通配符查找

SELECT * FROM my_contacts

WHERE location LIKE ‘%CA’

 

其他通配符:_

 

6 范围用BETWEEN

SELECT drink_name FROM drink_info

WHERE calories BETWEEN 30 AND 60;

 

7 需要使用多个OR时,使用关键字IN

SELECT data_name

FROM black_book

WHERE rating (NOT) IN (‘innovative’,’fabulous’,’delightful’,’prettygood’);

 

8 NOT 与BETWEEN和LIKE 一起用的时候

SELECT drink_name FROM drink_info

WHERE NOT carbs BETWEEN 3 and 5

AND NOT dat_name LIKE ‘% B’;

 
三 DELETE&UPDATE

1 DELETE语句

DELETE FROM down_info

WHERE 条件

 

2创建新纪录并删除旧记录

INSERT 与 DELETE

 

3 UPDATE 改变数据

(1)    UPDATE doughnut_rtings

SET

type=’glazed’,date=’9.27’

WHERE 条件

(2)    利用表达式

UPDATE drink_info

SET cost=cost+1

WHERE

drink_name=’Blue Moon’;

 

 
四 聪明表设计

1 查看创建表的代码

SHOW CREATE TABLE my_contacts;

 

2 创建主键

CREATE TABLE my_contacts

(contact_id INT NOT NULL,

Profession VARCHAR(50) DEFAULT
NULL,

PRIMARY KEY(contact_id)

);

 

3 设计自动递增的主键

CREATE TABLE my_contacts

(contact_id INT NOT NULL AUTO_INCREMENT,

PRIMARY KEY (contact_id)

);

 

4 为已经设计好的表添加主键

ALTER TABLE my_contacts

ADD COLUMN contact_id INT NOT NULLAUTO_INCREMENT FIRST,

ADD PRIMARY KEY(contact_id);

 
五 ALTER

1 添加列(可先用DESCRIBE 查看数据类型和主键)

ALTER TABLE my_contacts

ADD COLOMN phone VARCHAR(10)LAST/FIRST/SECOND/BEFORE last_name;

 

2  改表名

ALTER TABLE projeckts

RENAME TO project_list;

 

3
更改列名

ALTER TABLE project_list

CHANGE COLUME number proj_id INT NOT NULL AUTO_INCREMENT,

ADD PRIMARY KEY (proj_id);

 

4 一条SQL的ALTER可同时改变两列,但应该加上逗号

ALTER TABLE project_list

CHANGE COLUMN descriptionofproj proj_descVARCHAR(100),

CHANGE COLUMN contactoronjob con_nameVARCHAR(30);

 

5 只改变列的类型:

ALTER TABLE project_list

MODIFY COLUMN proj_desc VARCHAR(120);

 

6删除列

ALTER TABLE project_list

DROP COLUMN start_date;

 

7 字符串函数

SELECT RIGHT(column1,2) FROM my_contacts;

SELECT SUBSTRING_INDEX(column1,’,’,1) FROMmy_contacts;

字符串函数不会改变存储在表中的内容

 

8 以现有列的内容填入新列

UPDATE my_contacts

SET state=RIGHT(location,2);

 
六 SELECT进阶

1 CASE(CASE可搭配UPDATE,SELECT,INSERT,DELETE等),需要加上END。

UPDATE my_table

SET new_colume=

CASE

 WHEN column1=somevalue1

    THEN newvalue1

 WHEN column1=somevalue2

    THEN newvalue2

 ELSEnewvalue3

END;

 

2 ORDER

SELECT title,catalogy

FROM movie_table

WHERE

title LIKE ‘A%’

AND

catalog=’family’

ORDER BY title ASC,purchased DESC;

 

3 分组加函数(例子实现了分组求和)

SELECT first_name,sum(sales)

FROM cookie_sales

GROUP BY first_name

ORDER BY SUM(sales) DESC;

 

其他函数:MAX(),MIN(),AVG(),COUNT()

SELECT COUNT(DISTINCT sale_date)

FROM cookie_sales;

 

4 LIMIT函数,两个参数(a,b)表示从a计数,b个记录

SELECT first_name,SUM(sales)

FROM cookie_sales

GROUP BY first_name

LIMIT 2;

 
七多张表的数据库设计

1 外键:表中某一列作为新表的主键

引用完整性:插入外键列的值必须已存在于父表来源列。

 

2 创建带有外键的新表

CREATE TABLE interest

(int_id INT NOT NULL AUTO_INCREMENT PRIMARYKEY,

interest VARCHAR(50) NOT NULL,

contact_id INT NOT NULL,

CONSTRAIN my_contacts_contact_id_fk

FOREIGN KEY (contact_id)

REFERENCES my_contacts(contact_id)

);

 

3 表间关系数据模式:

一对一;一对多;多对多(利用junction table)

 

4 INF

(1)    数据列只包含具有原子性的值

(2)    没有重复的数据组

 

5 数据依赖于某列

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

(2)    传递函数依赖:任何非键列与另一个非键列有关联

 

6 2NF

只要所有列都是主键的一部分或者表中有唯一主键列符合1NF的表也会符合2NF。

Rule1:1NF

Rule2:没有部分函数依赖性

 

7 3NF

Rule1:2NF

Rule2:没有传递函数依赖性

 
八链接与多张表操作:

1 出现了interest列中有多个兴趣值时,不满足原子性:

UPDATE my_contacts SET

interest1=SUBSTRING_INDEX(interest,’,’,1);

interest=SUBSTR(interest,LENGTH(interest1+2));

interest2=SUBSTRING_INDEX();

 

2 找出一张表中的profession且不重复

(1)先CREATE,然后利用SELECT进行INSERT

CREATE TABLE profession

(id INT(11) NOT NULL AUTO_INCREMENT PRIMARYKEY

profession VARCHAR(20)

);

INSERT INTO profession

  SELECTprofession FROM my_contacts

 GROUP BY profession

 ORDER BY profession;

(2)SELECT 进行CREATE,然后ALTER 添加主键

CREATE TABLE profession
AS

 SELECT profession FROM my_contacts

 GROUP BY profession

 ORDER BY profession;

ALTER TABLE profession

ADD COLUMN id INT(11) NOT NULLAUTO_INCREMENT FIRST,

ADD PRIMARY KEY(id);

(3)利用CREATE同时完成

CREATE TABLE profession

(id INT(11) NOT NULL AUTO_INCREMENT PRIMARYKEY,

profession VARCHAR(20)

)
AS

 SELECT profession FROM my_contacts

 GROUP BY profession

 ORDER BY profession;

 

3 列别名与表别名

 

4 交叉连接(行数n1*n2)

SELECT t.toy, b.boy

FROM toy AS t

     CROSS JOIN

     boy AS b;

 

5 内联结

(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;

 

(3) 自然联结:

SELECT boys.boy toys.toy

FROM boys

     NATURAL JOIN

     toys;

自然连接是通过对参与表关系中所有同名的属性对取等(即相等比较)来完成的,故无须自己添加连接条件

与外连接的区别在于对于无法匹配的记录外连接会虚拟一条与之匹配的记录来保全连接表中的所有记录,但自然连接不会

 
九 子查询

1 子查询

SELECT mc.first_name,mc.last_name,mc.phone,jc.title

FROM job_current AS jc NATURAL JOINmy_contacts AS mc

WHERE jc.title IN

 (SELECT title FROM job_listings);

 

2 作为选取列的子查询

SELECT mc.first_name,mc.last_name,

(SELECT state FROM zip_code WHEREmc.zip_code=zip_code)AS state

FROM my_contacts mc;

 

3 非关联子查询:子查询可以独立运行且不会引用外层查询的任何结果

 

4 有多个值的非关联子查询:利用 IN或者 NOT IN

 

5 关联子查询

SELECT mc.first_name,mc.last_name

FORM my_contacts AS mc

WHERE 3=(SELECT COUNT(*) FROMcontact_interest WHERE contact_id=mc.contact_id);

 

6 搭配NOT EXISTS的关联子查询

SELECT mc.first_name firstname,mc.last_namelastname,mc_email email

FROM my_contact mc

WHERE NOT EXISTS

(SELECT * FROM job_current jc WHEREmc.contact_id=jc.contact_id);

 
十 外联结 自联结和联合

1 左外连接

SELECT g.girl,t.toy

FORM girls g

LEFT OUTER JOIN toys t

ON g.toy_id=t.toy_id;

 

左外联结的结果中NULL表示右表中没有找到与左边相符的记录

 

2 自联结

SELECT c1.name,c2.name AS boss

FROM clown_info c1

INNER JOIN clown_info c2

ON c1.boss_id=c2.boss_id;

 

3 三张表都有一个相同列时可以使用UNION

(1)   每个SELECT 中的列数必须一致

(2)   会清除重复记录,使用UNION ALL可以保存重复记录

SELECT title FROM job_current

UNION

SELECT title FROM job_desired

UNION

SELECT title FROM job_listings

ORDER BY title;

 

4 与UNION 用法差不多的还有INTERSECT(交集)和EXCEPT(子集)

 

5 把子查询转化为联结可以提高查询速度

SELECTmc.first_name,mc.last_name,mc.phone,jc.title

FROM job_current AS jc NATURAL JOINmy_contacts AS mc

WHERE jc.title IN

 (SELECT title FROM job_listings);

 

SELECTmc.first_name,mc.last_name,mc.phone,jc.title

FROM job_current AS jc NATURAL JOINmy_contacts AS mc

INNER JOIN job_listings jl

ON jc.title=jl.title;

 

 
十一 约束视图和事务

1 检查约束CHECK

CREATE TABLE piggy_bank

(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY

coin CHAR(1) CHECK(coin IN (‘P’,’N’,’Q’,’D’))

);

 

2 创建视图

CREATE VIEW web_desighners AS

SELECT 语句

 

3 删除视图

DROP VIEW pb_dimes;

 

4 事务:一群可以完成一组工作的SQL查询

如果所有步骤无法不受干扰地完成,则不该完成任意单一步骤

原子性;一致性;隔离性;持久性

 

START TRANSACTION;

COMMIT;

ROLLBACK;

 
十二 安全性

1 根用户ROOT

SET PASSWORD FOR‘root’&’localhost’=PASSWORD(‘sd89as8daf’)

 

2 添加用户

CREATE USER elsie

IDENTIFIED BY ‘8a989g9s8sa’

 

3 授予权限

GRANT SELECT ON

clown_info

TO elise

WITH GRANT OPTION;

 

4 收回权限

REVOKE SELECT ON

clown_info

FROM elise; CASCADE/RESTRICT;

CASCADE:有连锁反应

RESTRICT:还有别人受到影响就报错

 

5角色

(1)    创建

CREATE ROLE data_entry;

GRANT SELECT,INSERT ON some_table TOdata_entry;

(2)    使用

GRANT data_entry TO doc;

(3)    卸除角色

DROP ROLE data_entry;

(4)    授予角色的功能

GRANT data_entry TO doc

WITH ADMIN OPTION;

(5)    收回权限

REVOKE data_entry FORM doc CASCADE/RESTRICT

 

6 结合CREATE USERS 和 GRANT

GRANT SELECT ON

clown_info

TO elsie

IDENTIFIED BY ‘sda98f9a8e’;

 
重要概念:
一了解数据库建模
在设计数据库时,对现实世界进行分析、抽象、并从中找出内在联系,进而确定数据库的结构,这一过程就称为数据库建模。它主要包括两部分内容:确定最基本的数据结构;对约束建模。
数据库设计(DatabaseDesign)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。
二 ER模型
E-R图也称实体-联系图(EntityRelationship
Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型
它是描述现实世界关系概念模型的有效方法。是表示概念关系模型的一种方式。用“矩形框”表示实体型,矩形框内写明实体名称;用“椭圆图框”表示实体的属性,并用“实心线段”将其与相应关系的“实体型”连接起来;
用”菱形框“表示实体型之间的联系成因,在菱形框内写明联系名,并用”实心线段“分别与有关实体型连接起来,同时在”实心线段“旁标上联系的类型(1:1,1:n或m:n)。
   实体:公司-部门-员工-商品-厂家

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: