Mysql
一、下载及安装
1.1 下载MySQL安装包
地址:http://dev.mysql.com/downloads/mysql/
1.2安装MySQL
安装MySQL的三种方式:
l 在线安装版,下载:mysql-installer-web-community.exe
l 离线安装版,下载: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)