前面一章主要解说了mysql的select的使用方法。将select的大部分使用方法进行分别解说。本章主要解说Msql约束表的建立,以及存储过程的实现,附带其它介绍。临时就算入门了,Mysql索引之后另开章节。

解说不到位的地方欢迎大家指正:联系方式rlovep.com

全部代码下载(csdn):链接

Github链接:链接https://github.com/wpeace1212/Mysql

写文章不易,欢迎大家採我的文章。以及给出实用的评论,当然大家也能够关注一下我的github。多谢;

1.约束表的建立和插入

数据类型告诉我们须要存储什么样子的数据,而约束告诉我们这些数据具体须要满足的规则。如:age int, 我们能够存储负整数,price float。我们能够存储负小数,可是负数是不满足实际规则的,因此我们须要约束。

常见约束:

  1. 非空约束:not null

  2. 唯一约束:unique

  3. 主键约束:primary key

  4. 外键约束:foreign key

1.1非空约束:

1.定义:

在建立表的字段时,在后面带上not null就可,正如字面意思,代表当插入数据时该字段必须有值:

2.演示建立:


#创建一个名为goods的表,有两个字段商品名和商品价格: create table if not exists goods( goods_name varchar(20) not null comment '商品名',#设置不能为空 goods_price float not null comment '商品价格' );

3.演示操作:


##插入: insert into goods values('饼干1','2.3'); insert into goods(goods_price) values('23.0')##不能运行

1.2唯一约束:

1.定义:

在建立表的字段时,在后面带上unique就可。正如字面意思,代表当插入数据时该字段不能有反复值

2.演示建立:


#创建一个名为goods的表,有两个字段商品名和商品价格: drop table goods; create table goods( goods_id int not null unique comment '商品编号',#设置为非空,唯一 goods_name varchar(20) not null comment '商品名',#设置不能为空 goods_price float not null comment '商品价格' );

3.演示操作:


##插入: insert into goods values(001,'饼干1','2.3'); insert into goods values(001,'饼干2',2.5);##报错 Error Code: 1062. Duplicate entry '1' for key 'goods_id' 0.00022 sec insert into goods values(002,'饼干2',2.5);

1.3主键约束:

1.定义:

在建立表的字段时。在后面带上primary key就可。主键约束:不同意为空。不同意反复,主键一般自增长一起使用:auto_increment

2.演示建立:


#创建一个名为goods的表。有两个字段商品名和商品价格: drop table goods; create table if not exists goods(#推断表是否存在进行创建 goods_id int not null auto_increment primary key comment '商品编号',#设置为主键,自己主动增长 goods_name varchar(20) not null comment '商品名',#设置不能为空 goods_price float not null comment '商品价格' );

3.演示操作:


##插入: insert into goods values(001,'饼干1','2.3');#标号001,没实用,生成的标号为1;标号按1增长 insert into goods values(null,'饼干2','2.3');#能够直接这样插入 insert into goods values('饼干3','2.3');#这样报错,提示值不匹配 insert into goods(goods_name,goods_price) values('饼干3','2.3');##这样能够正常插入 ##删除主键: alter table tablename drop primary key ;

1.3外键约束:

1.定义:

在建立表的时候,在后面带上 foreign key(本表字段) references goods其它表(其它表字段)就可。外建约束是比較实用的。在建立多对一。多对多,一对一。继承等关系的数据库时都要用到。

作用:使一个表參考还有一个表的字段。使两表建立关系。比方:商品表中有id号,在商品订单表中将商品id作为外建。这样就能够通过查找订单表中的商品id,从而通过连接查询查询到商品的具体信息;

2.演示建立:


#MySQL创建关联表能够理解为是两个表之间有个外键关系。但这两个表必须满足三个条件 #1.两个表必须是InnoDB数据引擎 #2.使用在外键关系的域必须为索引型(Index) #3.使用在外键关系的域两者数据类型须要类似 #创建关联表 #创建商品表: create table if not exists goods(#推断表是否存在进行创建 goods_id int not null auto_increment primary key comment '商品编号',#设置为主键。自己主动增长 goods_name varchar(20) not null comment '商品名',#设置不能为空 gooods_price float not null comment '商品价格', goods_maker varchar(20) default null comment '生产商',#morning为空 index(goods_id)#建立外键关系的域必须为索引类型 )engine=innodb character set utf8 collate utf8_general_ci auto_increment=1;#设置引擎以及字符集 #创建订单表 create table if not exists detil( customer_id int not null primary key comment '客户id',#设置为主键 goods int not null comment '商品id', count int not null comment '数量', index(goods),#经測试此去的索引能够省去。 foreign key(goods) references goods(goods_id) on delete cascade on update cascade#建立外键,使用goods(goods_id)作为外键。 #on delete(update) cascade 意思为当goods表有相关记录删除(改动)时,detil想要的记录也会被删去(改动)。 )engine=innodb character set utf8 collate utf8_general_ci;#设置引擎以及字符集

3.演示操作:


#1.插入演示: #向goods表加入数据 insert into goods values(null,'饼干1','2.3','三无产品'); insert into goods values(null,'饼干2','2.3','三无产品'); insert into goods values(null,'饼干3','2.3','三无产品'); insert into goods values(null,'饼干4','2.3','三无产品'); insert into goods values(null,'饼干5','2.3','三无产品'); insert into goods values(null,'饼干6','2.3','三无产品'); insert into goods values(null,'饼干7','2.3','三无产品'); insert into goods values(null,'饼干8','2.3','三无产品'); #向detil表加入数据 #必须在goods中有goods_id的编号,能正确插入detil; insert into detil values(001,1,2); insert into detil values(002,2,2); insert into detil values(003,3,2); insert into detil values(004,4,2); insert into detil values(005,1,2); insert into detil values(006,1,2); insert into detil values(007,1,2); insert into detil values(008,1,2); #insert into detil values(008,30,2);#30外键不存在会报错。 #2.删除演示: ##删除goods中的一行。detil相应的外键等于2的列也会被删去。 delete from goods where goods_id=2; #3.查询演示:从订单表中查询相应的商品。 select * from goods where goods_id=(select goods from detil where customer_id=001) #4.删除外键约束: alter table tableName drop foreign key 外键名;

4.一个样例:


-- 解决数据冗余高的问题:给冗余的字段放到一张独立表中 -- 独立设计一张部门表 CREATE TABLE dept( id INT PRIMARY KEY, deptName VARCHAR(20) ); -- 加入员工表 CREATE TABLE employee( id INT PRIMARY KEY, empName VARCHAR(20), deptId INT,-- 把部门名称改为部门ID -- 声明一个外键约束 CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE :级联改动 -- 外键名称 外键 參考表(參考字段) ); INSERT INTO dept(id,deptName) VALUES(1,'软件开发部'); INSERT INTO dept(id,deptName) VALUES(2,'应用维护部'); INSERT INTO dept(id,deptName) VALUES(3,'秘书部'); INSERT INTO employee VALUES(1,'张三',1); INSERT INTO employee VALUES(2,'李四',1); INSERT INTO employee VALUES(3,'王五',2); INSERT INTO employee VALUES(4,'陈六',3); -- 1)当有了外键约束,加入数据的顺序: 先加入主表。再加入副表数据 -- 2)当有了外键约束。改动数据的顺序: 先改动副表,再改动主表数据 -- 3)当有了外键约束,删除数据的顺序: 先删除副表。再删除主表数据 -- ON CASCADE UPDATE :级联改动 UPDATE dept SET id=4 WHERE id=3;

2.存储过程:这里仅仅进行简介

存储过程是一种存储在书库库中的程序(就像正规语言里的子程序一样),准确的来说,MySQL 支持的“ routines (例程)”有两种:一是我们说的存储过程, 二是在其它 SQL 语句中能够返回值的函数(使用起来和 Mysql 预装载的函数一样,如 pi() )。

