MySQL安装及数据库操作、编程介绍

MySQL安装及数据库操作、编程介绍

绿林寻猫
2021-12-08 / 0 评论 / 243 阅读 / 正在检测是否收录...

Mysql

 

一、下载及安装

 

1.1 下载MySQL安装包

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

1.2安装MySQL

 

安装MySQL的三种方式:

l 在线安装版,下载:mysql-installer-web-community.exe

离线安装版,下载:mysql-installer-community.exe

解压缩版,下载:Windows (x86, 64-bit), ZIP Archive

 

1.3安装第三方插件

Navicat for MySQL

 

二、数据库操作

 

2.1创建数据库

 

create database数据库名;

CREATE DATABASE IF NOT EXISTS数据库名

DEFAULT CHARSETutf8 COLLATEutf8_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

2.2使用数据库

use 数据库名;

2.3删除数据库

drop database 数据库名;

2.4设置默认日期:

mdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP

2.5修改默认值:

ALTER TABLE TB_3

ALTER column upwd set DEFAULT '123456';

2.6标识列

Uuid decimal primary key AUTO_INCREMENT;

2.7创建表结构

CREATE TABLE[if no exists]表名称(

列名称1 数据类型,

列名称2 数据类型,

列名称3 数据类型,

....

)

2.8修改表结构

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.9复制表

CREATE TABLE tasks_bak LIKEtasks;

2.10删除表

drop table 表名;

2.11修改表名

RENAME TABLE旧表名 TO新表名;

 

2.12表数据操作:增删改

增加一条:

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

增加多条:

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

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

INSERT INTOtable_1  --table_1表要存在

SELECTc1, c2 FROMtable_2;

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

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

删除表数据:

Delete fromtb_name whereuname=’admin’;

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

修改表数据:

Updatetb_name setupwd=’abc’ whereuname=’admin’;

三、数据类型

字符类型

Char  Varchar  text  blob

数值类型

Int  integer  float  double  decimal

日期类型

Date  time  datetime  timestamp

 

3.1数值类型:

1. 整型指定长度是没有意义的。如int(5)只能限定长度,如果在后面加上unsigned 表示无符号,即非负整数。如果int(5) unsigned zerofill,存入12,则实际存储数据为00012。

2. 浮点数值float、double、decimal,其中float和double相比decimal效率高,decimal可理解成是用字符串进行处理。

 

3.2字符类型:

1. Varchar存储可变长字符串,比定长类型更节省空间。存储的内容超出设置长度时,会被截断。

2. Char是定长的,根据定义的长度分配足够的空间。适合存储很短的字符串或值接近同一个长度的字符串。多出的部分用空格填充。超出设置的长度同样会被截断。

3. 使用策略:对于经常变更的数据来说,char比varchar更好,因为char不容易产生碎片。对于非常短的列,char比varchar在存储空间上更有效率。使用时注意分配需要的空间,更长的列排序时会消耗更多内存。尽量避免使用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 类型,允许固定的小数点。

 

操作符

描述

=

等于

<>

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

BETWEEN

在某个范围内

LIKE

搜索某种模式

注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。


3.3日期类型:

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。

 

3.4枚举类型:

1. 把不重复的数据存储为一个预定义的集合。

2. 有时可以使用ENUM代替常用的字符串类型。

3. ENUM存储非常紧凑,会把列表值压缩到一个或两个字节。

4. ENUM在内部存储时,其实存的是整数。

5. 尽量避免使用数字作为ENUM的常量,因为容易混乱。

排序是按照内部存储的整数。

四、约束

4.1主键约束:PRIMARY KEY

 

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

UUID int PRIMARY KEY;

CONSTRANIT UUID PRIMARY KEY


修改主键约束:

ALTER TABLE 表名

ADD  PRIMARY KEY (UUID)

 

删除主键约束:

ALTER TABLE 表名

DROP PRIMARY KEY

 

 

4.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 外键名;

 

 

4.3空值约束:NOT NULL

Uname varchar(20) NOT NULL;

 

 

4.4唯一约束:UNIQUE

CodeID varchar(20) UNIQUE;

 

修改唯一约束:

ALTER TABLE Persons

ADD UNIQUE (Id_P);

 

删除唯一约束:

ALTER TABLE Persons

DROP INDEX  uc_PersonID;

 

 

4.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

 

 

4.6默认值约束:DEFAULT

Usex varchar(4) DEFAULT ;


 

 

五、查询操作

2.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'

 

5.2条件查询

SELECT * FROMtable_name WHERE 条件 AND|OR 条件

 

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

SELECT  employeeNumber  FROM  employees

WHERE  jobtitle = 'Sales Rep'

ORDER BY RAND()

LIMIT 1;

 

模糊查询

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

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

5.3分组统计

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;

 

 

5.4排序

SELECT Company, OrderNumber FROM Orders ORDER BY Company

 

5.5分页

--从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;

六、SQL 通配符

在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。

SQL 通配符必须与 LIKE 运算符一起使用。

通配符

描述

%

替代一个或多个字符

_

仅替代一个字符

[charlist]

字符列中的任何单一字符

[^charlist]

或者

[!charlist]

不在字符列中的任何单一字符

 

 

6.1使用 % 通配符

例子 1

