MySQL数据库

                                   MySQL数据库

一、MySQL数据库简介

MySQL是目前最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司。官网:https://www.mysql.com/

MySQL数据库的特点:

          MySQL是开源的,不需要支付额外费用。

         MySQL支持大型数据库,可以处理上千万条记录的大型数据库

         MySQL使用标准的SQL数据语言形式。

         MySQL可以允许于多个系统上,并且支持多种语言。

二、MySQL数据库的下载及安装

2.1下载MySQL安装包

地址:http://dev.mysql.com/downloads/mysql/

 

2.2安装MySQL

安装MySQL的三种方式:

  1. 在线安装版,下载:mysql-installer-web-community.exe
  2. 离线安装版,下载:mysql-installer-community.exe
  3. 解压缩版,下载:Windows (x86, 64-bit), ZIP Archive

 

2.3安装第三方插件

Navicat for MySQL

 

三、MySQL管理

1.启动及关闭MySQL服务器

1.1 CMD命令方式启动MySQL服务

注意:以管理员身份进入MySQL安装路径的bin文件夹,再执行:

net start mysql

1.2 视图方式启动MySQL服务

 

1.3 命令方式登录

mysql -u root -p mysql -h localhost -u root -p

(第一次登录没有密码,直接按回车过)。

1.4 显示所有数据库

show databases;

1.5 关闭MySQL

Ctrl+cexit quit

2.MySQL用户设置

添加用户实例,用户名为guest,密码为123,并授权用户可进行SELECT,INSERT和UPDATE操作权限。

案例:

INSERT INTO user (host, user, password, select_priv, insert_priv, update_priv)

VALUES ('localhost', 'guest', PASSWORD('123'), 'Y', 'Y', 'Y');

四、MySQL数据库的基本操作

1.数据库操作

1.1 创建数据库

create database数据库名;

CREATE DATABASE IF NOT EXISTS 数据库名

DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

默认的数据库编码集:utf8(即UTF-8),collate表示排序规则为utf8_general_ci。

 

注意:MySQL存入汉字乱码问题解决方案:

(1)在创建数据库时设置编码:

         字符集:utf8 -- UTF-8 Unicode

         排序规则:utf8_general_ci

(2)找到MySQL的安装路径的my.ini文件,打开并修改:

         default-character-set=utf8

1.2 使用数据库

use 数据库名;

1.3 导入数据库

先创建数据库,再导入数据

use yiibaidb;

source D:/worksp/yiibaidb.sql;

1.4 导出数据库

未写

1.5 删除数据库

drop database 数据库名;

1.6 显示所有数据库

show databases;

1.7 定时备份

Windows下做备份:

第一:新建批处理文件backup.bat,然后在Windows中设置计划任务(比较老套的做法)

net stop mysql
xcopy "C:/Program Files/MySQL/MySQL Server 5.0/data/db_abc/*.*" D:/db_backup/%date:~0,10%/ /y
net start mysql

注意:批处理命令中路径里有空格的话,必须在路径上加上双引号。
然后使用Windows的"计划任务"定时执行该批处理脚本即可。(例如:每天凌晨3点执行backup.bat)
解释:备份和恢复的操作都比较简单,完整性比较高,控制备份周期比较灵活。此方法适合有独立主机但对mysql没有管理经验的用户。缺点是占用空间比较多,备份期间mysql会短时间断开(例如:针对30M左右的数据库耗时5s左右)。  
关于时间参数的参考:
%date:~0,10%                  //提取年月日信息
%date:~-3%             //提取星期几信息
%time:~0,5%           //提取时间中的时和分
%time:~0,-3%          //提取时和分和秒信息

 

第二:在Navicat for MySQL

https://jingyan.baidu.com/article/8275fc8667151446a03cf6e3.html?qq-pf-to=pcqq.group

https://www.cnblogs.com/frankielf0921/p/5933127.html

2.表操作

     2.1数据类型

字符类型

Char  Varchar  text  blob

数值类型

Int  integer  float  double  decimal

日期类型

Date  time  datetime  timestamp

