一、数据库的概念
- 什么是数据库(DataBase)
- 用于存储和管理数据的仓库,简称DB
- 数据库的特点***
- 持久化存储数据的(硬盘).实际上数据库就是一个文件系统
- 方便存储和管理数据(对数据进行增删改查)
a) -DBMS(数据库管理系统)
i. MySQL—>很多数据库—>很多表—>很多列—>具体数据 - 3)使用了统一的方式操作数据库–SQL
a) 多种DBMS通用的语法–SQL - 常见的数据库软件
a) MySQL 默认端口是3306
b) Oracle
c) db2
二、MySQL数据库-端口号3306 - MySQL数据库的安装
a) 详见操作手册 - MySQL建议用360卸载
a) 详见操作手册 - 配置
a) *查看状态 - win+R services.msc
- netstat -ano | findStr"3306"
a) *开启服务(管理员身份运行cmd)
b) net start mysql
c) *关闭服务(管理员身份运行cmd)
d) net stop mysql - MySQL的登陆和退出
- 本地mysql
b) *MySQL数据库的登陆(本地)
c) -mysql -u+用户名 -p
d) 输入密码(此时密码是密文显示)
e) -或者mysqul -u+用户名 -p+密码
f) -当前用户密码 mysql -uroot -proot
g) *MySQL数据库的退出
h) -exit/quit
- 2)远程登陆
a) *MySQL数据库的登陆(远程)
b) mysql -h+ip -u目标的用户名 -p目标的密码
c) *退出
d) -exit/quit - MySQL的目录结构(了解)
- MySQL安装目录
b) my.ini是配置文件,可以修改
- 2)MySQL数据目录
a) 在my.ini可以查看到
b) #Path to the database root
c) datadir=“C:/ProgramData/MySQL/MySQL Server 5.5/Data/” - 3)几个概念:
a) 数据库-文件夹
b) 表-文件
c) 列-表的一部分,相当于表头
d) 数据-存储的数据 - 6.SQL语法*****
- 什么是SQL?–Structure Query Language:结构化查询语言
- 它定义了操作所有关系型数据库(Relational DataBase)的规则
- 2)SQL的通用语法
a) *SQL语句可以单行或多行书写,以分号结尾
b) *可以使用空格和缩进来增强语句的可读性
c) *MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
d) *3种注释
- -单行注释: – 注释 或 # 注释
- -多行注释: /* 注释 */
- 注意:空格一定要打, #注释是MySQL的特有语法,可以不用空格,建议使用通用语法
- SQL的分类*****面试可能会用到
e) *DDL 数据定义语言-Data Definition Language - 操作数据库的语言:对数据库和表的增删改查
f) *DML 数据操纵语言-Data Manipulation Language - 增删改表中的数据
g) *DQL 数据查询语言-Data Query Language - 查询表中的数据
h) *DCL 数据控制语言-Data Control Language - 对用户权限的设置
- DDL:操作数据库、表 - 以文件夹SQL语句内容为主
- 操作数据库:CRUD
b) *C(Create):创建 CREATE
- SELECT DATABASE();
c) *R(Retrieve):查询 SHOW
d) *U(Update):修改 ALTER
e) *D(Delete):删除 DROP
f) *使用数据库:USE 数据库名称; 不是USE DATABASE 数据库名称
- 操作表:CRUD
g) *C(Create):创建 CREATE
- -CREATE TABLE 表名(
- 列名1 数据类型1,
a) 列名2 数据类型2,
b) …
c) 列名N 数据类型N
d) ) - 注意:最后一列,不需要加逗号.
- -数据库类型:
- **int 整数类型
a) **double 小数类型 double(5,2)表示长度5,小数点后保留两位
b) **date 日期,只包含年月日, yyyy-MM-dd;
i. datetime 日期,包含年月日时分秒,yyyy-MM-dd HH:mm:ss
ii. timestamp:时间戳类型:包含年月日时分秒 **和datatime的区别,面试
iii. 如果不给这个字段赋值,默认为当前系统时间
c) 字符串面试题
i. varchar:字符串 varchar(20) 表示最大20个字符
ii. char:char(长度)
iii. text:定义不需要给长度,保存超大文本/和文本文件
iv. 注意:char和varchar在定义的时候必须给长度 varchar(30),char(20)
v. char和varchar的区别:如果存入长度小于给定长度,char用空格补满
i. 而varchar的长度根据输入字符串内容改变
h) -复制表 CREATE TABLE stu LIKE student;
i) *R(Retrieve):查询 SHOW TABLES/DESC(descraption) 表名
i. SHOW CREATE TABLE
j) *U(Update):修改 ALTER
- -修改表名 ALTER TABLE 表名 RENAME TO 新的表名
i. RENAME TABLE 表名 TO 新表名 - -修改表的字符集 ALTER TABLE 表名 CHARACTER SET 字符集名
- -添加一列 ALTER TABLE 表名 ADD 列名 数据类型;
- -修改一列 ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
i. ALTER TABLE 表名 MODIFY 列名 新数据类型; - -删除列: ALTER TABLE DROP 列名;
k) *D(Delete):删除 DROP
- DML:增删改表中的数据
- 添加数据:
b) *语法: - INSERT INTO 表名(列名1,列名2,…,列名N) VALUES(值1,值2,…,值N),(值1,值2,…,值N)
c) *注意: - 列名和数据要一一对应
- 如果表名后不写内容,则给所有列添加值
- 除了数字类型,其他类型需要使用引号引起来,单双引号都可以
- 删除数据
d) *语法
- DELETE FROM 表名 WHERE 条件;
- TRUNCATE TABLE 表名;
e) *注意 - 如果不加条件,则删除表中所有记录,如果要删除所有数据,建议使用TRUNCATE TABLE,效率高
- truncate先删除表,再创建一张一模一样的表,效率高,推荐使用
f) *TRUNCATE 和 DELETE FROM 的区别*****面试题 - –DELETE属于DML(可以通过事务进行还原),TRUNCATE属于DDL(不能通过事务进行欢颜)
- 修改数据
g) *语法
- UPDATE 表名 SET 列名 = 值,列名2=值2 WHERE 条件
h) *注意: - 如果不加条件,表内的所有数据都会被修改
- DQL:查询表中的记录
a) *SELECT * from 表名;
SQL查询语句
一、DQL查询语句
- 基本查询
a) IFNULL(字段,替换的值) 字段的值为NULL则改为的替换的值
字段 AS 别名 可以给字段写别名
AS可以省略,直接谢伟字段 别名
b) 公式!****
c) SELECT 列名 FROM 表名
d) WHERE 条件
e) GROUP BY 列名 HAVING 条件
f) ORDER BY ASC/DEDC
g) LIMIT 索引,条数 - 条件查询
a) *运算符
-<>不等,=等于,!=不等(不建议)
-BETWEEN 值 AND 值 是闭区间
-IN(集合)
-LIKE 模糊查询 %任意多个字符,_一个字符
-&& || ! 建议用AND 和 OR NOT - 排序查询
a) *语法:
ORDER BY 排序字段1 排序方式1,排序字段2 排序方式2
b) *排序方式:
ASC:升序,默认的 Ascending - DESC:降序 Descending
c) *注意:
如果有多个排序规则,只有当前一个规则生效后后一个规则才会生效 - 聚合函数->将一列数据作为一个整体,进行纵向计算
- COUNT:计算个数
b) -一般选择非空的列来计算(主键)
-COUNT(*) 也可以避免自动排除NULL的问题,但不推荐使用 - MAX:计算最大值 数字/日期
- MIN:计算最小值 数字/日期
- 4)SUM:求和 数字
- AVG:计算平均值 数字
- 语法:
b) SELECT 聚合函数(字段) FROM 表名称 - 注意:聚合函数一般都是配合分组使用
- 注:聚合函数的计算会排除NULL值
- 5.分组查询
a) *语法:
b) GROUP BY 分组字段
c) *注意:
d) 分组之后查询的字段必须为分组字段或聚合函数
e) *WHERE和HAVING的区别-******面试题可能考
-WHERE在分组之前进行限定,如果不满足条件,则不参与分组;HAVING在分组之后进行限定,如果不满足条件,则不会被查询出来
-WHERE后不可以跟聚合函数,HAVING可以进行聚合函数的判断 - 6.分页查询
a) *语法:
LIMIT 开始的索引,每页查询的条数
b) *公式:
开始的索引 = (页码-1)*每页显示的条数
c) *注意:
LIMIT语法是一个"方言",只能在MySQL中使用
二、约束 - 约束的概念
a) 对表中的数据进行限定,保证数据的准确性、有效性和完整性 - 约束的分类
- 主键约束:PRIMARY KEY [AUTO_INCREMENT]
- 非空约束:NOT NULL
- 唯一约束:UNIQUE
- 外键约束:FOREIGN KEY
- 非空约束:NIT NULL
a) *语法-创建约束
b) CREATE TABLE 表名(字段 值 约束);
c) ALTER TABLE 表名 MODIFY 字段 数据类型 约束
d) 当后面的约束为空时,可以认为改为没有约束 - 唯一约束:UNIQUE
a) *注意:
i. 唯一约束可以有NULL值,但只能有一个
ii. 唯一约束必须用DROP INDEX字段来删除
iii. -ALTER TABLE 表名 DROP INDEX 列名 - 如果当前表中有唯一约束,那么添加不了唯一约束
- 主键约束:PRIMARY KEY*****
a) *语法:PRIMARY KEY AUTO_INCREMENT;
b) *注意:
i. -主键约束要求主键非空且唯一
a) -一张表中只有一个字段为主键
b) -主键就是表中记录的唯一标识
c) *AUTO_INCREMENT-自动增长
i. 如果某一列是数值类型的,使用AUTO_INCREMENT可以来完成值的自动增长
d) *主键的删除:
i. ALTER TABLE 表名称 DROP PRIMARY KEY; - 外键约束:FOREIGN KEY*****
- 在创建表时,可以添加外键
b) *语法:
c) CREATE TABLE 表名 (
i. …
ii. CONSTRAINT 外键名称 FOREIGN KEY (从表列名) REFERENCES 主表(主表主键) – CONSTRAINT 外键名称可以省略
iii. );
iv. -主表:被依托的表
v. -从表:谁有外键谁就是从表
d) *删除外键
e) ALTER TABLE 从表名 DROP FOREIGN KEY 外键名
f) *创建表之后添加外键
g) ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键列名) REFERENCES 主表名称(主表列名称)
h) ALTER TABLE 表名 ADD FOREIGNKEY (外键列名) REFERENCES 主表名称(主表列名称)
- CONSTRAINT 外键名称可以省略
- 2)级联操作(了解)-记住关键字CASCADE即可
a) *添加级联操作
i. 语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 - FOREIGN KEY(外键字段名称) REFERENCES 主表(主表列名称)
- ON UPDATE CASE ON DELETE CASE;
b) *级联操作: - ON UPDATE CASCADE
- ON DELETE CASCADE;
c) *级联操作比较危险,效率也不高,尽量慎重使用
三、数据库的设计 - 多表之间的关系
- 一对一(了解)
- 一对多(多对一)
a) 如:部门和员工
b) 分析:一个部门又多个员工,一个员工只能对应一个部门 - 多对多
c) 如:学生和课程
d) 分析:一个学生可以有多个课程,一个课程也可以有很多学生
- 多表关系的实现
- 一对一
b) 在其中一方创建一个外键列(值不能重复),指向另一方的主键列
- 2)一对多(多对一)
a) 在多的一方创建外键列,指向一的一方主键列
- 多对多
b) 创建一个中间表,至少有两列,创建外键分别指向2个主表的主键
c) *联合主键:中间表中的主键对不重复 - PRIMARY KEY(主键1,主键2)
- 数据库设计的范式(当前了解即可)-以下所有笔记应结合视频理解
- 概念:设计数据库时,要尊徐一些规范.
- 要遵循后边的范式要求,必须先遵循前边的所有范式要求
- 分类-第1/2/3/巴斯-科德/4/5范式,当前只学习123范式
b) *第一范式(1NF) - 每一列都是不可分割的原子数据项
c) *第二范式(2NF) - 在1NF的基础上,非码属性必须完全依赖于候选码
- (在1NF基础上消除非主属性对主码的部分函数依赖)
d) *第三范式(3NF)
- 在2NF的基础上,任何非主属性不依赖于其他非主属性
- (在2NF基础上消除传递依赖)
- 第一范式:1NF
e) *原子数据项:仅有一列,没有子列
f) 数据库创建表时必然满足第一范式
g) *第一范式存在的问题:
h) -存在非常严重的数据冗余
i) -数据添加存在问题
j) -数据删除存在问题 - 第二范式:2NF
k) *几个概念: - -函数依赖: A–>B,如果通过A的属性(或属性组)的值可以确定唯一B属性的值
- -完全函数依赖:A–>B,如果A是一个属性组,则B属性值的确定需要依赖A属性组中所有的属性值
- -部分函数依赖:A–>B,如果A是一个属性组,则B属性值的确定需要依赖A属性组中部分的属性值
- -传递函数依赖:A–>B, B–>C
- 如果通过A的属性(或属性组)的值可以确定唯一B属性的值,再通过B的属性可以确定C属性的值
- -码:如果在一张表中,如果一个属性或属性组被其他所有属性组完全依赖,则称此属性或属性组为该表的码
- **主属性:码属性组中的所有属性
- **非主属性:除了码属性组的属性
l) *第二范式存在的问题:
- -数据添加存在问题
- -数据删除存在问题
- 第三范式:3NF
m) 解决了传递依赖
n) 不存在主要问题
- 数据库的备份和还原
a) 详见 MYSQL语句-重置密码&备份还原数据库,一般用不着 - 总结公式:
- SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 条件 ORDER BY ASC/DESC LIMIT index,rows
- CONSTRAINT 外键名称 FOREIGN KEY (从表列名) REFERENCES 主表(主表主键)
多表
一、多表查询
- 多表查询的分类
a) *内连接查询
b) *外连接查询
c) *子查询
d) *笛卡尔积:
i. 集合A,集合B,区多表中数据的所有组合情况
ii. 要完成多表查询,需要消除笛卡尔积中无用的数据 - 内连接查询:
- 隐式内连接:使用WHERE消除无用数据
b) *语法:
i. SELECT 字段 FROM 表1,表2 WHERE 关联条件 AND 普通条件
c) *例子:
d) SELECT t1.name, – 注释 - t1.gender,-- 注释
- t2.name – 注释
e) FROM - emp t1, – 注释
- dept t2 – 注释
f) WHERE
i. t1.dept_id = t2.id;
- 2)显式内连接
a) *语法:SELECT 字段 FROM 表1
b) [INNER] JOIN 表2 ON 关联条件
c) [INNER] JOIN 表3 ON 关联条件
- WHERE 普通条件
- -INNER 是可选操作,可以不写
d) *例子: - SELECT * FROM emp INNER JOIN dept ON emp.dept_id = dept.id;
- 内连接查询的思维逻辑
e) *从哪些表中查询数据
f) *查询条件是什么
g) *查询哪些字段 - 内连接查询的是左右两表的交集部分****
- 外链接查询
- 左外连接
b) *语法:SELECT 字段 FROM 表1 - LEFT [OUTER] JOIN 表2 ON 关联条件
- LEFT [OUTER] JOIN 表3 ON 关联条件
i. WHERE 普通条件
c) 左外连接查询的是左表所有数据及左右表交集部分***
- 2)右外连接
a) 语法:SELECT 字段 FROM 表1
b) RIGHT [OUTER] JOIN 表2 ON 条件
c) RIGHT [OUTER] JOIN 表3 ON 条件
d) WHERE 普通条件
e) 左外连接查询的是右表所有数据及左右表交集部分** - 3)内连接与外链接的区别****
a) -内连接查询的是连接的表的交集
b) -外链接查询的是左(右)表的所有数据及与连接的表的交集 - 4.子查询
a) *概念:查询中嵌套查询,称嵌套的查询为子查询
b) *例:
i. SELECT *FROM emp WHERE emp.salary = (SELECT MAX(salary) FROM emp);
c) *子查询的不同情况
i. -标量子查询:
- 子查询可以作为条件,使用运算符去判断
- 例:查询工资小于平均工资的人
- SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
ii. -列子查询:子查询的结果是N行1列 - 子查询可以作为条件,使用操作符去判断
- 例:查询部门是财务部或市场部的人
- SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME IN(‘财务部’,‘市场部’));
iii. -行子查询:子查询的结果是1行N列
iv. -子查询的结果是多行多列的: - 子查询可以作为虚拟表,使用内/外连接去查询
- 例:查询员工的入职日期是2011-11-11日之后的员工信息
- SELECT *
- FROM (SELECT * FROM emp WHERE join_date > ‘2011-11-11’) t1, dept t2
- WHERE t1.dept_id = t2.id;