数据库及数据库工具安装与使用-mysql+navicat(linux)

一、数据库介绍

1、定义:数据库是存放数据的电子仓库。

2、是以某种方式存储百万条,上亿条数据,提供多个用户访问共享。

3、每个数据有一个或多个api用于创建,访问,管理和复制所保存的数据。*api就是接口

如:例如注册:输入名字,手机等通过接口传输到数据库中保存

4、系统中很多动态数据都存储在数据库中,需要通过访问数据库才能显示

二、数据库的类型


1、关系型数据库


定义:数据库中表与表之间存在某种关系,数据存储在不同的表中

常见的关系型数据库:

(1)db2   IBM 公司

(2)oracle      oracle 公司

(3)mysql      oracle公司收购 (我们学习的mysql)

(4)sql  server   

特点:

a、安全

b、保持数据的一致性

c、实现对表与表进行复杂的数据查询

2、非关系型数据库


定义:通常数据是以对象的形式存储在数据库中

常见的非关系性数据库:

1、hbase (列模型)

2、redis (键值对存储)用的比较多

3、mongodb (文档类型)

特点:

a、效率高

b、容易扩展

c、使用更加灵活 

=========================

三、mysql介绍


1、定义


mysql是关系型数据库管理系统,我们常说的xxx数据库就是指xx数据库管理系统。

2、来源


mysq数据库是有瑞典mysql db公司开发,目前属于oracle 公司,(甲骨文)

3、优势


在web应用方面(bs架构上),mysql是最好的关系型数据管理系统

4、特点:


a、体积小

b、开源,免费

c、使用c++编写

d、支持多系统

e、支持多引擎

f、msyql与其他工具组合可以搭建免费的网站系统

lamp=linux+apache+mysql+java ;

lnmp=linux+nginx+mysql+php  

5、mysql的应用结构:


(1)单点数据库:使用于小规模应用(我们现在学的)

(2)复制:适用于中小规模的应用

(3)数据库集群,适合大规模的应用

比如:mgr集群,三主三从,一主三从;

6、数据库中术语:


(1)数据库

(2)数据表

(3)列

(4)行

(5)值

(6)字段名

(7)字符类型

(8)冗余

(9)主键

(10)外键

(11)视图

(12)索引

(13)单表

(14)多表

(15)存储过程

四、mysql安装


1、格式:rpm -qa|grep 服务名称


命令:rpm -qa|grep mysql   查询mysql包

2、删除所有msyql包


删除的方法二种:

(1)yum remove mysql *

(2)rpm -e --nodeps  安装包

案例:rpm -e --nodeps mysql-libs-5.1.73-8.el6_8.i686

3、安装mysql


(1)yum  install  msyql  客户端

(2)yum  install  msyql-server服务端

查询显示如下三个包,表示安装成功

4、数据库启动


service mysqld start开启数据库

service mysqld stop 关闭书库

service mysqld restart 重启数据库

service mysqld status  查看数据库状态

查看数据库服务

ps  -ef|grep  服务名称

5、设置密码


mysqladmin -u 用户名  password  密码

案例:mysqladmin -u root  password '123456'

6、进入数据库


mysql -u root  -p   敲回车  ,输入密码 

7、显示所有的数据库


show databases ;

8、创建数据库

create database 库名;


9、use 库名


使用库

10、显示库中所有的表


show  tables  显示所有的表

11、建表:


建表语句:create table  aa(id  int(10),name char(20));

12、授权


grant  all  privileges  on  *.* to root@"%"  identified  by "123456";

刷新授权:

flush privileges ;

13、ctrl+z 退出mysql界面


13、注意点:命令后面都要借上分号(;)


五、navicat


1、下载navicat 包


2、解压


3、找到navicat.exe


4 .密钥
NAVH-WK6A-DMVK-DKW3

5、查看ip地址


6、关闭防火墙
ervice iptables stop

7、连接配置编写


8、点击确定连接,显示如下


以上表示连接成功

9、打开查询中,新建查询


10、解决问题:


注意点:如果连接不上

1、关闭防火墙  service  iptables  stop  (在linux中操作)

2、 开启数据库  service  mysqld  start  (在linux中操作)