数值类型:

  1. 整型指定长度是没有意义的。如int(5)只能限定长度,如果在后面加上unsigned 表示无符号,即非负整数。如果int(5) unsigned zerofill,存入12,则实际存储数据为00012。
  2. 浮点数值float、double、decimal,其中float和double相比decimal效率高,decimal可理解成是用字符串进行处理。

字符类型:

  1. Varchar存储可变长字符串,比定长类型更节省空间。存储的内容超出设置长度时,会被截断。
  2. Char是定长的,根据定义的长度分配足够的空间。适合存储很短的字符串或值接近同一个长度的字符串。多出的部分用空格填充。超出设置的长度同样会被截断。
  3. 使用策略:对于经常变更的数据来说,charvarchar更好,因为char不容易产生碎片。对于非常短的列,charvarchar在存储空间上更有效率。使用时注意分配需要的空间,更长的列排序时会消耗更多内存。尽量避免使用text/blob类型,查询时会使用临时表,导致严重的性能开销。

数据类型

描述

CHAR(size)

保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。

VARCHAR(size)

保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。

注释:如果值的长度大于 255,则被转换为 TEXT 类型。

TINYTEXT

存放最大长度为 255 个字符的字符串。

TEXT

存放最大长度为 65,535 个字符的字符串。

BLOB

用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。

MEDIUMTEXT

存放最大长度为 16,777,215 个字符的字符串。

MEDIUMBLOB

用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。

LONGTEXT

存放最大长度为 4,294,967,295 个字符的字符串。

LONGBLOB

用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。

ENUM(x,y,z,etc.)

允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。

注释:这些值是按照你输入的顺序存储的。

可以按照此格式输入可能的值:ENUM('X','Y','Z')

SET

ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SMALLINT(size)

-32768 32767 常规。0 65535 无符号*。在括号中规定最大位数。

MEDIUMINT(size)

-8388608 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。

INT(size)

-2147483648 2147483647 常规。0 4294967295 无符号*。在括号中规定最大位数。

BIGINT(size)

-9223372036854775808 9223372036854775807 常规。0 18446744073709551615 无符号*。在括号中规定最大位数。

FLOAT(size,d)

带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。

DOUBLE(size,d)

带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。

DECIMAL(size,d)

作为字符串存储的 DOUBLE 类型,允许固定的小数点。

 

 

 

 

 

 

 

 

日期类型:

  1. 尽量用timestamp,空间效率高于datetime。
  2. 用整数保存时间戳通常不方便处理。

数据类型

描述

DATE()

日期。格式:YYYY-MM-DD

注释:支持的范围是从 '1000-01-01' 到 '9999-12-31'

DATETIME()

*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'

TIMESTAMP()

*时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC

TIME()

时间。格式:HH:MM:SS 注释:支持的范围是从 '-838:59:59' 到 '838:59:59'

YEAR()

2 位或 4 位格式的年。

注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。

 

枚举类型:

  1. 把不重复的数据存储为一个预定义的集合。
  2. 有时可以使用ENUM代替常用的字符串类型。
  3. ENUM存储非常紧凑,会把列表值压缩到一个或两个字节。
  4. ENUM在内部存储时,其实存的是整数。
  5. 尽量避免使用数字作为ENUM的常量,因为容易混乱。
  6. 排序是按照内部存储的整数。

2.2 约束

2.2.1 主键约束:PRIMARY KEY

唯一、不重复、不为空;每个表都应该有一个主键,并且每一个表只能有一个主键。

UUID int PRIMARY KEY;

CONSTRANIT UUID PRIMARY KEY

修改主键约束:

ALTER TABLE 表名

ADD  PRIMARY KEY (UUID)

删除主键约束:

ALTER TABLE 表名

DROP PRIMARY KEY

2.2.2外键约束:FOREIGN KEY

外键创建在从表(副表)中,从表中的FOREIGN KEY指向主表中的PRIMARY KEY。

Kid decimal REFERENCES 主表名(主键)

CONSTRANIT 外键名 FOREIGN KEY (kid)  REFERENCES主表名(主键);

修改外键约束

ALTER TABLE Orders

ADD  FOREIGN KEY (外键字段)  REFERENCES  主表名(主键字段);