2.1存储过程入门:

  1. 出现的缘由:

    1. 存储过程是可复用的组件

    2. 存储过程将被保存

    3. 存储过程能够 移植

    4. 存储过程会使系统运行更快

  2. 语法:


DELIMITER $ /*定义分隔符*/ CREATE PROCEDURE procedure1/* name 存储过程名 */ (IN parameter1 INTEGER) /* parameters 參数 */ BEGIN /* start of block 语句块头 */ DECLARE variable1 CHAR(10); /* variables 变量声明 */ IF parameter1 = 17 THEN /* start of IF IF 条件開始 */ SET variable1 = 'birds'; /* assignment 赋值 */ ELSE SET variable1 = 'beasts'; /* assignment 赋值 */ END IF; /* end of IF IF 结束 */ INSERT INTO table1 VALUES (variable1); /* statement SQL 语句 */ END $ /* end of block 语句块结束 */
  1. 简单实例:

#1.存储过程(方法建立)-- -- 创建存储过程-- DELIMITER $ #-- 声明结束符为$ create procedure pro_test() begin SELECT * FROM employee; INSERT INTO employee(id,deptId) VALUES(5,1);
END $ ```` 4.存储过程的操作: ```` -- 运行存储过程-- CALL pro_test(); drop procedure pro_test;#删除存储过程 <div class="se-preview-section-delimiter"></div>

2.2创建带输入參数的函数(存储过程) :

前面我们建立的函数。參数列表是空的。

Mysql数据库的存储过程是能够带參数的,包含输入输出參数,输入參数的声明方式:



CREATE PROCEDURE p1

([IN] name data-type) ...

<div class="se-preview-section-delimiter"></div>

1.简单演示创建:



-- 创建带输入參数的函数 

delimiter $

create procedure pro_findById(in eid int) -- in:输入參数 类型为int

begin 

    select * from employee where id=eid;

end $

<div class="se-preview-section-delimiter"></div>

2.调用:



-- 调用带输入參数的方法-- 

call pro_findById(4);

<div class="se-preview-section-delimiter"></div>

2.3创建带输出參数的函数(存储过程) :

相同能够代输出參数,相当于创建了变量,使得在函数结束后,能够获得变量的值。输出參数的声明方式:


CREATE PROCEDURE p2 ([out] name data-type) ... <div class="se-preview-section-delimiter"></div>

1.简单演示创建:


-- 创建带有输出參数的函数 delimiter $ create procedure pro_testout(out str varchar(20), out sid int)-- 定义两个输出參数,str存储员工名字,id存储最小的员工编号 begin select min(id) into sid from employee;-- 使用into。给输出变量赋值 select empName from employee where id=3 into str; end $ <div class="se-preview-section-delimiter"></div>

2.带输出參数的函数调用:


-- 带输出參数的函数调用 -- 变量用@name表示 call pro_testout(@str,@sid); select @str,@sid;#使用输出变量 <div class="se-preview-section-delimiter"></div>

2.4变量介绍:

  1. 全局变量(内置变量):

    mysql数据库内置的变量 (全部连接都起作用)

    1. 查看全部全局变量: show variables

如: character_set_client: mysqlserver的接收数据的编码

character_set_results:mysqlserver输出数据的编码

  1. 查看某个全局变量:

    select @@变量名

    select @@character_set_client;输出:utf8

  2. 改动全局变量:

    set 变量名=新值

    1. 会话变量: 输出參数属于会话变量

    仅仅存在于当前客户端与数据库server端的一次连接其中。假设连接断开,那么会话变量全部丢失!

  3. 定义会话变量:

    set @变量=值

  4. 查看会话变量:

    select @变量

    1. 局部变量:

在存储过程中使用的变量就叫局部变量。仅仅要存储过程运行完成,局部变量就丢失!

  1. 定义局部变量:

    DECLARE 变量名 INT DEFAULT 1;#默认值为1

    DECLARE i INT DEFAULT 1;

  2. 查看局部变量:

    select 变量

    select i;

2.5带有输入输出參数的存储过程:

參数既是输入參数,也是输出參数。输出參数的声明方式:


CREATE PROCEDURE p2 ([INTOUT] name data-type) ... <div class="se-preview-section-delimiter"></div>

1.简单演示创建:


DELIMITER $ CREATE PROCEDURE pro_testInOut(INOUT n INT) -- INOUT: 输入输出參数 BEGIN -- 查看变量 SELECT n; SET n =500;-- 改动变量 END $ <div class="se-preview-section-delimiter"></div>

2.简单调用:


-- 调用 SET @n=10; CALL pro_testInOut(@n); SELECT @n;#显示改动后的值 <div class="se-preview-section-delimiter"></div>

2.6,带条件循环的存储过程:

Mysql的存储过程中能够使用if。while,case等语句:

  1. 带if的存储过程:

-- 带有条件推断的存储过程 -- 需求:输入一个整数。假设1。则返回“星期一”,假设2。返回“星期二”,假设3,返回“星期三”。其它数字,返回“错误输入”; DELIMITER $ CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR(20)) BEGIN IF num=1 THEN SET str='星期一'; ELSEIF num=2 THEN SET str='星期二'; ELSEIF num=3 THEN SET str='星期三'; ELSE SET str='输入错误'; END IF; END $ CALL pro_testIf(4,@str); SELECT @str; drop procedure pro_testIf; <div class="se-preview-section-delimiter"></div>

2.带有while的存储过程


-- 带有循环功能的存储过程 -- 需求: 输入一个整数,求和。比如,输入100,统计1-100的和 DELIMITER $ CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT) BEGIN -- 定义局部变量 DECLARE i INT DEFAULT 1; DECLARE vsum INT DEFAULT 0; WHILE i<=num DO SET vsum = vsum+i; SET i=i+1; END WHILE; SET result=vsum; END $ <div class="se-preview-section-delimiter"></div> #调用 CALL pro_testWhile(100,@result); drop procedure pro_testWhile; SELECT @result; <div class="se-preview-section-delimiter"></div>

3.带有case的存储过程:



CREATE PROCEDURE p13 (IN parameter1 INT)

BEGIN

   DECLARE variable1 INT;

   SET variable1 = parameter1 + 1;

 CASE variable1

    WHEN 0 THEN INSERT INTO t VALUES (17);

     WHEN 1 THEN INSERT INTO t VALUES (18);

    ELSE INSERT INTO t VALUES (19);

  END CASE;

END; $

<div class="se-preview-section-delimiter"></div>

3.其它介绍:

3.1触发器


-- 当进行 update,insert,delete的前后触发一个事件; -- 创建日志表 create table test_log( id int primary key auto_increment, content varchar(20) ); -- 需求: 当向员工表插入一条记录时,希望mysql自己主动同一时候往日志表插入数据 -- 1.创建触发器(加入)After create trigger tri_empAdd After insert on employee for each row insert into test_log(content) values('员工插入了一条记录'); -- 插入数据; insert into employee values(7,'peace3',1,3); <div class="se-preview-section-delimiter"></div> ##显示触发的数据: select * from test_log; -- 2.创建触发器(改动) before CREATE TRIGGER tri_empUpd before UPDATE ON employee FOR EACH ROW -- 当往员工表改动一条记录时 INSERT INTO test_log(content) VALUES('员工表改动了一条记录'); -- 改动 UPDATE employee SET empName='eric' WHERE id=7; <div class="se-preview-section-delimiter"></div> ##显示触发的数据: select * from test_log; -- 3.创建触发器(删除)before CREATE TRIGGER tri_empDel before DELETE ON employee FOR EACH ROW -- 当往员工表删除一条记录时 INSERT INTO test_log(content) VALUES('员工表删除了一条记录'); -- 删除 DELETE FROM employee WHERE id=7; <div class="se-preview-section-delimiter"></div> ##显示触发的数据: SELECT * FROM employee; SELECT * FROM test_log; <div class="se-preview-section-delimiter"></div>

3.2mysql权限问题


