数据库定义功能(DDL:CREATE\ALTER\DROP)
数据库操作功能(DML:select\delete\update\insert)
数据库保护功能:保护数据完整性和安全性
数据库维护功能:数据库中数据的表结构和数据维护功能
数据库经历的三阶段
网状模型、层次模型、关系模型
实体
:客观事物在信息世界中称为实体属性
:描述实体或者联系的性质或特征的数据项联系
:反应事物内部或事物之间的关联集合【一对一,一对多,多对多】关系
:一个关系就是一个二维表,通常将一个没有重复行没有重复列的二维表看成一个关系,每个关系都有一个关系名元组
:二维表的每一行在关系中成为称为元组,也就是一条记录属性
:二维表的每一列在关系中称为属性域
:属性的取值范围关键字
(主键):关系中唯一能区分、确定不同元组的属性或属性组合
,称为关系的一个关键字关系模式
:对关系(表)的描述; 关系名(属性名1,属性名2,…,属性名n)
选择
(行)、投影
(列)和连接
(笛卡尔积组成新的关系)3种实体完整性(
主键不为空)、参照完整性
(引用完整性,外键存在)、域完整性
(用户定义完整性,限制某个列的取值范围)范式
:关系模式要满足的条件称为规范化形式,简称范式第一范式 1NF
:所有属性为简单属性,每个属性不可再分【无重复的列】第二范式 2NF
:R满足1NF,且每一个非主键字段完全依赖主键,则R满足第二范式第三范式 3NF
:R满足2NF,且非主键字段之间不存在依赖关系(在员工表中,出现部门号之后就不能出现部门名)矩形
实体型;椭圆
实体属性;菱形
实体间的关系;直线连接写m、n、1表示多对多还是一对一还是多对一mysql -u username -p -h myserver -P 3306
p密码 P端口号 默认3306quit 或 exit
退出命令行实用程序SHOW dbname
登录账户后展示已创建的数据库USE dbname
登录账户后打开某个数据库SHOW tables
进入某个数据库后查看已创建的表DISTINCT:Distinct应用于所有列而不是其前置的列
SELECT DISTINCT id, price
:除非id和price都不同,否则所有列将被检出
LIMIT:限制检索的条数
LIMIT 3,4 == LIMIT 4 OFFSET 3
:限制4行,从第三行开始(有第0行)
WHERE : 过滤数据,放在ORDER BY 前
BEYWEEN x1 AND x2 和 >=x1 <=x2
:BETWEEN 包含指定的开始值和结束值;
<、> 、=
:注意是=不是==; <> 和 !=
:不相等;IS NULL
:空值检查; IN (x1,x2,x3)
在这些值中
AND 和 OR
:并列多个条件,AND 优先级比 OR 高 (乘法比加法高)
NOT
:支持 NOT IN、BTEWEEN、EXISTS
%
:任意字符出现任意次数;jet%
:表示jet开头的数据;_
:匹配任意单个字符;REGEXP 操作符+ 正则表达式
.
:匹配单个字符
BINARY
:加该操作符,则不区分大小写 REGEXP BINARY 'jet'
|
相当于or,连接多个正则表达式;REGEXP '1001|1002'
\\
匹配特殊字符; \\.
匹配 .
[]
^
-
相当于or、否定、指定范围;
- REGEXP '[123]001'
匹配1001;2001;3001;[^123]
匹配除123以外的所有字符;[1-3] [a-z]
分别匹配1-3,a-
[:alnum:]
匹配字母和数字,相当于[a-zA-Z0-9]
…还有很多种 P5元字符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 1个或多个匹配,相当于{1,} |
? | 0个或1一个匹配,相当于{0,1} |
{n} | 指定数目的匹配 |
{n,} | 不少于n个的匹配 |
{n,m} | 匹配数目的范围 |
[[:digits:]]{4}
匹配任意4个数字
stricks?
strick或者stricks
定位元字符符
元字符 | 说明 |
---|---|
^ | 文本开始 |
$ | 文本结束 |
[[:<:]] | 词的开始 |
[[:>:] | 词的结尾 |
^[0-9a-zA-Z]
数字和字母开头的字符串;LIKE VS REGEXP
1)LIKE 匹配整个串 ;REGEXP匹配子串
2)WHERE name LIKE '1001'
:不会返回数据,也不会返回name=1001的数据,因为没有使用通配符
WHERE name REGEXP '1001'
:返回name=1001的数据,因为没有符号的正则表达式也有效
ORDER BY:默认ASC升序,DESC 降序
ORDER BY id, price
:先id升序排列;id相同,按price升序排列
聚集函数,AVG() MAX() MIN() COUNT() SUM()
用在SELECT语句;默认为ALL,若不计算相同值,用DISTINCT;
SELECT COUNT(*) FROM t1
:不忽略为NULL的值,COUNT(c1):会忽略c1为NULL的列
SELECT AVG(DISTINCT price) FROM t1
计算不同price的平均值
GROUP BY
数据分组HAVING
过滤 GROUP BY分组SELECT 子句顺序
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
常用函数
文本处理函数
|日期和时间处理函数
数值处理函数
<、>、>=、<=、!=、=
(IN,ALL,ANY)
,其中ANY ALL 需结合 <、>、>=、<=、!=、=、<>
>ANY
=ANY
||| 错误用法:<>ANY
>ALL
<>ALL
||| 错误用法:=ALL
(dept_no id) = (SELECT dept_no,id WHERE...)
join
(联合连接) 和 union
(组合查询)join
是两张表做交连后里面条件相同的部分记录产生一个记录集,union
是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 。union
的两张表需要列数和字段完全匹配 与 Intersect
相同union
自动去重 union all
不去重[inner] join
inner 可忽略left/right [outer] join
outer可忽略 +left join... union right join...
全连接where 条件后为True则被筛选出来
)SELECT * FROM customer c
WHERE not exists (SELECT customer_id FROM order o WHERE c.customer_id=o.customer_id);
in 和 exits
select * from A where id in (select id from B)
select * from A where exists (select 1 from B where B.id = A.id)
窗口函数是一种分析型的 OLAP(Online Anallytical Processing,联机分析处理)函数,意思是对数据库数据进行实时分析处理。
执行顺序:在执行完select之后,在所得结果集之上进行partition
<函数名称> OVER ([PARTITION BY <列名1>, <列名2>, ...] ORDER BY <排序列> [ASC|DESC] ROWS <行范围指定>)
row_num()、rank()、dense_rank()
1234\1223\1223first_value、last_value
取分组内,排序后,截止到当前行第一个值\最后一个值rows unbounded preceding
当前行至第一行rows x following/preceding
当前行到当前行往后/前x行rows between x preceding and y following
从前x到后y行rows between unbounded preceding and unbounded following
从第一行到最后一行INSERT INTO table1
VALUES(NULL,'Pop E.','90046','USA',NULL,NULL);
INSERT INTO table1(name,addr,zip,country)
VALUES('Pop E.','90046','USA');
INSERT INTO table1(name,addr,zip,country)
VALUES('Pop E.','90046','USA'),
('Martian M.','11213','USA');
UPDATE table1
SET name = 'new name',
zip = 'new zip'
WHERE id =10005;
DELETE FROM table1
WHERE id =10005;
NOT NULL
,AUTO_INCREMENT
:只允许一个自增列;DEFUALT
,PRIMARY KEY()
,ENGINE =
--注释
/*
多行注释
*/
CREATE TABLE table1
(
id int NOT NULL AUTO_INCREMENT,
name char(50) NOT NULL DEFAULT 'JACK',
countrt char(50) NULL,
PRIMARY KEY(id)
)ENGINE = InnoDB;
ALTER TABLE table1
ADD c2 int, --新增
ADD CONSTRAINT xxx,
Drop c3, -- 删除列
CHANGE c_old c_new int. -- 修改列名
MODIFY c4, int -- 修改数据类型
FOREIGN KEY (id) REFERENCES table2 (id)
RENAME TABLE new_table1 TO table1,
new_table2 TO table2,
new_table3 TO table3;
DROP TABLE tables
CREATE VIEW view_name
SELECT id
FROM table1
DROP VIEW view_name
CREATE OR REPLACE VIEW view
SHOW CREATE VIEW view_name
创建存储过程
CREATE PROCEDURE procedure_name(
In id INT, //输入参数
OUT p1 DECIMAL(8,2), //输出变量,也可不输出
OUT ph DECIMAL(8,2),
OUT pa DECIMAL(8,2),
)
BEGIN
SELECT MIN(price)
INTO p1
FROM table1
SELECT MAX(price)
INTO ph
FROM table1
SELECT AVG(price)
INTO pa
FROM table1
END
调用:执行存储过程
CALL PROCEDURE procedure_name(1000, //传入输入参数
@price1, //传入参数接受结果
@price2,
@price3);
SELECT @price1;
删除存储过程
DROP PROCEDURE procedure_name
更新存储过程
CREATE OR REPLACE VIEW view
查看创建存储过程的语句
SHOW CREATE PROCEDURE procedure_name
CREATE PROCEDURE procedurename()
BEGIN
DECLARE o INT; // 声明局部变量
DECLARE cursorname CURSOR // 声明游标
FOR
SELECT num FROM orders;
OPEN cursorname;
REPEAT // 循环将查询到的num赋值给局部变量o
FETCH num TO o;
UNTIL done END REPEAT;
CLOSE cursorname;
END
NEW
虚拟表,访问插入的行CREATE TRIGGER trigger_name AFTER INSERT ON table1
FOR EACH ROW SELECT NEW.ordernum;
OLD
虚拟表,访问被删除的行CREATE TRIGGER trigger_name BEFORE DELETE ON table1
FOR EACH ROW
BEGIN
INSERT INTO tabel2(name,id)
VALUES (OLD.name,OLD.id);
END;
NEW
虚拟表,访问更新后的行,BEFORE触发器中可更改需要UPDATE的行的数据OLD
虚拟表,访问被更新的行,只读CREATE TRIGGER trigger_name BEFORE UPDATE ON table1
FOR EACH ROW SET NEW.country = upper(NEW.country);