3、授权(在mysql中操作)

grant  all privileges on  *.* to root@'%' identified by "123456"  

4、授权以后要刷新

flush  privileges  (在mysql中操作)

5、检查连接数据库的参数的正确性如:ip地址,密码,用户名等

6、密码设置错误:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YSE)

(1)也是修改密码

解决办法

第一步:关闭mysql

 第二步:mysqld_safe --user=mysql --skip-grant-tables --skip-networking &

mysql -u root mysql

第三步: UPDATE user SET Password=PASSWORD('123456') where USER='root';

第四步: FLUSH PRIVILEGES;

(在linux中操作)

六、mysql数据类型

1、数值类型

int  大整数类型    4个字节

float   4个字节

2、字符类型

char   定长字符串

varchar  变长字符串

3、时间类型

data 日期值  年月日

time   时分秒

year 年

datataim  年月日时分秒

七、mysql语句

1.基础语句

(1)进入数据库的方法

1、mysql -u root -p 进入数据库

2、通过navicat连接数据库

(2)建表语句

格式:create TABLE  表名(字段名1 字符类型(字符长度1),字段名1 字符类型(字符长度2));

案例1:create TABLE  a1(id int(10),name varchar(10));

(3)desc 查看表结构

(4)insert  into 插入数据

1、插入全部字段:INSERT  into  a1 VALUES (1,"zs");

2、插入部分字段值 

格式”:INSERT  into  表名(字段名) VALUES (值);

案例:INSERT  into  a1(id) VALUES (2);

3、解决插入中文出现?的方式:

解决方法:DEFAULT charset=utf8;

(5)删除表

格式:drop table  表名;

案例:drop table  a2;

(6)删除表内数据

格式:DELETE  FROM  a2;

(7)约束

定义:约束是对表中字段进行限制,保证表中数据的而正确性和唯一性

1、PRIMARY key 主键;简写:pri

2、not null  非空约束

非空,唯一,用于唯一标识记录,类似身体证

3、unique 唯一索引

唯一、能为空,一个表可以有多个唯一索引

4、default 默认值

5、auto_increnment  自增长约束(一般和主键同时使用

作用:在整数类型,字段值默认从1开始自增

2.单表查询

1、新建表

2、建表语句

create table student( id int primary key , name char(20), sex char(10), age int(3), mobile char(20), class char(10), english int(10), chinese int(10), math int(10) )engine=innodb default charset=utf8;

insert into student values (1,'小红','女',23,'13813828824','1719',77,88,98), (2,'小明','男',23,'13713713711','1720',56,66,55), (3,'小李','男',23,'15915913911','1719',78,64,87), (4,'小张','男',23,'15915913912','1720',77,76,77), (5,'小白','女',24,'15915913913','1719',90,89,98), (6,'小陈','女',19,'15915913914','1719',84,100,81), (7,'小钱','女',20,'15915913915',null,45,99,93);

3、操作语句(表结构)

(1)add  添加字段

格式:alter  table   表名  add   字段名  字符类型(字符长度);

案例:alter  table   student  add   dcs  int(10);

(2)change 修改字段

格式:alter  table   表名  change  源字段名   新字段名  字符类型(字符长度);

案例:alter table   student  change  dcs   hzdcs  int(10);

(3)drop 删除字段

格式:alter table 表名 drop 字段名;

案例:ALTER  table    student  drop   hzdcs ;

(4)rename 修改表名

格式:ALTER  table     表名  rename  新表名 ;

案例:ALTER  table     student  rename  student2 ;

(5)modify after   字段的调换

格式:alter  table   表名  modify  源字段名  字符类型(字符长度)  after  表中字段名;

案例:alter  table   student2  modify  math int(10)  after  name ; 

(6)first  添加字段到第一位

格式:ALTER  table   表名    add  新字段名  字符类型(字符长度)  first ; 

案例:ALTER  table   student2    add  no  int(10)  first ; 


(7)select 查询所有数据

格式:select * from 表名;

案例:select * from student2;

(8)查询部分数据

格式:select  字段1,字段2  from  表名;

案例:select  name,math  from  student2 ;

(9)查询字段可以用as取别名

格式:select  字段1 as "别名名称",字段2 " 别名名称2"  from  表名 ;

(备注:as也可以省略不写)

案例:select  name as "姓名",math " 数学"  from  student2 ;

(10)where接指定条件查询内容

(1)比较运算符:>,<,=,!=,<>,>=,<=

*案例:

1)=等于:select  *  from  student2  where  id=2;