-- ***********mysql权限问题**************** -- mysql数据库权限问题:root :拥有全部权限(能够干不论什么事情) -- 权限账户,仅仅拥有部分权限(peace)比如。仅仅能操作某个数据库的某张表 -- 怎样改动mysql的用户密码? -- password: md5加密函数(单向加密) SELECT PASSWORD('root'); -- *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B -- mysql数据库,用户配置 : user表 USE mysql; show tables; -- 查看全部使用者 select user from user; -- 创建用户账号 create user peace identified by '1234'; -- 授权 select,insert,其它一样-- grant select,insert on day01.student to peace; -- 授权全部:grant all on *.* to peace; -- 设置与更改username-- set password for peace = password('123456'); -- 撤销用户权限-- -- 命令: revoke insert on day01.student from peace; -- 展示权限-- show grants for peace; -- 删除用户-- drop user peace;

本章介绍到这里:

来自伊豚wpeace(rlovep.com)

Msql入门实战之下的更多相关文章

  1. Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...

  2. 003-Tuple、Array、Map与文件操作入门实战

    003-Tuple.Array.Map与文件操作入门实战 Tuple 各个元素可以类型不同 注意索引的方式 下标从1开始 灵活 Array 注意for循环的until用法 数组的索引方式 上面的for ...

  3. Scala深入浅出实战经典-----002Scala函数定义、流程控制、异常处理入门实战

    002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 ...

  4. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  5. Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建

    [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...

  6. Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Hadooop 1.1 搭建环境 1.1.1 安装并设置maven 1. 下载mave ...

  7. Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Spark .时间不一样,SBT是白天编译,Maven是深夜进行的,获取依赖包速度不同 ...

  8. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...

  9. Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...

随机推荐

  1. 安装Subversion1.82(SVN)

    安装Subversion1.82(SVN)插件 简介    :SVN是团队开发的代码管理工具,它使我们得以进行多人在同一平台之下的团队开发. 解决问题:Eclipse下的的SVN插件安装. 学到    ...

  2. springboot Tomcat connector configured to listen on port 8081 failed to start.

    启动报 Tomcat connector configured to listen on port 8081 failed to start.   The port may already be in ...

  3. python3中shuffle函数

    1. shuffle函数与其他函数不一样的地方 shuffle函数没有返回值!shuffle函数没有返回值!shuffle函数没有返回值!仅仅是实现了对list元素进行随机排序的一种功能 请看下面的坑 ...

  4. vuex如何管理需要即时更新的全局变量

    自己在使用vue练习开发的时候遇到全局变量无法即时更新的问题,查了资料之后得出结论使用vuex能够快速解决该问题,但是看了好多人讲解vuex的教程自己跟着去做都没解决自己想要的,最后找到一个比较容易理 ...

  5. Chrome插件:浏览器后台与页面间通信

    content.js 与 background.js和popup.js 通信和 background.js与popup.js  这些通信都用 chrome.runtime.sendMessage 这个 ...

  6. Python之模块和包导入

    Python之模块和包导入 模块导入: 1.创建名称空间,用来存放模块XX.py中定义的名字 2.基于创建的名称空间来执行XX.py. 3.创建名字XX.py指向该名称空间,XX.名字的操作,都是以X ...

  7. 85-Momentum 动量指标.(2015.7.3)

    Momentum 动量指标 动量数值就是当天价格同前几个时段的价格的比率 MOMENTUM = CLOSE(i)/CLOSE(i-N)*100 注解: CLOSE(i) - 当前柱形的收市价格: CL ...

  8. 集训第五周动态规划 E题 LIS

    Description The world financial crisis is quite a subject. Some people are more relaxed while others ...

  9. (转载)Catalan数——卡特兰数

    Catalan数——卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1) ...

  10. two strings

    A1484. two strings(罗干) 时间限制:1.0s   内存限制:256.0MB [问题描述] 给定两个字符串A和B,有五种操作,操作1为在A串开头添加一个字符,操作2为在A串结尾添加一 ...