《深入浅出的SQL》学习笔记
初识SQL
SQL以数据的逻辑集合对数据进行操作。实际上数据是从一个称为表(table)的集合中选出来的。与行处理方式不同,集中处理方式允许程序设计员只告诉数据库需要什么,而不是每一项数据该怎么处理。
行处理:行处理需要程序设计员设计数据怎么处理、同一时间只处理一个记录。
第一章 数据库和表
数据库由表构成,数据库是保存表和其他SQL结构的容器
表是数据库中包含的数据结构
数据库中的信息组成了表
表中的列是数据种类
表中的行是面对一个对象的所有信息
正儿八经
列是存储在表中的一块数据
行是可以描述一件事物的列的集合
列和行构成了表
创建数据库
“>”命令行提示符,在后面添加SQL命令
SQL中数据库名和表名不能出现空格,用”_”代替
- 创建包含所有表的数据库
CREAT DATABASE Lemon_list;
- 进入数据库
USE DATABASE Lemon_list;
-
创建表
CREAT TABLE语句
必须以“;”结尾,用来表示命令结尾 -
数据类型
字符 > VARCHAR
日期 > DARE
记录日期和时间 > DATETIME
预先设定好长度的数据 > CHAR or CHARACTER
负数 > JNT or JNTEGER(jnteger)
大型文本数据 > BLOB
“提供数值空间,知道装满为止 > DEC or DECJMAL
INT” -
检查表
DESC my_contacts;
-
不可以重建已经存在的表或列
-
删除表
DROP TABLE my_concats;
这个操作会删除表及表里的全部内容
9. 向表中添加数据—INCERT语句
INCERT INTO MY_contacts
(column1_name,column2_sex,……)
VALUES
(‘Merry’,’g’,’ ‘……);
注:
1. 列名和输入的信息保持一致
2. 每个列之间用”,”隔开
3. 添加的数据‘’起来
4. int 、dec型数据不许加‘’
5. 改变列名顺序时也要同步修改输入信息的顺序
6. 列名可以省略,但输入信息的顺序必须与列名顺序相同
7. 可以选择性的输入信息,省略部分的列
- SELECT语句查看表中的内容
SELECT * FROM my_countact;
凡是我们没有输入数据的地方都会显示为NULL
11. 设置不接收NULL的列
CREATE TABLE my_lemon
(
last_name VARCHAR(10)NOT NULL,
first_name VARCHAR(10)NOT NULL
);
- deault 设置默认值
在没有特定输入该列的值时,填入默认值
CREATE TABLE my_lemon
(
last_name VARCHAR(10),
first_name VARCHAR(10)NOT NULL,
age INT(2)DEFULT 18
);
第二章 SELECT语句
- WHERE 语句的用法
寻找my_dear
SELECT * From my_contacts WHERE first_name = ‘Isis’;
注:“=”means “是”
“*” means“寻找的范围是所有的列”
- 实例:创建一个数据库并按某一列查询
CREATE DATABASE drink;
USE DATABASE drink;
CREATE TABLE my_drink
(
drink_name VARCHAR(20) NOT NULL,
main VARCHAR(10),
amount1 DEC(2,1),
seconds VARCHAR(20),
amount2 DEC(3,2)
);
INSERT INTO my_drink VALUES
(
‘Blackthorn,Blue Moon,Oh My Gosh,Lime Fizz,Kiss on the Lips‘,‘tonic water,soda,peach,Sptite,cherry juice’,’1.5,1.5,1,1.5,2’,’pineapple juice,blueberry juice,pineapple juice,lime juice,opricot juice’,’1,0.75,1,0.75,7’
);
SELECT * FROM my_drink WHERE drink_name =’Blue Moon’;
第三章 DELETE 和 UPDATE
- 数据类型格式惯例
需要加单引号的数据类型:BLOB、 DATE、 DATETIME、CHAR 、VARCHER
不需要加单引号的数据类型:JNT、INT、DEC
单引号是一个特殊的字符:是SQL中的保留字符,表示文本字符集的开始和结束,总是成对出现。
若是在一个文本中出现单引号,则需➕反斜杠(\’)对单引号进行转义或在单引号前再加一个单引号(’’)。表示这个单引号是字符串 的一部分,这种行为称为转义。 - SELECT特定列来限制结果数量
如何在一张表中之提取出我们想知道的列,而不是将整张表中所有的列都罗列出来呢?
SELECT * FROM My_table;
这里的*表示选取所有的列,那么我们就可以从这里下手:
SELECT drink_name,main,seconds
FROM My_table;
这样我们就得到了所有想要得到的列,
例:如果要寻找名叫Blue Moon的酒的主要成分和价格该怎么做呢?
SELECT drink_name,main,valu
FROM My_table WHERE
drink_name=’Blue Moon’;
注:在文本中选择数据时要在WHERE字句中使用单引号
- 结合查询
如果我想在附近找到一家好吃的火锅店,应该怎么办呢?
SELECT location
FROM My_nearby
WHERE
name=’hotport’
AND
rating=10;
- 比较运算符
评分是10分的火锅店竟然没有!!只能找到一家评分在8以上的火锅店,应该怎么做呢?
SELECT location
FROM My_nearby
WHERE
name=’hotport’
AND
rating > 8;
比较运算符:>、 <、 >=、 <=、<>不等于
- 对文本数据套用比较运算符
小姐姐说有家名字以L开头的火锅店很好吃,但是她忘记了具体的名字,那么我们就可以这样
SELECT location
FROM My_nearby
WHERE
name >= ’L’
AND
name < ’M’;
- OR,只需符合其中一个条件
终于到火锅店了,好渴啊,想喝芒果汁或者苹果汁
SELECT juice_name
FROM juice
WHERE
main= ’mango’
or
main= ’apple’;
- 用IS NULL找到NULL
哎,服务员,那个小哥哥喝的无色的饮料叫什么名字?
SELECT drink_name
FROM drinks
WHERE
color IS NULL;
- 关键字LIKE
糟糕,我忘记小姐姐住在哪里了,是高新区,未央区还是雁塔区?选不了离她家最近的影院了……
SELECT location
FROM My_little_girl
WHERE
location LIKE ‘%xian’;
%即告诉软件我们要找的是以shanxi结尾的值
- 调用通配符
“%” 是未知数量未知字符的替身
“_”是一个未知字符的替身 - 结合AND和比较运算符选取一个范围
小姐姐最近在减肥,只能吃热量在100-120卡路里的甜点,来帮小姐姐选份合适的蛋糕吧
SELECT cake_name
FROM cokes
WHERE
calories<=120
AND
calories>=100;
- 关键字BETWEEN
相当于<= >=,用BETWEEN关键字可以更快的帮小姐姐选蛋糕哦
SELECT cake_name
FROM cakes
WHERE
calories BETWEEN 100 AND 120;
- 关键字IN
其实细心的我知道小姐姐喜欢吃黑森林、芒果慕斯、抹茶切块,给她点其中一种,她对我的好感会不会提升呢?
SELECT cake_name
FROM cakes
WHERE
name IN (‘Black Forest Cake‘,‘Mango Mousse‘,’Cut tea‘);
- 关键字 NOT IN
吃完饭后去给小姐姐试下那条裙子吧,她穿上一定好看极了,但是小姐姐不喜欢橙色和黄色、绿色和棕色
SELECT cloth
FROM cloth_store
WHERE
color NOT IN(‘orenge’,’yellow’,’brown’);
或者
SELECT cloth
FROM cloth_store
WHERE NOT
color IN(‘orenge’,’yellow’,’brown’);
此外,NOT 不仅可以加在IN前,还可以这样用
SELECT location
FROM My_little_girl
WHERE NOT
location LIKE ‘%shanxi’;
这样用
SELECT cake_name
FROM cakes
WHERE NOT
calories BETWEEN 100 AND 120;
但是一定要加在WHERE的后面,当NOT 与AND 或OR一起使用时,也要放在AND 或OR的后面
第四章 聪明的表设计
- DELETE 关键字
小姐姐穿上我选的裙子真的很美,可以从愿望清单上删除这一项啦
DELETE FROM clown_info
WHERE activity=’buy a drice’;
注:
1) DELETE可以删除表中的一行或多行,根据其后面的WHERE子句决定
2) DELETE不可以删除列
3) DELETE后的WHERE语句可以使用AND、OR、LIKE、 BETWEEN、IN、NOT等,且和SELECT的用法相同
4) DELETE FROM your_table;
删除表中的每一行
-
利用INSERT 和DELETE语句更新表中某一行的数据
小姐姐刚刚答应我一起去看电影,但是她想看王牌特工,而不是我准备好的速度与激情。没关系,谁让她喜欢呢,更新数据库吧step1:插入新的数据
INSERT INTO clown_info
VALUES
(‘The Fast and the Furious’,‘2020-5-20’);
step2:删除旧的记录
DELETE FROM clown_info
WHERE
name=’ kingsman’
AND TIME=’ 2020-2-20’;
注:如果不确定你所删除的记录,可以先通过SELEC筛选,确认信息后再进行删除
- DELETE精确版步骤
step1:用SELECT语句挑出你必须删除的记录
SELECT * FROM clown_info
WHERE
name=’kingman’;
step2:用INSERT插入新记录
INSERT INTO clown_info
VALUES
(‘The Fast and the Furious’,‘2020-5-20’);
step3:用DELETE删除旧记录,此时用到的WHERE语句和SELECT用到的WHERE语句相同
DELETE FROM clown_info
WHERE
name=’kingman’;
- 更方便的UPDATE关键字
还是修改电影名的问题
UPDATE clown_info
SET
name=’kingman’
WHERE name=’ The Fast and the Furious’;
UPDATE语句可以改变一列或多列的值,只需在SET语句中加入更多的column=value组就好了
UPDATE可以用来更新一列或多列的值,一切都由WHERE语句决定
- UPDATE能运用在多条记录上,它可以和基本数学运算一起使用,操作数据。
王牌特工居然比速度与激情贵5元,那么两张票就是10元……
UPDATE clown_info
SET
cost=(cost+5)*2
WHERE
name=’kingman’;
第五章 ALTER
- 数据库中各个表之间并没有关系
- 原子性数据(AUTOMIC DATE):当数据具有原子性,则说明已经分隔到最小块,不能再分割
原子性可以提高查询的准确性,提高查询效率
具有原子性数据的表中的规则:- 不会有多个类型相同的值
- 不会有多个存储相同数据的列
- 表的规范化
规范表中没有重复的数据,减小数据库的大小
提高查询效率 - INF第一规范式
每个数据行必须具有原子性
每个数据行都必须有独一无二的是识别项,成为主键(Primary key)
还有第二范式、第三范式,但每多加一条范式就有多加一条更严格、更精确的规则 - 主键:是表中的某一列,可以使表中的每一条记录成为唯一的
注:- 主键不可以为NULL
- 插入新纪录时必须指定主键值
- 主键必需简洁
主键中应只包含独一无二的数据,不包含其他的值 - 主键值不可被更改
主键值必须保持唯一性 - 如何确定一个主键呢?既可以选定自然的值,当然也可以人造一个数值,就像我们的学号,就是人造的独一无二的主键
- 主键的创建一般在CREAT TABLE中进行
- SHOW关键字
我们在前面了解到,如果想要在建好的表中添加一个列,就要重新开始CREAT TABLE,有没有什么更好的办法呢?
SHOW CREAT TABLE My_drink;
返回重建表但没有数据的
使用SHOW返回的代码中列明和表名会有反撇号
除非我们CREAT TABLE时制定默认数据值,否则程序会假设所有数据默认值是NULL
最后一行用来指明数据如何存储和如何使用字符集
不能靠Control+C、Control+V来创建表,需要对返回值进行处理
7. SHOW 的其他用法
SHOW COLUMNS FROM tablename;
显示表中所有列名及其数据类型
SHOW WARNINGS;
在建立和使用数据库时,若收到来自SQL命令所造成的错误信息,键入这个命令可以得到出错详情
8. PRIMARY KEY关键字
小姐姐还在一边,我怎么“跑神”了。我想在小姐姐表中新加一列主键,应该怎么做呢?
step1:
SHOW CREAT TABLE My_gril;
step2:copy返回值中多余的部分,将新的列名加入,并作说明
CREATE TABLE MY_littlegril
(
id INT NOT NULL,
……,
PRIMARY KEY (id)
);
注:主键不能是NULL、最后作说明PRIMARY KEY()
9. 关键字做列名?
加反撇号,但是会在之后处理数据时很麻烦
10. AUTO_INCREMENT关键字 自动递增
CREATE TABLE MY_littlegril
(
id INT NOT NULL AUTO_INCREMENT,
……,
PRIMARY KEY (id)
);
以一开始逐个递增
6. ALTER关键字
ALTER TABLR My_littlegril
ADD COLUMEN id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMIARY KEY(id);
FRIST 把新列放在最前面
下次INCERT新记录时,会给id列自动赋值
第五章
- 关键字AFTER、BEFOR LAST FIRST SECOND THRID等
灵活运用这些关键字来决定你新加入的列的位置
ALTER TABLE My_littlegril
ADD COLUMN id INT NOT NULL AUTO_INCREMENT LAST,
ADD PRIMIARY KEY(id);
哈!你可能要说,现在是新型冠状病毒高发期,你怕是在做梦吧!还想吃火锅,上课都是网络直播!!
嘻嘻,瞒不住你了,我只是一个没有火锅、没有电影、没有小姐姐的宅在家的小姐姐。
希望新型冠状病毒可以更快的得到遏制
中国,快点好起来吧!!
- RENAME表的更名换姓
ALTER TABLE My_littlegril
RENAME TO My_gril
- ALTER和CHANGE关键字
更换列名和数据类型
ALTER TABLE My_gril
CHANGE COLUMN number id INT NOT NULL AUTO INCREMENT FRIST,
ADD PRIMARY KEY(id);
一条语句改变两列列名
ALTER TABLE My_gril
CHANFE COLUMN birthday bir_time DATE,
CHANGE COLUMN datetime da_time DATETIME;
如果修改数据类型,数据类型和原始数据类型可能会丢失数据
即便数据类型相同,也可能会发生截断。
例:varchar(10) 换为char(1) Apple 会变成 A
4. MODIFY关键字
改变列的数据类型但不改变列名
ALTER TABLE My_gril
MODIFY COLUMN birthday DATETIME;
- DROP关键字
删除列
ALTER TEBLE My_gril
DROP COLUMN birthday;
DROP会删除列中所有的数据,使用前最好用SELECT语句确认
6. 字符串函数
字符串函数可以选出文本列中的部分数据串
字符串:CHAR VARCHR中的数据都是字符串
- RIGHR关键字、LEFT关键字
从列中选取指定数量的字符串
SELECT RIGHR(location,2)FROM My_contasts;
- SUBSTRING_INDEX 关键字
SELECT 逗号以前的字符串
SELECT SUBSTRING_INDEX(location,’,’,1) FROM My_contasts;
1:指第一个逗号之前的所有内容
- 字符串辅助函数
字符串辅助函数不会改变表中数据的值,他只是修改字符串格式后返回字符串
1) SUBSRING(your_string,start_location,length)
截取一定长度的字符串
2) UPPER(your_string) LOWER(your_string)
改变整组字符串的大小写
3) REVERSE(your_string)
反转字符串的字符排序
4) LTRIM(your_string) RTRIM(your_string)
清除字符串左(右)的空格后返回字符串
5) LENGTH(your_string)
返回字符串长度
8. 字符串函数的应用
以现有列的内容填入新的表中
例:
UPDATE My_contacts
SET column_name=RIGHT(location,2);
表中每一行中这一列都会被赋予新值,每次一行
注:字符串函数可以和SELECT、UPDATE、DELETE函数使用
第六章 SELECT进阶
本章讲到的函数都不会返回NULL
- ALTER当前数据
根据当前列中的值添加新列的值
UPDATE movie_table SET category =’drama’ WHERE drama=’T’;
CASE表达式
用法:
UPDATE movie_table
SET new_column
CASE
WHEN cloumn1=value1
THEN new_ value 1
WHEN column2=value2
THEN new_ value 2
WHEN column3=valumn3
THEN new_value3
ELSE new_value4
END;
- ORDER BY关键字
- 将某一列的数据按顺序排列
将A开头的该列记录排列,返回电影名和评分
SELECT film_name,grade
FROM movie_table
WHERE
film_name LIKE ‘A’
category=’family’
ORDER BY title;
将所有记录按顺序排列
将A开头的该列记录排列,返回电影名和评分
SELECT film_name,grade
FROM movie_table
WHERE category=’family’
ORDER BY title;
数字开头会在前面
NULL会在数字前面
大写字母在小写字母前
A 1在A1前
2) 按两列或多列进行排序
SELECT film_name,grade
FROM movie_table
WHERE category=’family’
ORDER BY title,purchased,……;
查询结果会先按title列排序,再按purchased列排序
3) DESC反转查询结果顺序
用于ORDER BY 子句中的列名后,用来反转查询结果的顺序
4) ASC默认排序
与DESC放置位置相同
3. 函数:对数据值进行操作
4. SUM函数
将整列的值加总
SELECT SUM(sales)
FROM cookie_sales
WHERER name=’Lory’;
在WHERE中添加选择范围
5. GROUP BY关键字
完成分组加总
SELECT first_name,SUM(sales)
FROM cookie_sales
GROUP BY first_name
ORDER BY SUM(sales) DESC;
返回frist_name和SUM两列
6. AVG函数
对所有的列按要求汇总求平均
SELECT frist_name,AVG(sales)
FROM cookie_sales
GROUP BY frist_name;
- MIN MAX返回最大值最小值
SELECT frist_name,MAX(sales)
FROM cookie_sales
GROUP BY frist_name;
返回每个女孩的最高销量
先按女孩名称进行分类,在返回每一个女孩的最高销量
MIN用法与MAX函数用法相同,返回最小值
8. COUNT 函数
返回指定列中的行数
SELECT frist_name,COUNT(sales)
FROM cookie_sales
GROUP BY frist_name;
返回每个女孩的销售天数
9. DISTINCT关键字
返回所要求列中值不同的一列
10. LIMIT函数返回特定数量的列
- LIMIT+数量
SELECT frist_name,SUM(sales)
FROM cookie_sales
GROUP BY frist_name
ORDER BY SUM(sales)DESC
LIMIT 2;
只返回总销售量排在前二的姓名和销售量
2. LIMIT(0,1);
从第一个记录开始返回1个记录
SELECT frist_name,SUM(sales)
FROM cookie_sales
GROUP BY frist_name
ORDER BY SUM(sales)DESC
SELECT(1,1);
只返回销售量排在第二的姓名和销售量
第七章 多张表的数据库设计
-
clown_tracking数据库模式
模式(schema)用于表达数据库内的结构,包括表和列,还有各个表之间的连接方式 -
创建图表:为表创建图表可以协助我们分别看待表中的设计和其中的数据
-
外键:指表中的某一列数据借用了其他表的主键
注:- 外键必须用ALTER或 CREAT 语句来指定
- 外键使用的主键被称为父键(parent key)
- 主键使用的表被称为父表(parent table)
- 外键用于确认一张表中的某一行与另一张表中的某一行相对应
- 外键可以不唯一
- 外键值可以为NULL,表示在父表中没有相符的主键
-
外键约束
约束:创建在结构内的键被称为约束
引用完整性:插入外键的值必须来源于父表的来源列中,被称为引用完整性
如果违反了规则,约束会阻止我们破坏表
可以使用外键来引用父表中的唯一值
外键不一定必须是父表的主键,但必须具有唯一性。 -
数据库模式
- 表中间的关系
一对一 - A表中某条记录只能与B表中的一条记录相对应
一对多 - A表中某条记录能与B表中的多条记录对应
但B表中的某条记录只能与A表中的一条记录相对应 - 多对多
- 表中间的关系
-
数据模式:junction table
将两个表连在一起,需要一个junction table,存储着两个表中的用来存储两张表的主键。再遇到多对多的数据库模式时,则需要通过junction table链接两张表。
通过junction table链接表时有几种方式,分别为:
外链接,内链接,- 第一范式(first normal form):数据列只包含具有原子性的数据,没有重复的数据组
- 第二范式(second normal form):只要所有列都是主键的一部分,或表中有唯一的主键列夫和第一范式,则符合第二范式
- 第三范式(third normal form):如果表中只有一条主键,且没有其他的组合键,则符合第三范式
-
组合键:当使用一列数据不唯一,可以通过两列数据组合在一起作为外键使用,所有的行都会具有唯一性,这就是组合键
-
函数依赖:当某列数据必须随着另一列的数据改变而改变,表示第一列函数依赖于第二列
表示函数依赖的方式X.Y →X.Z
X表示表的名称,Y表示表中的某条记录 -
部分函数依赖:在表中只有部分列与其他列有函数依赖关系,则称这张表具有部分函数依赖
-
传递依赖:对于任何非键列,如果改变某列的数据可能造成其他列的数据的改变,即为传递依赖
第八章 联结与多张表的操作
- 预填充表
如何将父表中某列的值(例:fruit列:apple ,banana, pear)分别填充到子表中,占有子表中的一行?
UPDATE My_contacts
SET fruit1=SUBSTRING_INDEX(fruits,’,’,1)
SET fruits=SUBSTR(fruits,LENTH(fruit 1)+2)
SET fruit2=SUBSTRING_INDEX(fruit,’,’,1)
SET fruits=SUBSTR(fruits,LENTH(fruit 2)+2)
SET fruit1=SUBSTRING_INDEX(fruits,’,’,1)
SET fruits=SUBSTR(fruits,LENTH(fruit 3)+2)
- 查询的三种方法:即将父表中的数据填入子表,并设置主键
1.
CREATE TABLE fruits
(
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
fruits varchar(10)
);
INCERT INTO fruits(fruit)
SELETE fruits FROM My_fruit
GROUP BY fruits
ORDER BY fruits;
CRETE TABLE fruits AS
SELECT fruits FROM My_contacts
GROUP BY fruits
ORDER BY fruits;
ALTER TABLR fruits
ADD COLUMN id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
ADD fruits varchar(10);
CREAT TABLE fruits
(
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
fruits varchar(10)
)AS
SELETE fruits FROM My_contacts
GROUP BY fruits
ORDER BY fruits;
- AS关键字
可以讲SELECT的数据全部填入新的表中 - 列的别名(相关名称)
为了简化查询,可以在第一次出现列的名称时AS后加上列的别名 - 内连接
- 内链接:内链接其实是通过查询中的某些条件移除某些数据的交叉连接
- 交叉连接:CROSS JOIN
将两张表中的数据分别连在一起,A表中每条记录中的数据分别与B表中的数据连接在一起
4*5 的两张表 会产生20条记录
交叉连接可以用来测试软件及其配置的速度
SELECT boys.boy ,boys.toy
FROM boys
CROSS JOIN
toys;
3. 相等连接:返回两列数据相同的数据
SELECT boys.boy ,boys.toy
FROM boys
INNER JOIN
toys
ON boys.boy_id=boys.toy_id;
- 不等链接:返回两列数据不相同的数据
SELECT boys.boy ,boys.toy
FROM boys
INNER JOIN
toys
ON boys.boy_id<>boys.toy_id;
5. 自然连接:自然连接只有在连接的列在两张表中名称i相同的数据
SELECT boys.boy ,boys.toy
FROM boys
NORMAL JOIN
toys;
- 外连接
- 笛卡尔连接
- 叉积
- 联合查询:查询中的查询
在两张或多张表中查询数据时,需要多个条件
第九章 查询中的查询
1.
SELECT boys.boy ,boys.toy
FROM boys
INNER JOIN
toys
ON boys.boy_id=boys.toy_id
WHERE
boys.interest IN
( );
括号外的部分叫做外层查询,括号内的称为内部查询或子查询,即使再符合外层查询的条件上符合子查询的条件
将所有的文件放进一个根目录下
第十章 外联接、自联接与联合
- 外联接:一定会返回数据行,无论左右表中是否能找到匹配的项;返回某表中所有的记录和另一张表中所有相符的记录
- 左外联接(LEFT OUTER JOIN):会匹配左表中的所有值与右表中所有符合条件的值。在其返回的结果中所有集中的NULL表示左表中没有找到和右表符合的记录
- 右外联接(RIGHT OUTER JOIN):匹配右表中所有值与左表中所有符合条件的值。
- 一个表可以同时作为左表和右表
- 自引用外键:自引用表示引用同一张表中的另一列的键
- 自联接(SELF_JOIN):能将单一表当成两张具有相同性质的表进行查询
- 联合(UNION):另一种从多张表中取得数据的方式
SELECT ……
UNION
SELECT ……
规则:
1) 每一个SELECT语句中列的个数必须相同
2) 每个SELSECR语句中包含的表达式与统计函数也必须相同
3) SQL会自动清除SELECT结果中重复的值
4) 列的数据类型必须相同或者可以相互替换
5) UNION ALL查看所有返回数据不清除重复的列 - 从联合创建表
CREAT TABLE My_job AS
SELECT title FROM xxx
SELECT title FROM xxx
UNION
SELECT title FROM xxx;
- INTERSECT (交集) EXCEPT (差集)
INTERSECT返回两个查询结果中的相同值
SELECT title FROM xxx
INTERSECT
SELECT title FROM xxx;
EXCEPT返回两张表中不同的值
SELECT title FROM xxx
EXCEPT
SELECT title FROM xxx;
第十一章 约束、视图与事务
- 检查约束(CHECK):限制可以插入某个列中的值,与WHERE语句相同都使用相同的条件表达式
约束:限制可以插入表中的值 - 视图:是一张虚拟表,和其他表一样可以执行表的操作,
但是虚拟表不会保存在数据库中
将查询保存在数据内
CREATE VIEW name AS ……;
SELECT * FROM name;/* 查看视图*/
SHOW TABLE;显示视图
1) 将复杂的查询简化为一张表
2) 即使破坏表的数据结构,也不会破坏以来表的应用程序
3) 创建视图可以隐藏读者无需看到的信息
- FROM语句需要表
当SELSECT查询的结果是一张虚拟表时,若没有别名,SQL就无法取得其中的表 - 利用视图进行插入、更新和删除
但若视图中使用了统计函数(SUM 、MAX、 MIN等),则无法用视图改变数据。如果视图中包含ORDER BY、GROUP BY等也不能改变数据 - 带有CHECK OPTION的视图
检查每个进行INCERT或DELETE的查询,根据视图中的WHERE语句来决定这些查询是否可以继续进行 - 可更新视图:包含引用表里所有为NOT NULL的列
- 当视图使用完后:DROP VIEW name;
- 事务:在事务中如果所有步骤无法在正常条件下运行,则不会完成任何单一的步骤
START TRANSACTION;
COMMIT;所有程序代码发生改变
ROLLBACK;所有代码
在COMMIT之前数据库不会发生任何改变
9. 事务满足的性质:原子性、一致性、隔离性、持久性
10. 在使用事务之前必须采用正确的存储引擎,也就是在创建表时括号外的代码。必须是BDB或InnoDB之一
第十二章 安全性
11. 保护用户账号:
SET PASSWORD FOR’root’@localhost’ =PASSWORD(‘bashei23bcd’);
13. 根用户:默认为数据库的第一个用户,通常具有数据库的所有操控能力
14. 创建新用户:
CREAT USER Larry IDENTIFIED BY ‘ajh34d7uwia’;
- 给用户授权(GRANT):可以控制用户对表和列进行的操作
GRANT SELECT My_contacts TO Lrry;
撤销权限(REVOKE):
REVOKE SELECT My_contacts TO Lrry;
REVOKE……CASCADE;表示权限的撤销具有连锁反应,包括目标在内的被授权的人的权限都会被撤销。默认
REVOKE……RESTRICT;如果有人会受到影响,即可返回错误信息
16. 授权许可(GRANT OPTION)
17. 角色(role):
CREATE ROLE manager;创建
GRANT SELECT ON My_contacts TO manager;授予权限
GRANT manager TO Larry;授予角色
DROP ROLE manager;撤销角色
- WITH ADMIN OPTION:允许用户将角色授予其他人
GRANT manager TO Larry WITH ADMIN OPTION;
附录
-
特殊字符
-
四则运算 + - * /
-
比较运算符
-
ANY、ALL、SOME
ANY:大于号后面加上ANY会返回任何大与集合中的最大值;小于号后面加上ANY返回任何小于集合中的最小值
ALL:大于号后面加上ALL会返回任何大与集合中的最小值;小于号后面加上ALL返回任何小于集合中的最大值
SOME=ANY -
数据类型
BOLEAN:存储“true”或“false”或NULL
INT:0~4294957295
INT(SIGED):无符号整型
BIGINT:9223372036854775808
SMALLINT:-32768~32767
DATE:YYYY-MM-DD
DATETIME: YYYY-MM-DD HH-MM-SS
TIMESTAMP:YYYYMMDDHHMMSS
TIME: HH:MM:SS -
临时表
保存中间结果、捕获某个时刻表中的内容
CREATE TEMPORARY TABLE name(); -
转换数据类型:CAST (your-column,type);
将字符串格式的时间转换为DATE格式
将整数转换为浮点数 -
查看当前使用账号:SELECT CURRENT_USER
-
查看时间:SELECT CURRENT_DATE
-
数字函数
2020年5月28日第一次修改
发现了许多非常愚蠢的错误,已经修改部分。