2)!=不等于:select  *  from  student2  where  id!=2;

3)<>不等于:select  *  from  student2  where  id<>2;

4)大于:select  *  from  student2  where  id>2;

5)小于:select  *  from  student2  where  id<2;

6)大于等于:select  *  from  student2  where  id>=2;

7)小于等于:select  *  from  student2  where  id<=2;

(2)and 同时满足

案例:select  *  from  student2  where  id>3 and  math>90;

(3)or 满足其中一个条件就能查询出数据

案例:select  *  from  student2  where  id>6 or  math>97;

(4)beteen ... and ... 在什么范围之间

案例:select  *  from  student2  where  id  BETWEEN  2 and 5;

(5)in 在一组数据中匹配

案例:select  *  from  student2  where  id  in (2,8,6)

(6)not in 在一组数据中匹配

案例:select  *  from  student2  where  id not in (2,8,6)

(7)is null 为空

案例:select  *  from  student2  where  class  is null;

(8)is not null 不为空

案例:select  *  from  student2  where  class  is not null;

(9)like 模糊查询
%:通配符

_:代表一个字符

1)查找8开头的数据:select  *  from  student where  english  like "8%";

2)查找包含8的数据:select  *  from  student2 where  math  like "%8%";

3)查找8结尾的数据:select  *  from  student2 where  math  like "%8";

4)查看指定字符的数值:select  *  from  student where  english  like "8___";

(11)order by排序

(1)order by

a.升序:asc 可以省略不写(从小到大)

b.降序:desc(从大到小)

(2)二次排序

select  *  from  student2 order  by  字段1  desc ,字段2 desc;

(12)limit 查询指定的数据,限制

根据索引来取值,从0开始,一个表的第一行就是哦,第二数字,行数(3行)

案例:select  *  from  student  limit 0,3

(13)聚合函数

(1)max 最小值:select  max(math)  from  student

(2)min 最大值:select  min(math)  from  student

(3)sum 总数:select  sum(math)  from  student

(4)avg平均数:select  avg(math)  from  student

(5)count 统计个数:select  count(math)  from  student

(6)DISTINCT 去重:select  DISTINCT(math)  from  student

(14)group by 分组

*分组后的函数,智能分组的字段,一起显示,其他字段显示就是默认取第一行*

案例1:分组求出每个班级的平均数

select  class,avg(math)  from  student group  by class 

having+条件

案例:分组求出每个班级的平均数小于80分

select  class,avg(math) as a from  student group  by class HAVING a<80;

(15)update...set...更新数据/修改数据

案例:UPDATE  student  set  name= " xh"  where id=1

(16)删除数据

(1)delete

案例1:delete from student

案例2:DELETE  from  student  where  id=1

(2)drop

案例:drop table student

(3)truncate

案例:truncate student


(17)-快捷方式-

注释:ctrl+/

取消注释:shift+ctrl+/

单行注释:#

(18)-备份-

(1)在数据库中备份

1、备份表结构:create table 新表 like 旧表;

2、备份表数据:

insert into 新表 select * from 旧表;

insert into 新表(字段1,字段2) selcet 字段1,字段2 from 旧表;

3、备份表结构和表数据:create table 新表 as( select * from 旧表);

(2)自Linux中备份

1、备份数据

语句:mysqldump  -u root -p hh>/home/hz56.sql

2、还原数据

a.新建数据库

b.还原数据库

语句:mysql -u root -p  kk</home/hz56.sql

3.多表查询

建表

员工表:sid:员工编号、name:姓名、age:年龄

woektime_start  入职时间,incoming工资

dept2 部门编号

部门表:dept1 部门编号,dept_name 部门名称

定义:

(1)2个表或者更多的表中查询我们要的数据

(2)多表连接的关系

a、内连接

b、左连接

c、右连接

e、左独有数据

f、右独有数据

