前面一章主要解说了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. ios远程推送和python版push server相关笔记

    今天研究了下ios的远程推送,网上的相关教程很多,做了一遍下来记录一下遇到的问题和注意事项(转载请注明) 1.证书及乱七八糟的配置 公钥:app id管理那儿的“Development Push SS ...

  2. css一个div设置多个背景图片

    html:定义一个div <div class="item__content"></div> css:样式 .item__content { positio ...

  3. Buffer.from(arrayBuffer[, byteOffset[, length]])

    Buffer.from(arrayBuffer[, byteOffset[, length]]) arrayBuffer - 一个 TypedArray 或 new ArrayBuffer() 的 . ...

  4. android 如何从activity跳转到另一个activity下指定的fragment

    思路: 跳转到目标fragment所在的activity,并传递一个flag,来确定要到哪个fragment,根据该flag判断后,跳转到指定的fragment即可. 代码: 当前界面: intent ...

  5. python爬虫(三)

    Requests模块 这个库的标准文档有个极其幽默的地方就是它的中文翻译,我就截取个开头部分,如下图: 是不是很搞笑,在正文中还有许多,管中窥豹,可见一斑.通过我的使用,感觉Requests库的确是给 ...

  6. 91-Williams' Percent Range 威廉指标.(2015.7.4)

    Williams' Percent Range 威廉指标 ~计算: %R = (HIGH(i-n)-CLOSE)/(HIGH(i-n)-LOW(i-n))×100 注解:CLOSE: 当前时段的收盘价 ...

  7. 什么是CPU密集型、IO密集型?(转发)

    CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘.内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/ ...

  8. MySQL SQL语句 生成32位 UUID

    在运营中,有时会碰到线下下单,线下注册,需要在数据库对其数据批量生成导入的场景. 此时如果你的数据表主键并不是Int整型自动递增而是32位的UUID这种情况该怎么办呢? MySQL 其实实现了UUID ...

  9. Leetcode 220.存在重复元素III

    存在重复元素III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. ...

  10. Android SwipeSelector

     Android SwipeSelector Android SwipeSelector是github上一个第三方开源的项目,其项目主页:https://github.com/roughike/S ...