现在,我们希望从上面的 "Persons" 表中选取居住在以 "Ne" 开始的城市里的人:

SELECT * FROM Persons

WHERE City LIKE 'Ne%'

 

 

 

6.2使用 _ 通配符

例子 1

现在,我们希望从上面的 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人:

SELECT * FROM Persons

WHERE FirstName LIKE '_eorge'

 

6.3使用 [charlist] 通配符

例子 1

现在,我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:

SELECT * FROM Persons

WHERE City LIKE '[ALN]%'

例子 2

现在,我们希望从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人:

SELECT * FROM Persons

WHERE City LIKE '[!ALN]%'

 


 

 6.4SQL Alias

通过使用 SQL,可以为列名称和表名称指定别名(Alias)。

表的 SQL Alias 语法

SELECT column_name(s)

FROM table_name

AS alias_name

列的 SQL Alias 语法

SELECT column_name AS alias_name

FROM table_name

 

 

 

七、索引

7.1创建索引

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

 

 

在表上创建一个简单的索引。允许使用重复的值:

CREATE INDEX index_name

ON table_name (column_name)

注释:"column_name" 规定需要索引的列。


7.2创建唯一索引

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

 

 

在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。

CREATE UNIQUE INDEX index_name

ON table_name (column_name)

 

创建表时直接指定:

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

 

7.3删除索引

DROP INDEX 索引名 ON 表名

 

 

我们可以使用 DROP INDEX 命令删除表格中的索引。

ALTER TABLE table_name DROP INDEX index_name

DROP TABLE 表名称

DROP DATABASE 数据库名称

 

7.4CREATE INDEX 实例

本例会创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列:

CREATE INDEX PersonIndex

ON Person (LastName)

如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC

CREATE INDEX PersonIndex

ON Person (LastName DESC)

假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:

CREATE INDEX PersonIndex

ON Person (LastName, FirstName)

 

7.5全文索引

MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为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)

 

7.6索引的优化:

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

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

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

动作描述

使用聚集索引

使用非聚集索引

列经常被分组排序

使用

使用

返回某范围内的数据

使用

不使用

一个或极少不同值

不使用

不使用

小数目的不同值

使用

不使用

大数目的不同值

不使用

使用

频繁更新的列

不使用

使用

外键列

使用

使用

主键列

使用

使用

频繁修改索引列

不使用

使用

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

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]

 

8.1SQL 更新视图

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

Update 视图名

SET

列名 = 表达式

WHERE

    条件

 

8.2SQL 撤销视图

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;

//

 

9.1变量声明、赋值

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

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

Set  @a = 1000;

 

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

Declare  a  int  default  1000;

 

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

 

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

 

DECLAREa int;

SET a := 10; 或 SET a = 10;

SELECT a := 100;

SELECT a := MAX(sal) FROM emp;

 

打印

SELECT @a;

SELECT a;

 

9.2控制语句

IF条件判断语句

IF expression THEN

   statements;

END IF;

 

IFexpression THEN

   statements;

ELSE

   else-statements;

END IF;

 

IF expression THEN

   statements;

ELSEIF elseif-expression THEN

   elseif-statements;

...

ELSE

   else-statements;

END IF;

9.3CASE语句

第一种:判断范围之间

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;

 

9.4循环语句

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)可以简化对变动的管理。

10.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表中的数据。

10.2调用存储过程

CALL  STORED_PROCEDURE_NAME();


十一、触发器

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

 

 

SQL SELECT INTO 实例 - 制作备份复件

下面的例子会制作 "Persons" 表的备份复件:

SELECT *

INTO Persons_backup

FROM Persons

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

SELECT *

INTO PersonsIN 'Backup.mdb'

FROM Persons

 


十三、Java连接MySQL数据库

 

1. 导入MySQL数据库驱动包

 

2. 编写MySQL数据库信息

Private static final StringCNAME="com.mysql.jdbc.Driver";

Private staticfinalStringURL="jdbc:mysql://127.0.0.1:3306/数据库名";

Private static final String username=root;

Private static final String password=root;

Private static final StringCNAME="com.mysql.jdbc.Driver";

Private static final StringURL="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

 

十五、SQL 能做什么?

· SQL 面向数据库执行查询

· SQL 可从数据库取回数据

· SQL 可在数据库中插入新的记录

· SQL 可更新数据库中的数据

· SQL 可从数据库删除记录

· SQL 可创建新数据库

· SQL 可在数据库中创建新

· SQL 可在数据库中创建存储过程

· SQL 可在数据库中创建视图

· SQL 可以设置表、存储过程和视图的权限

 

十六、SQL DML 和 DDL

可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。

查询和更新指令构成了 SQL 的 DML 部分:

· SELECT - 从数据库表中获取数据

· UPDATE - 更新数据库表中的数据

· DELETE - 从数据库表中删除数据

· INSERT INTO - 向数据库表中插入数据

SQL 中最重要的 DDL 语句:

·CREATE DATABASE - 创建新数据库

·ALTER DATABASE - 修改数据库

·CREATE TABLE - 创建新表

·ALTER TABLE - 变更(改变)数据库表

·DROP TABLE - 删除表

·CREATE INDEX - 创建索引(搜索键)

·DROP INDEX - 删除索引

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

评论 (0)

取消