g、全外连接

-比如: a  表:1,2,3   b  表:1,2,4

内连接:显示左边12和右边12关联      显示:12,不显示3,4

左连接:显示左边1,2,3,右 边12  关联     123   4不显示

右连接: 显示右边1,2,4全部显示,左  边12关联      124, 3不显示

左独有数据:显示3

右独有数据:显示4

全外连接:显示1,2,3,4

1、内连接

(1)隐藏内连接

格式:select  *  from 表1,表2  where 表1.关联字段=表2.关联字段

案例:select * from dept,emp where dept.dept1=emp.dept2;

(2)普通内连接

格式:select  *  from 表1 INNER JOIN  表2 on 表1.关联字段=表2.关联字

案例:select * from dept inner join emp on dept.dept1=emp.dept2;

2、左连接:left join

格式:select  *  from 表1 left JOIN  表2 on 表1.关联字段=表2.关联字

案例:select * from dept left join emp on dept.dept1=emp.dept2;

3、右连接:right join

格式:select  *  from 表1 right JOIN  表2 on 表1.关联字段=表2.关联字

案例:select * from dept right join emp on dept.dept1=emp.dept2;

4、左独有数据

格式:select  *  from 表1 left JOIN  表2 on 表1.关联字段=表2.关联字  where  右表字段 is  null

案例:select * from dept left join emp on dept.dept1=emp.dept2 where name is null;

5、右独有数据

格式:select  *  from 表1 right   JOIN  表2 on 表1.关联字段=表2.关联字  where    左表字段 is  null

案例:select * from dept right join emp on dept.dept1=emp.dept2 where dept_name is null;

6、全外连接

(1)内连接+左独有数据+右独有数据

案例:select * from dept inner join emp on dept.dept1=emp.dept2
union
select * from dept left join emp on dept.dept1=emp.dept2
union
select * from dept right join emp on dept.dept1=emp.dept2;

(2)左连接+右独有数据

案例:select * from dept left join emp on dept.dept1=emp.dept2
union
select * from dept right join emp on dept.dept1=emp.dept2 where dept_name is null;

(3)右连接+左独有数据

案例:select * from dept right join emp on dept.dept1=emp.dept2
union
select * from dept left join emp on dept.dept1=emp.dept2 where name is null;

4、子查询

1、定义:一个查询中嵌套另一个查询 

2、子查询的分类

(1)标量子查询

(2)列子查询

(3)行子查询

(4)表子查询(运用多)

3、子查询详解

(1)标量子查询(返回一个值)

-把一个sql 执行返回的一个值,作为另一个sql的条件,得到的结果是一行一列,一般出现在where之后-

备注:

标量子查询允许使用的比较运算符号:=,!=,>,<,>=,<=,<>

案例:财务部门的收入总和

步骤1:查询财务部门的编号

select dept1 from   dept  where   dept_name='财务'; 

步骤2:将查询出来的一行一列作为条件

select sum(incoming) from emp where dept2=(select dept1 from dept where dept_name='财务' );

-注意点:判断能不能使用子查询,查看结果是否涉及两个表的字段

如:a、不能用子查询

b、可以用子查询

(2)列子查询(返回的结果是一个列)

定义:返回的是一列值

注意点:通常在where 之后使用,使用是in 或not  in   ,不运行使用比较运算符,因为它有多个值

案例:It技术部和财务部门入职员工的员工号

步骤1:SELECT dept1 from dept where dept_name='财务' or dept_name='销售';

步骤2:SELECT sid from emp where dept2 in (SELECT dept1 from dept where dept_name='财务' or dept_name='销售') 

(3)行子查询

定义:返回的结果是一行多列,一般出现在where 的后面

案例:找出与牛八 年龄和入职时间一样的员工姓名

步骤1:找老九的年龄 和入职时间  :

select age,woektime_start from emp where name="老九" ;

步骤2:在emp中找到年里和入职时间相同的数据

select name from emp where (age,woektime_start) in (select age,woektime_start from emp where name="牛八" ) ;

(4)表子查询

-定义:返回的是多行多表 (返回的就是一个表),一般接在from 的后面,返回的是一个表

-临时表:as    临时表名

-步骤:

a、select   * from (合表) where  条件

案例1:

select a.name from (select  * from  dept  INNER JOIN  emp on dept.dept1=emp.dept2) as a WHERE a.dept_name="财务"

案例2:

SELECT name,dept_name from emp left join dept on emp.dept2 = dept.dept1 where (age,dept1) in  (SELECT max(age),dept2 from emp GROUP BY dept2);

b、select   *   from   表1  inner  join  ( )

案例:It技术部和财务部门入职员工的员工号

select sid from emp INNER JOIN (select * from dept where dept_name='财务' or dept_name='IT技术' )c ON emp.dept2=c.dept1


5、三表查询

1、三表连接

格式:select  *   from  表1,表2,表3 where   表1.关联字段1=表3.关联字段3  AND  表2.关联字段2=表3.关联字段 3;

案例:select  *   from  student  as a ,course  as b,sc as  c where   a.stu_no=c.stu_no  AND  b.c_no=c.c_no ;

2、三表内连接

格式:select * from 表1 INNER JOIN   表3     on   表1.关联字段1=表3.关联字段3   INNER JOIN表2   on  表2.关联字段2=表3.关联字段3 

案例:select * from student as a INNER JOIN sc as c on a.stu_no=c.stu_no INNER JOIN course as b on b.c_no=c.c_no

 3、三表左连接

格式:select * from 表1 left JOIN   表3     on   表1.关联字段1=表3.关联字段3  left  JOIN表2   on  表2.关联字段2=表3.关联字段3 

案例:select * from student as a left JOIN sc as c on a.stu_no=c.stu_no left JOIN course as b on b.c_no=c.c_no

4、三表右连接

格式:格式:select * from 表1  right JOIN   表3     on   表1.关联字段1=表3.关联字段3  right  JOIN表2   on  表2.关联字段2=表3.关联字段3 

案例:select  *   from  student  as a  right JOIN  sc as  c   on  a.stu_no=c.stu_no  right JOIN  course  as b on  b.c_no=c.c_no

 5、先合两表在和一表

格式:select   *  from  (select * from 表1  right JOIN   表3     on   表1.关联字段1=表3.关联字段3 ) 临时表s   iner join 表2  on   临时表. 字段3=表2.字段2

案例:select  * from (select  a.*,c.sc_No,c.c_no,c.score  from student AS a right JOIN sc c on a.stu_no=c.stu_no)as s INNER JOIN   course as b on s.c_no=b.c_no

-注意:重复列的错误-

6、去除重复字段

案例:select  * from (select  a.* ,b.*,c.sc_no,c.score  from student AS a right JOIN sc c on a.stu_no=c.stu_no right JOIN  course as b on b.c_no=c.c_no) s

4.视图

1、视图的定义

-视图是一个虚拟表,它是一个虚拟表,它不在数据库中以存储的形式保存(本身不包含数据),是在使用视图的时候动态生成

2、视图的优缺点

a、优点:

1)提高查询效率:数据库中的数据查询非常复杂,可以简化sql语句

2)安全:有些保密字段,可以通过创建视图限制用户对某些字段进行操作

3)简单:不需要关心后面对应的表结构

b、缺点:

1)性能差:把视图查询结果转换成对表的查询

2)修改限制:修改视图数据,必须把它转化为对基础表的修改

3、视图的应用

1)创建视图

格式:create    view   视图名   as (sql语句)

案例:create  view  st1  as(sELECT *  FROM dept left JOIN emp ON dept.dept1=emp.dept2)

2)查询数据库中所有的表 (物理表中是没有视图)

格式:show tables

3)查看视图名

格式:select  *   from   视图名

案例:SELECT * from st1 ;

4)查看创建的视图(包含创建语句和视图名称,编码格式)

格式:show   create   view  视图名

案例:show  create  view  sth1;

5)删除视图

格式:drop   view   视图名 ;

案例 :drop   view  st1;

4、视图特点:

1)视图是由基础表产生的虚拟表

2)视图的创建不影响基础表

3)删除视图不影响基础表

4)视图删除数据,基础表也同时删除数据(合表的表无法删除,单表可以删除)

5)基础表删除数据,视图也同时删除

