数据库定义功能(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 和 exitsselect * 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);