网站如何增加流量,wordpress国外主题 雅黑,济南建设网站需要,cdn wordpress 登录目录 1 约束1.1 约束概述1.2 非空约束1.3 唯一约束1.4 主键约束1.5 默认约束1.6 外键约束 2 数据库设计2.1 数据库设计概述2.2 表关系 3 多表查询3.1 多表查询概述3.2 内连接查询3.3 外连接查询3.4 子查询 4 事务4.1 事务概述4.2 四大特征 1 约束
1.1 约束概述 约束是作用于表… 目录 1 约束1.1 约束概述1.2 非空约束1.3 唯一约束1.4 主键约束1.5 默认约束1.6 外键约束 2 数据库设计2.1 数据库设计概述2.2 表关系 3 多表查询3.1 多表查询概述3.2 内连接查询3.3 外连接查询3.4 子查询 4 事务4.1 事务概述4.2 四大特征 1 约束
1.1 约束概述 约束是作用于表中列上的规则用于限制加入表的数据。例如我们可以给id列加约束让其值不能重复不能为null值。
约束的存在保证了数据库中数据的正确性、有效性和完整性。添加约束可以在添加数据的时候就限制不正确的数据年龄是3000数学成绩是-5分这样无效的数据继而保障数据的完整性。
约束的种类可以分为以下几种 注意MySQL 不支持检查约束。这样是不是就没办法保证年龄在指定的范围内了从数据库层面不能保证以后可以在java代码中进行限制一样也可以实现要求。 1.2 非空约束 非空约束用于保证列中所有数据不能有NULL值。
-- 创建表时添加非空约束
CREATE TABLE 表名(列名 数据类型 NOT NULL,…
); -- 建完表后添加非空约束
ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;1.3 唯一约束 唯一约束用于保证列中所有数据各不相同。
-- 创建表时添加唯一约束
CREATE TABLE 表名(列名 数据类型 UNIQUE [AUTO_INCREMENT],-- AUTO_INCREMENT: 当不指定值时自动增长…
); -- 建完表后添加唯一约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;1.4 主键约束 主键是一行数据的唯一标识要求非空且唯一一张表只能有一个主键
-- 创建表时添加主键约束
CREATE TABLE 表名(列名 数据类型 PRIMARY KEY [AUTO_INCREMENT],…
); -- 建完表后添加主键约束
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);AUTO_INCREMENT当列是数字类型并且是唯一约束不指定主键时自动增长 1.5 默认约束 保存数据时未指定值则采用默认值
-- 创建表时添加默认约束
CREATE TABLE 表名(列名 数据类型 DEFAULT 默认值,…
); -- 建完表后添加默认约束
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;1.6 外键约束 外键用来让两个表的数据之间建立链接保证数据的一致性和完整性。
添加外键约束
-- 创建表时添加外键约束
CREATE TABLE 表名(列名 数据类型,…[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
); -- 建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);删除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;示例代码
根据上述语法创建员工表和部门表并添加上外键约束
-- 部门表
CREATE TABLE dept(id int primary key auto_increment,dep_name varchar(20),addr varchar(20)
);
-- 员工表
CREATE TABLE emp(id int primary key auto_increment,name varchar(20),age int,dep_id int,-- 添加外键 dep_id,关联 dept 表的id主键CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);添加数据
-- 添加 2 个部门
insert into dept(dep_name,addr) values
(研发部,广州),(销售部, 深圳);-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO emp (NAME, age, dep_id) VALUES
(张三, 20, 1),
(李四, 20, 1),
(王五, 20, 1),
(赵六, 20, 2),
(孙七, 22, 2),
(周八, 18, 2);此时删除 研发部 这条数据会发现无法删除。而当我们删除外键约束或者在员工表中删除 研发部 关联的员工删除后则可以删除 研发部 这条数据。 注意 本例中员工表 emp的 dep_id 要关联部门表 dept 的 id我们称员工表 emp 为 从表部门表 dept 为 主表。由于员工表 emp的 dep_id 要关联部门表 dept 的 id所以在创建表和添加数据的时候主表部门表 dept 必须要先创建先添加数据 2 数据库设计
2.1 数据库设计概述 软件的研发步骤 数据库设计就是根据业务系统的具体需求结合我们所选用的 DBMS为这个业务系统构造出最优的数据存储模型。建立数据库中的表结构以及表与表之间的关联关系的过程。有哪些表表里有哪些字段表和表之间有什么关系
数据库设计的步骤
需求分析数据是什么? 数据具有哪些属性? 数据与属性的特点是什么逻辑分析通过ER图对数据库进行逻辑建模不需要考虑我们所选用的数据库管理系统物理设计根据数据库自身的特点把逻辑设计转换为物理设计维护设计1.对新的需求进行建表2.表优化
2.2 表关系 一对多多对一
一对多如部门 和 员工 一个部门对应多个员工一个员工对应一个部门。
实现方式在多的一方建立外键指向另一方的主键。 2. 多对多
多对多 如商品 和 订单 一个商品对应多个订单一个订单包含多个商品。
实现方式建立第三张中间表中间表至少包含两个外键分别关联两方主键。 示例代码
-- 订单表
CREATE TABLE tb_order(id int primary key auto_increment,payment double(10,2),payment_type TINYINT,status TINYINT
);-- 商品表
CREATE TABLE tb_goods(id int primary key auto_increment,title varchar(100),price double(10,2)
);-- 订单商品中间表
CREATE TABLE tb_order_goods(id int primary key auto_increment,order_id int,goods_id int,count int
);-- 建完表后添加外键
alter table tb_order_goods add CONSTRAINT fk_order_id FOREIGN key(order_id) REFERENCES tb_order(id);
alter table tb_order_goods add CONSTRAINT fk_goods_id FOREIGN key(goods_id) REFERENCES tb_goods(id);一对一
一对一如用户 和 用户详情
一对一关系多用于 表拆分将一个实体中经常使用的字段放一张表不经常使用的字段放另一张表用于提升查询性能
实现方式在任意一方加入外键关联另一方主键并且设置外键为唯一
以用户表为例 而在真正使用过程中发现 id、photo、nickname、age、gender 字段比较常用此时就可以将这张表查分成两张表。 示例代码
create table tb_user_desc (id int primary key auto_increment,city varchar(20),edu varchar(10),income int,status char(2),des varchar(100)
);create table tb_user (id int primary key auto_increment,photo varchar(100),nickname varchar(50),age int,gender char(1),desc_id int unique,-- 添加外键CONSTRAINT fk_user_desc FOREIGN KEY(desc_id) REFERENCES tb_user_desc(id)
);3 多表查询
3.1 多表查询概述 多表查询顾名思义就是从多张表中一次性的查询出我们想要的数据。
举个例子
# 创建部门表
CREATE TABLE dept(did INT PRIMARY KEY AUTO_INCREMENT,dname VARCHAR(20));# 创建员工表
CREATE TABLE emp (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10),gender CHAR(1), -- 性别salary DOUBLE, -- 工资join_date DATE, -- 入职日期dep_id INT,FOREIGN KEY (dep_id) REFERENCES dept(did) -- 外键关联部门表(部门表的主键));
-- 添加部门数据
INSERT INTO dept (dNAME) VALUES (研发部),(市场部),(财务部),(销售部);
-- 添加员工数据
INSERT INTO emp(NAME,gender,salary,join_date,dep_id) VALUES
(孙悟空,男,7200,2013-02-24,1),
(猪八戒,男,3600,2010-12-02,2),
(唐僧,男,9000,2008-08-08,2),
(白骨精,女,5000,2015-10-07,3),
(蜘蛛精,女,4500,2011-03-14,1),
(小白龙,男,2500,2011-02-14,null); 执行下面的多表查询语句
select * from emp , dept; -- 从emp和dept表中查询所有的字段数据部分结果如下 从上面的结果我们看到有一些无效的数据如 孙悟空 这个员工属于1号部门但也同时关联的2、3、4号部门。所以我们要通过限制员工表中的 dep_id 字段的值和部门表 did 字段的值相等来消除这些无效的数据
select * from emp , dept where emp.dep_id dept.did;上面语句就是连接查询。
多表查询有以下种类
连接查询 内连接查询 相当于查询AB交集数据外连接查询 左外连接查询 相当于查询A表所有数据和交集部门数据右外连接查询 相当于查询B表所有数据和交集部分数据 子查询
3.2 内连接查询 内连接相当于查询 A B 交集数据
-- 隐式内连接
SELECT 字段列表 FROM 表1,表2… WHERE 条件;-- 显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;示例代码
-- 1. 隐式内连接查询
select * from emp , dept where emp.dep_id dept.did;
-- 查询 emp的 name genderdept表的dname
select emp.NAME,emp.gender,dept.dname from emp,dept where emp.dep_id dept.did;
-- 给表起别名
select t1.NAME,t1.gender,t2.dname from emp t1,dept t2 where t1.dep_id t2.did;-- 2. 显式内连接查询
select * from emp inner join dept on emp.dep_id dept.did;
-- 上面语句中的inner可以省略可以书写为如下语句
select * from emp join dept on emp.dep_id dept.did;3.3 外连接查询 左外连接相当于查询A表所有数据和交集部分数据
右外连接相当于查询B表所有数据和交集部分数据
-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;示例代码
-- 查询emp表所有数据和对应的部门信息左外连接
select * from emp left join dept on emp.dep_id dept.did;-- 查询dept表所有数据和对应的员工信息右外连接
select * from emp right join dept on emp.dep_id dept.did;3.4 子查询 查询中嵌套查询称嵌套查询为子查询。
示例代码
-- 查询工资高于猪八戒的员工信息
-- 第一步先查询出来 猪八戒的工资3600
select salary from emp where name 猪八戒;
-- 第二步查询工资高于猪八戒的员工信息
select * from emp where salary 3600;
-- 使用子查询单行单列
select * from emp where salary (select salary from emp where name 猪八戒);子查询根据查询结果不同作用不同
子查询语句结果是单行单列子查询语句作为条件值使用 ! 等进行条件判断子查询语句结果是多行单列子查询语句作为条件值使用 in 等关键字进行条件判断子查询语句结果是多行多列子查询语句作为虚拟表
示例代码
-- 查询 财务部 和 市场部 所有的员工信息
-- 查询 财务部 或者 市场部 所有的员工的部门did多行单列
select did from dept where dname 财务部 or dname 市场部;
select * from emp where dep_id in (select did from dept where dname 财务部 or dname 市场部);-- 查询入职日期是 2011-11-11 之后的员工信息和部门信息
-- 查询入职日期是 2011-11-11 之后的员工信息多行多列
select * from emp where join_date 2011-11-11 ;
-- 将上面语句的结果作为虚拟表和dept表进行内连接查询
select * from (select * from emp where join_date 2011-11-11 ) t1, dept where t1.dep_id dept.did;4 事务
4.1 事务概述 数据库的事务Transaction是一种机制、一个操作序列包含了一组数据库操作命令。
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求即这一组数据库命令要么同时成功要么同时失败。事务是一个不可分割的工作逻辑单元。
举个例子
张三和李四账户中各有1000块钱现李四需要转换500块钱给张三具体的转账操作为
第一步查询李四账户余额第二步从李四账户金额 -500第三步给张三账户金额 500
现在假设在转账过程中第二步完成后出现了异常第三步没有执行就会造成李四账户金额少了500而张三金额并没有多500这样的系统是有问题的。如果解决呢使用事务可以解决上述问题 从上图可以看到在转账前开启事务如果出现了异常回滚事务三步正常执行就提交事务这样就可以完美解决问题。
相关语法
开启事务
START TRANSACTION;
或者
BEGIN;提交事务
commit;回滚事务
rollback;注意一旦开启了事务之后所做的一切操作都是 临时 的操作只有在提交事务之后操作才是有效的 4.2 四大特征 事务的四大特征
原子性A tomicity事务是不可分割的最小操作单位要么同时成功要么同时失败一致性C onsistency事务完成时必须使所有的数据都保持一致状态隔离性I solation多个事务之间操作的可见性持久性D urability 事务一旦提交或回滚它对数据库中的数据的改变就是永久的
mysql中事务是自动提交的。也就是说我们不添加事务执行sql语句语句执行完毕会自动的提交事务。
可以通过下面语句查询默认提交方式
SELECT autocommit;查询到的结果是1 则表示自动提交结果是0表示手动提交。当然也可以通过下面语句修改提交方式
set autocommit 0;Oracle 默认是手动提交的