删除外键约束:

ALTER TABLE Orders

DROP  FOREIGN KEY 外键名;

2.2.3空值约束:NOT NULL

Uname varchar(20) NOT NULL;

2.2.4 唯一约束:UNIQUE

CodeID varchar(20) UNIQUE;

修改唯一约束:

ALTER TABLE Persons

ADD  UNIQUE (Id_P);

删除唯一约束:

ALTER TABLE Persons

DROP  INDEX  uc_PersonID;

2.2.5 检查约束:CHECK

Uage decimal(3)  CHECK(uage>0 and uage<150)

修改检查约束:

ALTER TABLE Persons

ADD  CHECK (Id_P>0)

删除检查约束:

ALTER TABLE Persons

DROP  CHECK  chk_Person

2.2.6 默认值约束:DEFAULT

Usex varchar(4) DEFAULT ‘’ ;

设置默认日期:

mdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP

修改默认值:

ALTER TABLE TB_3

ALTER column upwd set DEFAULT '123456';

2.3 标识列

Uuid decimal primary key AUTO_INCREMENT;

2.4 创建表结构

CREATE TABLE [if no exists] 表名称(

列名称1 数据类型,

列名称2 数据类型,

列名称3 数据类型,

....

)

2.5 修改表结构

ALTER TABLE 语句用于在已有的表中添加、修改或删除列。

如需在表中添加列,请使用下列语法:

ALTER TABLE table_name

ADD column_name datatype

要删除表中的列,请使用下列语法:

ALTER TABLE table_name

DROP COLUMN column_name

注释:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。

要改变表中列的数据类型,请使用下列语法:

ALTER TABLE table_name

ALTER COLUMN column_name datatype

2.6 复制表

CREATE TABLE tasks_bak LIKE tasks;

2.7 删除表

drop table 表名;

2.8 修改表名

RENAME TABLE 旧表名 TO 新表名;

3.表数据操作:增删改

增加一条:

INSERT INTO 表名(列1, 列2,……) VALUES (值1, 值2,……);

增加多条:

INSERT INTO 表名(列1, 列2,……)

VALUES(值1, 值2,……),(值1, 值2,……),(值1, 值2,……),……;

INSERT INTO table_1  --table_1表要存在

SELECT c1, c2 FROM table_2;

添加密码时对字符串进行MD5加密:

INSERT INTO table_1(upwd) VALUES(MD5(‘123’));

删除表数据:

Delete from tb_name where uname=’admin’;

Truncate table 表名;   --仅删除表格中的数据

修改表数据:

Update tb_name set upwd=’abc’ where uname=’admin’;

4.查询操作

4.1简单查询 

 

--查询列名称不重复数据

SELECT  DISTINCT 列名称 FROM 表名称

 

--查询前5

SELECT * FROM Persons LIMIT 5;

 

--in操作符

SELECT * FROM Persons WHERE LastName IN ('Adams','Carter');

SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'

4.2条件查询

SELECT * FROM table_name WHERE 条件 AND|OR 条件

--查询语句是从employees表中随机选择一个其职位是Sales Rep的员工

SELECT  employeeNumber  FROM  employees

WHERE  jobtitle = 'Sales Rep'

ORDER BY  RAND()

LIMIT 1;

​​​​​​​4.3模糊查询

Select * from tb_name where name like ‘_李%’;

注意:模糊查询中有 _%,没有[]

​​​​​​​4.4分组统计

GROUP BY子句:

案例:订单(orders)和订单详细(orderdetails)表,它们的ER图如下:

要按状态获取所有订单的总金额,可以使用orderdetails表连接orders表,并使用SUM函数计算总金额。查询:

SELECT

status, SUM(quantityOrdered * priceEach) AS amount

FROM orders

INNER JOIN orderdetails USING (orderNumber)

GROUP BY status;

类似地,以下查询返回订单号和每个订单的总金额。

SELECT

    orderNumber,

SUM(quantityOrdered * priceEach) AS total

FROM orderdetails

GROUP BY orderNumber;

Having子句:

使用HAVING子句过滤GROUP BY子句返回的分组。

查询使用HAVING子句来选择2013年以后的年销售总额