6)视图不能修改表字段,不能对表字段删除

5.索引

1、什么是索引?

(1)定义:索引是一种数据结构

一个索引在存储的表中约束数据结构;

a、索引是在表的字段上创建的

b、索引包含了一列值,这个值保存在一个数据结构中

2、索引的作用

(1)保证数据记录的唯一性

(2)实现表与表之间的参照性

(3)减少排序和分组的时间(例如在使用order by ,group  by  查询语句中进行数据检索)

(4)可以使用索引快速访问数据库中指定信息

3、索引的缺点

(1)索引要占物理内存

(2)索引对表进行增删改查,索引要动态维护,降低数据的维护速度

4、索引的分类

(1)普通索引:index    

简称:mul;最基本的索引,没有任何限制

(2)主键索引:primary key  

简称:pri;是一种唯一索引,不能为空

(3)唯一索引:unique

简称:uni;是一种唯一索引,可为空,一个表中可以有多个唯一索引

5、操作讲解

(1)查看索引

方法1:show INDEX  from  student ;

方法2:show keys from  student ;

(2)通过查看表结构,是否有索引:desc  student ;

(3)创建普通索引

a、创建普通索引 的简写是mul

-索引名和字段名不一样-

格式:alter  table 表名  add INDEX  索引名(字段名)

案例:alter  table student  add INDEX  sy(stu_name)

b、创建索引索引名和字段一致

格式:alter  table 表名  add INDEX  (字段名)

案例:alter  table student  add INDEX  (stu_name)

(4)删除普通索引

格式:ALTER  table  表名  drop  index  索引名;

案例:ALTER  table student  drop  index  sy;

(5)创建主键索引(主键简写:pri)

格式:ALTER  table 表名  add  PRIMARY key(字段名)

案例:ALTER  table student  add  PRIMARY key(stu_no)

(6)删除主键索引

格式:ALTER  table  表名  drop  PRIMARY key

案例:ALTER  table  student  drop  PRIMARY key

(7)添加唯一索引(unique ;唯一索引简写:uni)

a、添加唯一索引:索引名和字段名不一致

格式:ALTER  table  表名   add unique  索引名(字段名)

案例:ALTER  table  student   add unique  yy(age)

b、添加唯一索引:索引名和字段名一致

ALTER  table  student   add unique  (edit)

6.外键

1、外键的定义

让一张表记录的数据不要太过于冗余,在数据库中对表的关系进行解耦,尽量让表的数据单一化。

2、外键的作用

保持数据的一致性和完整性

3、msyql  数据库中的存储引擎?

myisam  (默认)

innodb  (外键需要用到innodb存储格式)

4、查看存储引擎

格式:show  table   status    from  库名  where  name='表名' ;

案例:show  table   status    from  hh  where  name='student' ;

5、存储方式:myisam(默认)
6、查看外键方法:

(1)在navicat中查看

(2)查看外键

show create table student;

7.操作讲解

1、建表时创建外键

(1)创建  engine=INNODB  格式

格式:CREATE table  表名  (字段名 字段类型(字符长度) PRIMARY key ,  字段名 字符类型(字符长度) ,constraint   外键名   FOREIGN key(子表字段)REFERENCES 父表(父表字段)) engine=INNODB ;

案例:

#父表

create table ss (id int(10) PRIMARY key, name varchar(20) )ENGINE=INNODB ;

#子表

CREATE table cc (cid int(10) PRIMARY key ,cname VARCHAR(20) ,constraint wj FOREIGN key(cid)REFERENCES ss(id)) engine=INNODB ;

constraint:外键名(指定外键名)

foreign key:子表字段(指定字段)

references:父表(父表字段)——引用外部表的主键

2、建表以后再添加外键

格式:alter TABLE 子表   add CONSTRAINT   外建名    FOREIGN key (子表字段)    REFERENCES   父表(父表字段)

#父表

create table xx (id int(10) PRIMARY key ,name varchar(20))engine=INNODB ;

#子表

create table yy (yid int(10) PRIMARY key ,yame varchar(20))engine=INNODB ;

添加外键:alter TABLE yy add CONSTRAINT wjm FOREIGN key (yid) REFERENCES xx(id)