SELECT

    YEAR(orderDate) AS year,

    SUM(quantityOrdered * priceEach) AS totalFROM

    orders

        INNER JOIN

    orderdetails USING (orderNumber)WHERE

    status = 'Shipped'GROUP BY yearHAVING year > 2013;

​​​​​​​4.5排序

SELECT Company, OrderNumber FROM Orders ORDER BY Company

 

​​​​​​​4.6分页

--从1000行开始扫描后20条数据

Select * from tb_name order by id desc limit 1000,20;

--查询21~30的数据(分页)

Select * from tb_name order by id desc limit 21,30;

 

​​​​​​​4.7子查询

一样

 

​​​​​​​4.8连接表

MYSQL别名  

INNER JOIN     内联

LEFT JOIN                 左联

CROSS JOIN     笛卡尔积

自连接

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons, Orders

WHERE Persons.Id_P = Orders.Id_P

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons

INNER JOIN Orders ON Persons.Id_P = Orders.Id_P

​​​​​​​4.9Union操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

 

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SELECT column_name(s) FROM table_name1

UNION

SELECT column_name(s) FROM table_name2

SELECT column_name(s) FROM table_name1

UNION ALL

SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

面试题:union和union all有什么区别?

Union合并时不包含重复的值;union all则包含重复的值。

Union合并结果集中的列名总是等于第一个表中的列名;union all是两个表所有的列名。

4.10 select into

SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。

SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。

SELECT * INTO 新表 FROM 旧表

IN 子句可用于向另一个数据库中拷贝表:

SELECT * INTO Persons IN 'Backup.mdb' FROM Persons

五、索引

创建索引

CREATE INDEX 索引名 ON 表名(列名)

创建唯一索引

CREATE UNIQUE INDEX 索引名 ON 表名(列名)

创建表时直接指定:

在创建表时,设置某列为主键或唯一约束,都会自动创建主键索引和唯一索引。

删除索引

DROP INDEX 索引名 ON 表名

全文索引

MySQL3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHARVARCHARTEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。

–创建表的适合添加全文索引

CREATE TABLE `table` (

    `id` int(11) NOT NULL AUTO_INCREMENT ,

    `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,

    `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,

    `time` int(10) NULL DEFAULT NULL ,

    PRIMARY KEY (`id`),

    FULLTEXT (content)

);

–修改表结构添加全文索引

ALTER TABLE article ADD FULLTEXT index_content(content)

–直接创建索引

CREATE FULLTEXT INDEX index_content ON article(content)

索引的优化:

索引的好处在于搜索的优化,但过多的使用索引会造成滥用。

索引的缺点:提高查询速度,降低更新表的速度。点用大量磁盘空间。在大数据量时需要考虑索引的优化。

1. 何时使用聚集索引或非聚集索引?

动作描述

使用聚集索引

使用非聚集索引

列经常被分组排序

使用

使用

返回某范围内的数据

使用

不使用

一个或极少不同值

不使用

不使用

小数目的不同值

使用

不使用

大数目的不同值

不使用

使用

频繁更新的列

不使用

使用

外键列

使用

使用

主键列

使用

使用

频繁修改索引列

不使用

使用

事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询200411日至2004101日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。其实这个具体用法我还不是很理解,只能等待后期的项目开发中慢慢学学了。

2. 索引不会包含有NULL值的列

只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL

3. 使用短索引

对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

4. 索引列排序

MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

5. like语句操作

一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

6. 不要在列上进行运算

例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from users where adddate<’2007-01-01′。关于这一点可以围观:一个单引号引发的MYSQL性能损失。

最后总结一下,MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%_开头的情形)。而理论上每张表里面最多可创建16个索引,不过除非是数据量真的很多,否则过多的使用索引也不是那么好玩的,比如我刚才针对text类型的字段创建索引的时候,系统差点就卡死了。

六、视图

视图是一张虚拟表(逻辑表),它被定义为有连接的SELECT语句。

视图与表类似。

优点:是允许简单复杂查询,有助于限制对特定用户的数据访问,并提供额外的安全层,实现向后兼容。