-格式:show   create    table   表名;-

-案例:show    create   table    cc-

3、删除外键

格式:ALTER TABLE    表名  drop   FOREIGN key   外键名;

案例:ALTER TABLE    yy  drop   FOREIGN key  wj1;

4、外键的特点

(1)当父表不存在的数据,子表也无法插入数据(子表无法插入数据)

(2)父表中存在的数据,子表就可以插入数据(插入数据)

(3)删除数据,子表中存在的数据,直接删除父表是无法删除 (要先删除子表数据,再删除父表数据)

(4)删除父表的数据,先删除子表,再删除父表

7.存储

1、什么是存储过程?

存储过程是实现某个特点功能的sql语句的集合,编译后的存储过程会保存在数据中,通过存储过程的名称反复的调用执行。

2、存储过程的优点?

(1)存储过程创建后,就可以反复地调用和使用,不需要重新写复杂的语句

(2)创建,修改存储过程不会对数据有任何的影响

(3)存储过程可以通过输入参数返回输出值

(4)通过存储过程中加入控制语句,可以加强sql语句的功能性和灵活性

(5)对于单个语句增删改查,可以直接封装一个集合中,存储过程一旦创建就可以直接调用,且可以重复调用

(6)单个sql语句每一次执行都需要对数据进行编译,而存储过程被创建只需要编译一次,后续即可调用

(7)创建的存储过程,可以重复进行调用,可以减少数据库开发人员的工作量

(8)防止sql 注入

(9)造数据(重点)

3、mysql5.0版本之后就支持存储过程,存储过程是由sql语句和控制语句组成的

3.存储的操作及格式

1、基本格式(不带参数):

delimiter //  分隔符

drop (删除)  PROCEDURE (存储) if EXISTS(判断是否存在)  cc1  存储;

create创建   PROCEDURE存储  cc1()  存储名称

BEGIN 开始

   select  * from  emp ;  存储体1

   select  *  from  dept ;存储体2

END  结束存储

//  分割符

call  cc1()  调用   存储名称

案例:

delimiter //

drop  PROCEDURE if EXISTS  cc1 ;

create   PROCEDURE  cc1()

BEGIN

   select  * from  emp ;

   select  *  from  dept ;

END

//

call  cc1()

图片

2、带传入参数(in)

格式:

delimiter //

drop  PROCEDURE if EXISTS  存储名称;

create   PROCEDURE  存储名称( in x int)

BEGIN

  语句1

END

//

call  存储名(实际参数)

案例:

delimiter //

drop  PROCEDURE if EXISTS  cc2 ;

create   PROCEDURE  cc2( in x int)

BEGIN

   select  * from  emp  where  dept2=x;

END

//

call  cc2(105)

图片

3、in输入值、out 返回值

select  * from emp ;

desc emp ;

delimiter //

drop  PROCEDURE if EXISTS  cc2 ;

create   PROCEDURE  cc2( in x int,out y int)

BEGIN

   select  age  into y from  emp  where  dept2=x;

END

//

call  cc2(105,@y)

select  @y

图片

4、inout  一个变量是输入值也是输出值

案例:

delimiter //

drop  PROCEDURE if EXISTS  cc2 ;

create   PROCEDURE  cc2( inout x int)

BEGIN

   set x=x+1;

END

//

set @x=1

call  cc2(@x)

select  @x

图片

5、设置变量方法:

set     @ 变量名 

赋值的方法:

(1)方式一

set   @ 变量名:=值  设置一个变量值

select  @变量名  显示所有数据

图片

(2)方式二

通过查询结果为变量赋值:

select   字段   into     变量名     from  表名   where    条件

图片

6、循环语句while

while  循环语句:

格式

while   条件  do

sql语句

end while

7、造数据场景
(1)传入固定值

create table m1 (id int(10) PRIMARY key ,name varchar(20));

delimiter //

drop  PROCEDURE if EXISTS  cc2 ;

create   PROCEDURE  cc2( )

BEGIN

  INSERT  into  m1(id)  VALUES(2);

  SELECT  *  from m1;

END

//

call  cc2()

(2)出入变量值的数据

案例

delimiter //

drop  table if EXISTS m1;