缺点:因为视图数据是基于基表,所以查询速度慢;表依赖关系(改基表结构时会影响视图)

CREATE VIEW 语句在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。

注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。

CREATE  VIEW  view_name  AS

SELECT  column_name(s)  FROM  table_name  WHERE condition

样本数据库 Northwind 拥有一些被默认安装的视图。视图 "Current Product List" 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:

CREATE  VIEW  [Current Product List]  AS

SELECT  ProductID, ProductName  FROM  Products  WHERE  Discontinued=No

我们可以查询上面这个视图:

SELECT * FROM [Current Product List]

SQL 更新视图

即更新视图中的数据。注意:更新的列的数据只能是基表中存在的列。

Update 视图名

SET

列名 = 表达式

WHERE

    条件

SQL 撤销视图

DROP VIEW Syntax

DROP VIEW view_name

七、MySQL编程

DELIMITER的作用:告诉MYSQL解释器,该段命令是否已经结束,MYSQL可以执行了。

默认情况下,delimiter是分号

Delimiter //

Create  procedure  proc_1(out  param  int)

Begin

    Select count(*) into param from t;

End;

//

1.变量声明、赋值

在MYSQL存储过程中定义变量有两种:

第一种:使用set或select直接赋值,变量名以@开头

Set  @a = 1000;

第一种:用declare关键字声明,在存储过程中,也称存储过程变量

Declare  a  int  default  1000;

两者的区别是: 
在调用存储过程时,以DECLARE声明的变量都会被初始化为 NULL。而会话变量(即@开头的变量)则不会被再初始化,在一个会话内,只须初始化一次,之后在会话内都是对上一次计算的结果,就相当于在是这个会话内的全局变量。

变量不区分大小写,指定类型。

DECLARE a int;

SET a := 10; SET a = 10;

SELECT a := 100;

SELECT a := MAX(sal) FROM emp;

2.打印

SELECT @a;

SELECT a;

3.控制语句

IF条件判断语句

IF expression THEN

   statements;

END IF;

IF expression THEN

   statements;

ELSE

   else-statements;

END IF;

IF expression THEN

   statements;

ELSEIF elseif-expression THEN

   elseif-statements;

...

ELSE

   else-statements;

END IF;

CASE语句

第一种:判断范围之间

SELECT

CASE

    WHEN  sal<3500  THEN  ‘加油’

    WHEN  sal=3500  THEN  ‘刚好’

    ELSE  ‘交税’

END  AS  ‘提示’

FROM  emp;

第二种:判断具体值

SELECT

CASE  sal

    WHEN  1000  THEN  ‘只有1000’

    WHEN  2000  THEN  ‘只有2000’

    ELSE  ‘我只有3000’

END  AS  ‘提示’

FROM  emp;

循环语句

WHILE……DO……END WHILE

REPEAT……UNTIL END REPEAT

LOOP……END LOOP

GOTO

WHILE……DO……END WHILE循环

Delimiter  $$      // 定义结束符为$$

Drop  procedure  if  exists  wk;  //删除已有的存储过程

Create  procedure  wk()    //创建新的存储过程

Begin

Declare  i  int;

Set  i=1;

While  i<11   do

    Insert  into  user(uid)  values (i);

Set  i = i +1;

End  while;

End $$         //结束定义语句

Delimiter ;      //把结束符回复为;

LOOP循环

Delimiter  $$

Create  procedure  wk(a  int)

Begin

Declare  sum  int  default  0;

Declare  i  int  default  1;

loop_name:loop    --循环开始

    If  i>a  then

       Leave  loop_name;  --判断条件成立则结束循环,好比java中的break

    End  if;

    Set  sum = sum + i;

    Set  i = i + 1;

End  loop;  --循环结束

Select   sum;  --输出结果

End $$

Delimiter ;

REPEAT……UNTIL END REPEAT循环

Delimiter  $$

Drop  procedure  if  exists  wk;

Create  procedure  wk()

Begin

Declare  i  int;

Set  i  =1;

Repeat

    Insert  into  user(uid)  values(i+1);

    Set  i=i+1;

Until  i>=20   END  REPEAT;    //i>=20时结束循环

End $$

八、存储过程

为以后的使用保存的一条或多条MYSQL语句的集合,因此也可以在存储过程中加入业务逻辑和流程。

可以在存储过程中创建表,更新数据,删除数据等。

使用策略:

(1)可以通过把SQL语句封装在容易使用的单元中,简化复杂的操作。

(2)可以保证数据的一致性。

(3)可以简化对变动的管理。

1. 创建存储过程

DELIMITER $$

 

CREATE

    /*[DEFINER = { user | CURRENT_USER }]*/

    PROCEDURE `db_abc`.`12`()

    /*LANGUAGE SQL

    | [NOT] DETERMINISTIC

    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

    | SQL SECURITY { DEFINER | INVOKER }

    | COMMENT 'string'*/

    BEGIN

 

    END$$

 

DELIMITER ;

DELIMITER //

CREATE PROCEDURE GetAllProducts()

   BEGIN

      MYSQL语句

   END //

DELIMITER ;

第一个命令是DELIMITER //,它与存储过程语法无关。 DELIMITER语句将标准分隔符 - 分号(;)更改为://。 在这种情况下,分隔符从分号(;)更改为双斜杠//。为什么我们必须更改分隔符? 因为我们想将存储过程作为整体传递给服务器,而不是让mysql工具一次解释每个语句。在END关键字之后,使用分隔符//来指示存储过程的结束。 最后一个命令(DELIMITER;)将分隔符更改回分号(;)

使用CREATE PROCEDURE语句创建一个新的存储过程。在CREATE PROCEDURE语句之后指定存储过程的名称。在这个示例中,存储过程的名称为:GetAllProducts,并把括号放在存储过程的名字之后。

BEGIN和END之间的部分称为存储过程的主体。将声明性SQL语句放在主体中以处理业务逻辑。 在这个存储过程中,我们使用一个简单的SELECT语句来查询products表中的数据。

2 调用存储过程

CALL  STORED_PROCEDURE_NAME();

3 调用带存储过程

 

九、触发器

  1. 简介
  1. 触发器是一个特殊的存储过程,它是MYSQL在insert\update\delete的时候自动执行的代码块。
  2. 触发器必须定义在特定的表上。
  3. 自动执行,不能直接调用。

作用:监视某种情况并触发某种操作。

触发器的思路:

监视it_order表,如果it_order表里面有增删改的操作,则自动触发it_goods里面增删改的操作。

比如新添加一个订单 ,则it_goods表,就自动减少对应商品的库存。

比如取消一个订单,则it_goods表,就自动增加对应商品的库存减少的库存。

 

2.触发器四要素

监视地点(table)

监视事件(insert\update\delete)

触发时间(after\before)

触发事件(insert\update\delete)

 

3.创建触发器

Create trigger trigger_name

After/before  insert/update/delete

On table_name

For each row

Begin

   SQL语句:

End

案例:购买一件商器,减少1个库存。

4.删除触发器

Drop trigger trigger_name

5.查看触发器

Show triggers

十、数据备份与还原

备份数据可以保证数据库中数据的安全,数据库管理员需要定期的进行数据库备份。

1.使用mysqldump命令备份

Mysqldump -u username -p dbname table1 table2 …… > backupName.sql

案例:将db_book备份到d盘下

Mysqldump -u root -p db_book > d:\db_book.sql

2.使用mysql命令还原

 

十一、Java连接MySQL数据库

1.导入MySQL数据库驱动包

2.编写MySQL数据库信息

Private static final String CNAME="com.mysql.jdbc.Driver";

Private static final String URL="jdbc:mysql://127.0.0.1:3306/数据库名";

Private static final String username=”root”;

Private static final String password=”root”;

Private static final String CNAME="com.mysql.jdbc.Driver";

Private static final String URL="jdbc:mysql://127.0.0.1:3306/数据库名?user=root&password=root";

十二、MySQL存入汉字乱码解决方案

第一步: 在创建数据库时设置编码:

字符集:utf8 -- UTF-8 Unicode

排序规则:utf8_general_ci

第二步:找到MySQL的安装路径的my.ini文件

default-character-set=utf8

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银色亡灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值