create table m1 (id int(10) PRIMARY key ,name varchar(20));

drop  PROCEDURE if EXISTS  cc2 ;

create   PROCEDURE  cc2(in  x  int )

BEGIN

DECLARE  i int  DEFAULT 0 ;

WHile  (i<x) do

     INSERT  into  m1(id)  VALUES(i);

     set i=i+1;

end while;

  SELECT  *  from m1;

END

//

call  cc2(10)

图片

(3)先统计总数量,再插入传入的值

delimiter //

drop  table if EXISTS m1;

create table m1 (id int(10) PRIMARY key ,name varchar(20));

drop  PROCEDURE if EXISTS  cc2 ;

create   PROCEDURE  cc2(in  x  int )

BEGIN

DECLARE  i int  DEFAULT (select  count(*) from m1) ;

WHile  (i<x) do

     INSERT  into  m1(id)  VALUES(i);

     set i=i+1;

end while;

  SELECT  *  from m1;

END

//

call  cc2(10)

(4)每次删除表,再重新插入数据

delimiter //

drop  PROCEDURE if EXISTS  cc2 ;

create   PROCEDURE  cc2(in  x  int )

BEGIN

DECLARE  i int  DEFAULT 0 ;

drop  table if EXISTS m1;

create table m1 (id int(10) PRIMARY key ,name varchar(20));

WHile  (i<x) do

     INSERT  into  m1(id)  VALUES(i);

     set i=i+1;

end while;

  SELECT  *  from m1;

END

//

call  cc2(3)

图片

8、if判断语句
(1)if单分支

格式“:

  if  条件 then

          sql1

  ELSE 

          sql2

  end if;  #结束if语句

案例:

delimiter //

drop  PROCEDURE if EXISTS  cc2 ;

create   PROCEDURE  cc2(in  x  int )

BEGIN

  if  x>2  THEN

     select  * from  emp ;

  ELSE 

    select  * from  dept ;

  end if;

END

//

call  cc2(5)

图片

(2)if多分支

格式:

if 条件1  THEN

     slq1

  ELSE if 条件2 then

    slq2

  ELSE if 条件3 then

    sql3

  ELSE

sql4

  end if;

  end if;

  end if;

图片

案例

delimiter //

drop  PROCEDURE if EXISTS  cc2 ;

create   PROCEDURE  cc2(in  x  int )

BEGIN

  if  x=2  THEN

     select  * from  emp ;

  ELSE if x=10 then

    select  * from  dept ;

  ELSE if x=100 then

    select  * from  student ;

  ELSE

     select  * from sc ;

  end if;

  END IF;

  end if;

END

//

call  cc2(100)

练习:

图片

建表语句:

create table student2(

id int primary key ,

name char(20),

sex char(10),

age int(3),

mobile char(20),

class char(10),

english int(10),

chinese int(10),

math int(10)

)engine=innodb default charset=utf8;

insert into student2 values(

(1,'小红','女',23,'13813828824','1719',77,88,98),

(2,'小明','男',23,'13713713711','1720',56,66,55),

(3,'小李','男',23,'15915913911','1719',78,64,87),

(4,'小张','男',23,'15915913912','1720',77,76,77),

(5,'小白','女',24,'15915913913','1719',90,89,98),

(6,'小陈','女',19,'15915913914','1719',84,100,81),

(7,'小钱','女',20,'15915913915',null,45,99,93);

 )

 面试题:根据student学生表去写 

1.当传入的参数(大于0)小于等于表里面数据的条数时,则根据分组显示班级的总成绩 

2.当传入的参数大于表里面数据的条数时,则统计表里面的数据有多少条

3.当传入其他,则查询表里面的所有数据

案例:

delimiter //

drop  procedure if exists  cc2 ;

create   PROCEDURE  cc2(in  x  int )

BEGIN

DECLARE  i   int  DEFAULT (select  count(*) from  student2); #声明变量

 if  x<=i and x>0  THEN

    select  sum(english+chinese+math)  from    student2  group  by  class ;

 ELSE IF x>i THEN

    select  count(*) from  student2;

 ELSE

 select  * from  student2;

 end if;

 end if;

END

//

call  cc2(-1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值