MySQL-1:基础知识总结

Mysql 数据库(一)—— 初识 Mysql Mysql 数据库(一) 前一段时间 ,我们完成了 Java 集合与数据结构的学习 , 之后我们将进入 Mysql 数据库的课程中。 一、数据库 首先我们要学习的是数据库的知识,那么数据库 到底是什么呢? 同时我们在刚开始学习 数据库 的时候,也可能存在着一个困惑: 就是我们所学的数据结构 与 数据库有什么区别呢? 下面我们将继续解释这两个问题. 1. 什么是数据库? 下面是从百度百科摘下来的定义: 数据库,从名字上就可以知道,这是一个存储着大量数据的仓库,在百度上也写为了 “ 电子化的文件柜 ”,非常 阅读详情

1、概述

目前属于Oracle,分成社区版和企业版,关系型数据库。

1.1 目录结构

  1. bin:存储可执行文件
  2. data:存储数据文件
  3. doc:文档
  4. include:存储包含头文件
  5. lib:存储库文件
  6. share:错误消息和字符集

配置文件:my.ini

1.2 启动和停止

在win cmd中使用net start/stop mysql来启动和停止mysql服务

1.3 登入和登出

1.3.1 登入
mysql -uuer_name -ppassword -Pport -hhost

可以只使用mysql -uuser_name -ppasswrod来开启,后面的可以使用默认的值。-P是指端口号,默认3306。-h是指地址,默认127.0.0.1。

1.3.2 登出

在MySQL命令窗口输入:exit, quit和\q之中任意一个即可。

1.4 修改输入提示符

在登入时,通过-prompt来指定提示符,或者在处于命令行时使用prompt来指定。

在指定提示符的时候可以使用\D, \d, \h和\u来指示提示符显示当前的日期、数据库、服务器和用户。

1.5 查询数据库信息

使用SELECT VERSION(), SELECT NOW(), SELECT USER(), SELECT DATABASE()可以分别用来显示当前的数据库版本、时间、操作用户和数据库。

1.6 注释

  1. 行注释:--
  2. 多行注释:/**/

1.7 约定

数据库操作指令大写;数据库相关的名称小写,且单词之间用下划线分开。

1.8 关于字符编码

查看mysql中当前编码

show variables like 'char%

查看数据表的编码格式

mysql> show create table <表名>;

创建数据库时指定数据库的字符集

mysql>create database <数据库名> character set utf8;

创建数据表时指定数据表的编码格式

create table tb_books (
    name varchar(45) not null,
    price double not null,
    bookCount int not null,
    author varchar(45) not null ) default charset = utf8;

修改数据库的编码格式

mysql>alter database <数据库名> character set utf8;

修改数据表格编码格式

mysql>alter table <表名> character set utf8;

修改字段编码格式

mysql>alter table <表名> change <字段名> <字段名> <类型> character set utf8;

window命令行中中文乱码问题,连接之后使用

set names gbk;

2、数据库操作

2.1 创建

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name 
[DEFAULT] CHARACTER SET [=] character_name
  1. DEFAULT用来说明使用默认编码方式。默认编码方式通过配置文件my.ini
    中的default-character-set中指定。
  2. CHARACTER SET [=] character_name用来指定数据库的字符编码方式。
  3. 有了IF NOT EXISTS当指定数据库已经存在的时候,就不会报错了,否则会报错,但是报的错还是可以查找到的。

建立表的时候使用备注:

CREATE TABLE test_table (
    test_grade int DEFAULT 1 COMMENT '等级'
) COMMENT = '测试表';

2.2 显示创建数据库的SQL语句

SHOW CREATE DATABASE db_name;

类似的,还有显示表的创建的SQL语句:SHOW CREATE TABLE tbl_name;

2.3 修改

修改数据库的字符编码方式的语句:

ALTER {DATABASE|SCHEMA} [DEFAULT] CHARACTER SET [=] charset_name;

2.4 删除

DROP {DATABASE|SCHEMA} [IF EXISTS] db_name

2.5 显示当前所有数据库

SHOW DATABASES;

类似的,有SHOW TABLES [FROM db_name]用于显示当前数据库(或指定数据库)下面的所有表。

3、数据类型

3.1 整型

整数分为有符号和无符号的,通过UNSIGNED指定。(取值范围和C语言中的类型范围一样)

  1. TiNYINT:1字节
  2. SMALLINT:2字节
  3. MEDIUMINT:3字节
  4. INT:4字节
  5. BIGINT:8字节

3.2 浮点型

浮点数也分为有符号的和无符号的。如下所示,前面的m指定了总的位数,后面的n指定了小数的位数,所以整数位数为m-n. 和C语言中的float和double范围一样。

  1. FLOAT[(m,n)]:
  2. DOUBLE[(m,n)]:
  3. DECIMAL[(m,n)]:适用于高精度要求的场景

3.3 时间类型

  1. YEAR:1字节,格式YYYY,范围1901-2155,零值0000
  2. TIME:3字节,格式HH:MM:SS,范围-838:59:59-838:59:59,零值00:00:00
  3. DATE:4字节,格式YYYY-MM-DD,范围1000-01-01-9999-12-31,零值0000-00-00
  4. DATETIME:8字节,格式YYYY-MM-DD HH:MM:SS,范围1000-01-01 00:00:00-9999-12-31 23:59:59,零值0000-00-00 00:00:00
  5. TIMESTAMP:4字节,格式YYYY-MM-DD HH:MM:SS,范围19700101080001-2038年的某个时刻,零值00000000000000

或者使用时间戳,用BIGINT保存指定时间的毫秒值。

3.4 字符型

  1. CHAR(m):m字节,0<=m<=255
  2. VARCHAR(m):L+1字节,L<=m<=65535
  3. TINYTEXT:L+1字节,L<28
  4. TEXT:L+2字节,L<216
  5. MEDIUMEXT:L+3字节,L<224
  6. LONGTEXT:L+4字节,L<232
  7. ENUM(‘val1’, ‘val2’, …):枚举类型,取决于枚举个数,最多65535
  8. SET(‘val1’, ‘val2’, …):主要用于对枚举进行组合选择

4、数据表的操作

4.1 创建数据表

CREATE TABLE [IF NOT EXISTS] table_name (
    column_name data_type, 
    ...
);

4.2 查看数据库的表

查看指定数据库的所有的表

SHOW TABLES [FROM db_name][LIKE 'pattern'|WHERE expr];

4.3 查看列定义

显示指定表的各个列的定义:

SHOW COLUMNS FROM tbl_name;

4.4 约束

4.4.1 表的空和非空

在创建表的时候,在定义列的后面加上NOT NULL来指定指定的列不可为空。这样的列在插入记录的时候必须对其进行赋值。

4.4.2 自增

自动编号,必须与主键组合使用。通过在创建表的时候在列定义后加入AUTO_INCREMENT来实现。此外,可以通过ALTER TABLE users AUTO_INCREMENT = 10000;来指定自增的开始值。

4.4.3 主键

必须保证唯一性,一个表只能有一个,非NULL。创建表的时候使用PRIMARY KEY来指定列是主键。

4.4.4 唯一约束

必须保证唯一性,一个表可以有多个,可以是NULL的。创建表的时候使用UNIQUE KEY来指定列是唯一的。

4.4.5 默认约束

当指定的列没有指定值的时候就使用默认的值,在创建表的时候,通过使用DEFAULT关键字来指定列的默认值。

4.4.6 外键约束

在实际开发过程中更多地使用逻辑外键而不是物理外键,就是只要保证表之间的关联关系就好,而不为表设置外键。因为外键要求创建表的时候,父表和子表都必须使用INNODB引擎。

4.5 修改表

4.5.1 添加单列
ALTER TABLE tbl_name ADD [COLUMN] col_name col_def [FIRST|AFTER col_name]

向指定的表中加入一列。通过FIRST指定新加入的列处于所有列的最前方,通过AFTER col_name指定新加入的列相对于某个列的位置。

4.5.2 添加多个列
ALTER TABLE tbl_name ADD [COLUMN] (col_name col_def[, col_name col_def, ...])

当向表中添加多个列的时候,只能将新加入列放在表的最后面的位置。

4.5.3 删除列
ALTER TABLE tbl_name DROP [COLUMN] col_name[, col_name, ...]

可以指定并删除多个列。

4.5.4 添加约束
ALTER TABLE tbl_name ADD [CONSTRAINT[symbol]] PRIMARY KEY [index_type](index_col_name)

ALTER TABLE tbl_name ADD [CONSTRAINT[symbol]] UNIQUE [index_type](index_col_name)

上面的两条语句分别用来向指定的表中的列加入主键和唯一性约束。示例ALTER TABLE temp ADD UNIQUE(name)(列名上要加括号)。加入了主键和唯一性约束的同时会为指定的列加上索引,所以可以使用index_type来指定索引的类型。要为MySQL设置默认的索引,到my.ini中的default-storage-engine中进行设置即可。另外,可以使用SHOW INDEXES FROM tbl_name查看指定表中存在的索引。

4.5.5 删除约束
ALTER TABLE tbl_name DROP PRIMARY KEY;

ALTER TABLE DROP {INDEX|KEY} col_name;
4.5.6 修改表定义
ALTER TABLE tbl_name MODIFY [COLUMN] col_name col_def [FIRST|AFTER col_name]

上面这种方式可以修改列的定义语句,它适用的范围比较广——可以通过在col_def中指定约束和数据类型来对列进行更多的修改。

ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name col_def [FIRST|AFTER col_name]

上面的修改语句的适用范围更广,它可以修改的范围包括:列的数据类型、约束、位置和名称。

4.5.7 修改表名
ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name 

RENAME TABLE tbl_anem TO new_tbl_name [, tbl_name TO new_tbl_name...]
4.5.8 增加索引
  1. 主键索引, 添加PRIMARY KEY:ALTER TABLE tbl_name ADD PRIMARY KEY (col_name)
  2. 唯一索引, 添加UNIQUE:ALTER TABLE tbl_name ADD UNIQUE (col_name)
  3. 普通索引, 添加INDEX:
    ALTER TABLE ADD key(col_name)以及ALTER TABLE tbl_name ADD INDEX index_name (col_name)
  4. 全文索引, 添加FULLTEXT: ALTER TABLE tbl_name ADD FULLTEXT (col_name)
  5. 多列索引: ALTER TABLE tbl_name ADD INDEX index_name (col_name1, col_name2, ..)

5、插入操作

向表中插入记录

INSERT [INTO] tbl_name [(col_name, ...)] {VALUES|VALUE} ({expr|DEFAULT}, ...), (...), ...

以上用来向指定数据库的指定列中插入数据,如果不指定了列的名称,就必须对表的所有的列进行赋值。可以为指定的列指定值,可以使用表达式,也可以使用默认值。

INSERT [INTO] tbl_name SET col_name = {expr|DEFAULT} [, col_name = {expr|DEFAULT}]

INSERT [INTO] tbl_name [(col_name, ...)] SELECT ...

将查询结果插入到指定的表中。比如INSERT INTO temp (name) SELECT name FROM assignment

6、更新操作

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
SET col_name1 = {expr|DEFAULT} [, col_name2 = {expr|DEFAULT}] ... 
[WHERE where_condition]

没有指定WHERE语句,就对整个表的全部记录进行更新。

7、删除操作

DELETE FROM tbl_name [WHERE where_condition]

8、查找

SELECT select_expr [, select_expr ...] 
[
	FROM table_references
	[WHERE where_condition]
	[GROUP BY {col_name|position} [ASC|DESC], ... ]
	[HAVING having_condition]
	[ORDER BY {col_name|expr|position} [ASC|DESC], ...]
	[LIMIT {[offset,] row_count | row_count OFFSET offset}]
]

8.1 查找不同值

将DISTINCT关键字放在指定的列前面,用于检索指定的列的不同的值。比如,select count(distinct cust_id) from orders;。

DISTINCT作用于所有的列,而不是其后的那一列。比如,select count(distinct cust_id, order_num) from orders;将搜索出cust_id不同并且order_num不同的列。

8.2 限制结果集、分页

select * from orders limit 2 offerset 2;  
select * from orders limit 2 , 2;

类似于上面这样,前面的数字2表示查询的数目条数,后面的2表示从哪个位置开始。所以,上面的效果是查询第2条和第3条数据。但是,要注意的是数据库中条的编号的起始位置是0。如果不指定第二个2将查出所有数据中前两个记录。

8.3 排序结果集

使用ORDER BY语句。可以指定多个列进行排序,可以为要排序的列指定排序的方向,使用ASC表示增序排列,使用DESC表示降序排列。默认,升序排列。除了使用列名来指定要排序的列,害可以使用列的在查询的所有列中的位置来指定排序的列。

DESC只应用到直接位于其前面的列,如果要为多个列进行降序,就应该每个列后面加上DESC。

8.4 过滤结果集

8.4.1 WEHER子句操作符
  1. 等于 =
  2. 不等于 <>和!=
  3. 小于和小于等于 <和<=
  4. 大于和大于等于 >和>=
  5. 为NULL值IS NULL
  6. 处于两者之间BETWEEN

BETWEEN实例:

SELECT * FROM orders WHERE order_num BETWEEN 20006 AND 30000;
8.4.2 AND和OR操作符

使用AND和OR操作符的时候要注意优先级是AND>OR。比如,

select * from orders 
where order_num = 20006 or order_num = 200005 and cust_id = 1000000001;

会被当成

select * from orders 
where order_num = 20006 or (order_num = 20005 and cust_id = 1000000001);

而如果我们想要表达的意思是:

select * from orders 
where (order_num = 20006 or order_num = 200005) and cust_id = 1000000001;

因此就要在OR操作符上面增加圆括号。

8.4.3 IN操作符
select * from orders where order_num in (20006, 20005);  

IN操作符其实完成的操作和OR一样。

8.4.4 NOT操作
select * from orders where not order_num = 20005;

如上所示将not操作加在where条件的前面可以表示对条件的反。上面的效果就相当于where order_num != 20005

8.4.5 exists
select * from orders t 
where 1 = 1 
and exists(select * from customers where cust_id = t.cust_id);
8.4.6 like
select * from products where prod_name like '%doll';

上面的是查找所有prod_name以doll结尾的记录。还可以,比如Fish%用来匹配所有以Fish开头的,F%y用来匹配以F开头并且以y结尾的记录。

通配符%可以用来匹配除NULL意外的记录,即WHERE prod_name like '%'不会找出prod_name为NULL的记录。

8.4.7 下划线

下划线用来匹配指定数量的字符。一个下划线匹配一个字符。

8.5 创建计算字段

8.5.1 拼接字符串
select concat(cust_name,':',cust_city) from customers;

如上所示,使用concat函数可以将查询结果拼接起来。

8.5.2 使用别名
select concat(cust_name,':',cust_city) as cust_city from customers;

如上所示,使用AS操作符来将拼接的字符串命名为cust_city.

8.5.3 使用正则表达式

下面的是使用正则表达式对数据进行过滤的例子,即可以将REGEXP像like一样使用,并在REGEXP后面加上正则表达式即可。下面的表达式检索出的结果是,customers中所有cust_name中包含’Fun’的记录。

select * from customers where cust_name REGEXP 'Fun';

下面的SQL语句用来搜索出所有prod_name开头字符包含在1,2,8之内,并且字符后面是’ inch’的记录:

select * from products where prod_name regexp '[812] inch'

8.6 分组数据

8.6.1 分组过滤GROUP BY
select order_num, count(order_num) from orderitems group by order_num;

使用GROUP BY可以对数据进行分组,上面的效果是显示出指定order_num的记录的条数。

select t.*, sum(quantity*item_price) as total 
from orders as t, orderitems 
where t.order_num = orderitems.order_num 
group by order_num;

上面的语句的执行的结果是,得到了orders表的全部数据,以及每条订单对应的总价(根据orderitems表计算得出)。但是如果没有加入Group BY语句就无法得到上面的结果。

可以使用下面的两个SQL语句的执行结果来理解GROUP BY语句的效果:

select sum(quantity*item_price) from orderitems;
select sum(quantity*item_price) from orderitems group by order_num;

如果没加Group BY得到的是两个列的每条记录的两个字段相乘之后的总和,使用之后得到的是针对每个order_num的两个字段相乘之后的总和。前面的只得到了一条记录,后面的得到了针对每个order_num的记录。

下面的例子也使用了GROUP语句,但是这里在分组的时候的依据不是order_num而是cust_id。这样也是可以的,它得到的结果是:各个cust_id所应该支付的账单总额。

select sum(i.quantity*i.item_price) as total
from orders as o, orderitems as i
where o.order_num = i.order_num
group by o.cust_id;

如果我们再关联一张customers表,来得到用户的名称,那么我们可以写成下面的样子:

select c.cust_name as name, sum(i.quantity*i.item_price) as total
from orderitems as i, orders as o, customers as c
where i.order_num = o.order_num and c.cust_id = o.cust_id
group by c.cust_id;
8.6.2 过滤分组HAVING
select sum(quantity * item_price) as total 
from orderitems 
group by order_num 
having total > 1000;

如上所示,我们使用HAVING语句来对分组之后的结果进行过滤。上面是找出总价值在1000以上的分组。

8.7 子查询

下面的使用了子查询的语句执行的结果与上面的一样:指定名称用户的总额。

select c.cust_name, (select sum(i.quantity*i.item_price) 
                     from orderitems as i, orders as o
                     where i.order_num = o.order_num and c.cust_id = o.cust_id 
                     group by o.cust_id) as total 
from customers as c;

上面的这种方式是将子查询用作计算字段。

子查询的另一种是用方式是将子查询的结果放在一个IN中作为取值范围。

8.8 联结表

所谓的联结可以理解成按照指定的方式将两个或者多个表组合起来,形成一个类似于新的表。因为MySQL是关系型数据库,所以经常会在多个表之间存在一对多或者多对多关系,而联结的效果就是将这样的表联结起来。比如,如果两个数据库之间是一对多关系,那么肯定有些字段只存在于父表中,在查询的时候我们要将这些存在于父表中的字段与存在于子表中的字段组合起来,形成一个完整的“数据”,就应该使用联结来实现。

假如有这样的数据:

在表1中存储着:A0B0, A0B1
在表2中存储着:A0C0, A0C1, A0C2

这里的A, B, C表示的是数据库的列中存储的记录。A表示一个列中的数据,B也表示列中的数据,AB构成一个记录。

那么,如果我们对表1和表2在A上面使用联结将得到的记录如下:

B0C0, B0C1, B0C2, B1C0, B1C1, B1C2

这就相当于我们将B中的与A相关的字段补充了起来。

8.8.1 等值联结

联结表的最常见的形式是使用=将两表的对应的字段连接起来,这叫做等值联结。

8.8.2 内联结

下面是使用内联结的一个实现:

select vend_name, prod_name
from vendors as v inner join products as p
on v.vend_id = p.vend_id;

内联结相当于对两个表在指定的列上面取交集,即只有两个表中都存在的字段才会进行联结。

8.8.3 自联结
select *
from customers as c1, customers as c2
where c1.cust_name = c2.cust_name
and c2.cust_contact = 'Jim Jones';

上面的SQL语句的是自联结的,需要为两个相同的表分别指定一个别名。

8.8.4 外联结

所谓的外联结,就是指左联结和右联结。它跟内联结不同的地方只在于,以左联结为例,如果左表中被用来指定联结的值在右表中不存在,那么也一样将左表中的记录检索出来,只是右表中指定的字段为NULL。

select vend_name, prod_name
from vendors as v left join products as p
on v.vend_id = p.vend_id;

比如上面的SQL中,如果vendors中的vend_id在右表中不存在,那么prod_name作为NULL。同理,可得右联结。

联结的语法:

LEFT [OUTER] JOIN,左外连接。
RIGHT [OUTER] JOIN,右外连接。

这里的OUTER是可选的,有没有都行。

8.8.5 组合查询UNION
select prod_name from products
union
select vend_name from vendors;

使用UNION可以将两个分别独立的SQL查询的结果合并起来。(但是要求两个SQL检索出的列的数目要相等,其实它的效果和OR差不多)

如果查询出来的两条记录一样,重复的行会被取消,可以使用UNION ALL关键字来替代UNION,这样重复的行就不会被取消。

使用UNION组合查询的时候,只能有一条ORDER BY子句,且必须位于最后一条SELECT语句的后面。

9、视图

视图可以用来简化SQL操作,你可以将一次的查询结果作为一个视图,并为其添加一个名称,比如A。然后,我们可以像使用一个表一样从A中检索出数据。

视图的创建语句如下:

create view orderdetail as
select o.*, i.order_item, i.prod_id, i.quantity, i.item_price
from orders as o left join orderitems as i
on o.order_num = i.order_num;

即在一个标准的查询语句上面增加一个create view orderdetail as语句来创建视图。创建完毕视图之后,我们就可以像使用表一样从视图中检索数据。比如:

select * from orderdetail order by cust_id;

10、存储过程

存储过程和视图相似,也是提供一种SQL复用的机制。因为本身视图只能用来将指定的数据检索出来作为数据表一样使用,它本身只能用于“查询”操作,具有一定的局限性。因此,这里有存储过程来将指定功能的SQL封装起来,使其像一个函数一样可以被调用。

存储过程的可移植性比较差,而且需要更高的技能和经验,因此通过被限制创建。

10.1 创建存储过程

10.1.1 创建无参存储过程

在MySQL命令行中创建存储过程的示例:

mysql> delimiter //
mysql> create procedure mypp()
    -> begin
    -> select * from orders;
    -> end//

在这里delimiter //的作用是使用//而不是’;'作为语句分隔符。

10.1.2 为存储过程添加参数

MySQL支持IN(传递给存储过程)、 OUT(从存储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参数。

mysql> create procedure avgprice(in num int, out price decimal(8,2))
    -> begin
    ->     select avg(item_price)
    ->     from orderitems
    ->     where order_num = num
    ->     into price;
    -> end//

上面的语句中创建了一个名为avgprice的存储过程。它接受两个参数,num是传入的参数;price是传出的参数。在存储过程内部,我们为orderitems的指定order_num为num的所有记录的平均item_price赋值非price.

创建完毕了存储过程之后,我们可以像下面这样调用以上存储过程:

call avgprice(20009, @price);

然后,我们可以使用SELECT语句得到price的计算结果:

select @price

10.2 使用存储过程

没有参数的存储过程的使用示例:

call mypp();

10.3 删除存储过程

drop procedure mypp;

10.4 检查存储过程

show create procedure avgprice;

11、游标

MySQL游标只能用于存储过程(和函数)

mysql> create procedure copyprodname()
    -> begin
    ->     --定义局部变量,结束条件
    ->     declare done boolean default 0;
    ->     --定义局部变量,产品名称
    ->     declare name varchar(255);
    ->
    ->     --定义游标
    ->     declare names cursor
    ->     for
    ->     select prod_name from products;
    ->
    ->     --定义循环结束条件
    ->     declare continue handler for sqlstate '02000' set done = 1;
    ->
    ->     --创建表
    ->     create table if not exists prod_name(name varchar(255));
    ->
    ->     --打开游标
    ->     open names;
    ->
    ->     --定义循环
    ->     repeat
    ->     --获取游标的数据,将其填充到name中
    ->     fetch names into name;
    ->     --将游标中的数据插入到prod_name表中
    ->     insert into prod_name values(name);
    ->     --定义循环的结束条件
    ->     until done end repeat;
    ->
    ->     --结束游标
    ->     close names;
    -> end//

在上面的代码中,使用

declare done boolean default 0;

定义了循环的条件为布尔类型,并将其默认值设置为0. 然后,使用定义了循环结束的条件

declare continue handler for sqlstate '02000' set done = 1;

这里的’02000’是一个未找到条件, 当REPEAT由于没有更多的行供循环而不能继续时,出现这个条件。在使用游标之前,需要先打开游标。这通过SQL语句:

open names;

来完成。当我们执行完业务逻辑之后,需要关闭游标。这通过SQL语句:

close names;

来完成。在游标的打开和关闭的作用域内,我们通过

fetch names into name;

将从游标中得到的数据填充到name中。

12、触发器

触发器用来在某事件发生时自动执行,有些类似于监听器的作用。它只能为delete, insert, update三种操作设置触发器。触发器可以设置在指定的操作执行之前或者之后触发。

只有表才支触发器,视图和临时表都不支持。

每个表最多设置6个触发器,且同一触发器不能与多个事件或多个表关联。

12.1 创建触发器

触发器创建的基本语法格式:

CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符
{ BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE }  --触发的事件:insert、update或delete的过程中触发。
ON <表名称>  --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就触发。
FOR EACH ROW  --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句>  --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。

触发器的使用示例:

mysql> create trigger watcher after insert on prod_name
    -> for each row
    -> begin
    ->     insert into prod_name_copy values(new.name);
    -> end//

上面的触发器监听prod_name表的插入操作,每当向表prod_name中插入一条记录的同时向prod_name_copy也插入一条记录。

insert触发器代码内,可以引用一个名为new的虚拟表,访问被插入的行。

delete触发器代码内,可以引用一个名为old的虚拟表,访问被删除的行。

update触发器代码内,可以使用一个名为old的虚拟表,访问更新之前的数据,使用名为new的虚拟表,访问更新的值。

12.2 删除触发器

DROP TRIGGER 触发器名称:

13、事务管理

事务保证了一系列操作的原子性,只有当执行过程中没有产生错误,并且提交了之后才会将执行的结果反应到数据库上。如果使用了回滚操作将回复到开始事务之前的状态。

MySQL中的数据库引擎分别支持不同类型的事务。

13.1 基本的事务操作

开始事务可以使用下面的语句:

START TRANSACTION;

回滚事务使用:

ROLLBACK;

提交事务使用:

COMMIT;

13.2 创建保留点

可以使用语句

SAVEPOINT 名称;

来创建保留点。在准备回滚的时候,我们可以使用

ROLLBACK TO 名称;

来回滚到指定的保留点。这样指定保留点之前的操作不会回滚,而保留点之后的操作将全部被会滚。

通常,保留点越多越好。当提交或者回滚之后,保留点会被自动释放。此外,也可以使用RELEASE来主动释放保留点。

13.3 修改默认提交行为

使用

SET autocommit = 0;

来设置不自动提交。

14、安全管理

在MySQL的数据库中存在一个mysql库,那里面的user表用于存储MySQL的用户。

create user shouheng identified by 'psd';

上面的SQL用来MySQL中添加一个用户。如果要对用户进行重命名,可以使用:

rename user little_boy to shouheng;

如果删除用户可以使用:

drop user username;

查看授予用户的权限:

show grants for shouheng;

授予权限:

grant select on sql_test_db.* to shouheng;

以上操作用来将sql_test_db的所有数据的只读权限授予指定用户。如果要回收指定用户的权限,可以使用

 revoke select on sql_test_db.* from shouheng;

它表示回收指定用户对sql_test_db的只读权限。

除了上面示例的只读权限以外,MySQL还允许为新加入的用户指定其他权限。

为指定的用户修改密码:

 set password for shouheng = Password('psd');

我是 WngShhng. 如果您喜欢我的文章,可以在以下平台关注我:

第1章:MySQL基础知识(1)背景介绍和数据库基础知识 背景介绍 我们每天都在访问各种网站、APP,如微信、QQ、抖音、今日头条、腾讯新闻等,这些东西上面都存 在大量的信息,这些信息都需要有地方存储,存储在哪呢?数据库。 所以如果我们需要开发一个网站、app,数据库我们必须掌握的技术,常用的数据库有mysql、 oracle、sqlserver、db2等。 上面介绍的几个数据库,oracle性能排名第一,服务也是相当到位的,但是收费也是非常高的,金融公 司对数据库稳定性要求比较高,一般会选择oracle。 mysql是免费的,其他几个 阅读详情

相关推荐

加速度积分得到速度的Omega算法

在工程中,有时候很难直接测量机械设备部件的速度或位移,特别是在运动着的设备上。即使在一般的场景下可以布置速度传感器,但是有时候需要同时监测速度和加速度,为了节约成本,往往通过将加速度信号直接进行积分得到速度信号。 将加速度信号积分得到速度信号有两种方法,一是直接在时域进行积分,这往往会产生趋势项,积分的结果需要进行去趋势处理。二是在频域进行积分,典型的频域积分算法是omega算法,这里做一下简单的介绍: 如果我们已经获得了加速度信号x''(t) , 其傅里叶变...

D344896224的博客 1万+

mysql 深入知识_深入mysql基础知识的详解_MySQL

bitsCN.com1.每个客户端连接都会从服务器进程中分到一个属于它的线程。而该连接的相应查询都都会通过该线程处理。2.服务器会缓存线程。因此并不会为每个新连接创建或者销毁线程。3.当发起对MySQL服务器的连接时,服务器会对 username,host,password进行验证。而一旦连接上,服务器就会检测其权限。4.MySQL查询缓存只会保存 SELECT 语句和相应的结果。在解析查询之前会...

weixin_35130780的博客 221

单细胞空间转录组分析流程学习python版(三)

空转python版学习

zfyyzhys的博客 2084

MySQL基础知识总结

MySQL基础知识总结

徒挽的博客 4653

什么是Merkle树?用“文件柜”类比理解区块链的核心技术

Merkle树是一种用于区块链的数据结构,像一个高效的“文件柜”,用于存储和验证大量交易数据。比特币通过Merkle树将交易哈希组织成树状结构,层层汇总,最终生成一个唯一的根哈希,存储在区块头中。这种设计大幅减少数据存储和验证成本,支持快速校验交易的完整性和存在性。Merkle树通过密码学保证数据不可篡改,广泛应用于比特币、区块链及其他分布式系统。它的优势在于高效、轻量和安全,尤其适合轻节点验证和数据同步。理解Merkle树就像掌握区块链的“索引秘籍”,是Web3世界的关键技术。

在路上的专栏 1192

淘宝扫码登录避坑指南:如何避免异地登录风控并稳定获取Cookie(附Python代码)

本文深入解析了淘宝扫码登录的风控机制,提供了从环境仿真到代码实现的完整避坑指南。通过精细化伪装请求头、管理会话与IP策略,并附上Python示例代码,帮助开发者稳定获取Cookie,有效避免异地登录风控,实现自动化流程的可靠集成。

l6m7n8的博客 589

MySQL基础大全(看这一篇足够!!!)

自己看MySQL的总结,一方面加深自己的记忆,一方面与君共享

weixin_35856285的博客 2万+

TM1621/HT1621 段码LCD驱动器

TM1621 LCD 驱动器

qq_45325304的博客 1万+

【MySQL】数据库基础知识

文章目录一. 什么是数据库二. 为什么要有数据库三. 数据库分类四. 数据库的基本使用1. MySQL安装2. 检查MySQL后端服务器是否启动3. 连接MySQL服务器 一. 什么是数据库 数据库(database)是一整套的数据存储容灾解决方案。是用来组织、存储和管理数据的仓库。 当今世界是一个充满着数据的互联网世界,充斥着大量的数据。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。 为了方便管理互联网世界中的数据,就有了数据库管理系统

m0_51064412的博客 5万+

【路由交换】思科5506防火墙三区域互通

思科 5506 inside outside dmz 互通

baidu_22774701的博客 6203

STM32F407 CubeMX UART DMA高效解析BNO085九轴数据

本文详细介绍了如何在STM32F407平台上使用CubeMX配置UART和DMA高效解析BNO085九轴传感器数据。通过DMA循环接收机制实现低CPU占用的实时数据采集,并分享数据解析技巧、错误处理及实战调试经验,为嵌入式开发者提供完整解决方案。

o4p5q6r7s的博客 234

第1篇:MySQL的一些基础知识

第1篇:MySQL的一些基础知识 主要内容 1、MySQL的基本使用; 2、MySQL的性能优化; 3、案例介绍; 数据库常见概念 数据库(Database) 什么是数据库? 这是一个非常容易混淆的知识点。数据库指保存有组织的数据的容器,通常是一个文件或一组文件 我们通常说的数据库是指的数据库管理软件,而并非数据库本身。在使用中只需要知道我们所操作的是数据库软件,是由数据库软件代替我们对数据库进行访问的。 数据库管理软件(DBMS) 概念:数据库是通过DBMS创建和操纵的容器,我们日常是通过DBMS来访

adAir_liu的博客 202

LSTM在交通流量预测中的应用:优化城市交通管理

我们使用的数据集来自某个城市的交通监测系统,包含多个监测点在不同时间段内的交通流量记录。每个监测点的数据包括时间戳、交通流量、天气状况和道路状态等信息。

斌擎科技 1256

mysql基础知识1

MYSQL基础知识1 1.数据库的设计原则 (1)把具有同一个主题的数据存储在一个数据表中,一表一用。 (2)尽量消除冗余,提高访问数据库的速度。 (3)一般要求数据库的是设计达到第三范式,多对多,最大限度消除数据冗余,修改异常,插入异常,删除异常,基本满足关系规范化的要求。 (4)关系数据库中,各个数据表之间关系只能为一对一和一对多的关系。对于多对多需要换作一对多来处理。 (5)设计数据库结构时...

qq_39466140的博客 743

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

玩转Mysql系列 - 第1天:mysql基础知识

这是mysql系列第1篇。 本文主要内容 背景介绍 数据库基础知识介绍 mysql的安装 mysql常用的一些命令介绍 SQL分类 背景介绍 我们每天都在访问各种网站、APP,如微信、QQ、抖音、今日头条、腾讯新闻等,这些东西上面都存在大量的信息,这些信息都需要有地方存储,存储在哪呢?数据库。 所以如果我们需要开发一个网站、app,数据...

路人甲Java 1229

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL基础知识1之配置相关

MySQL基础知识1之配置相关 本系列文章用于记录自己学习MySQL的过程,参考书籍为《MySQL基础教程》,日,西泽梦路著作,卢克贵 译,中国工信出版集团,人民邮电出版社,ISBN:9787115527585,文章附有代码和数据,建议学习过程自己逐个敲代码,熟练使用MySQL语句,在笔者看来,这本书学习起来较为容易,也不愧于基础教程。后续会继续学习SQL或者MySQL的进阶教程,有时间会继续更新。 文章目录MySQL基础知识1之配置相关前言一、初识MySQL二、MySQL的环境配置总结 前言 学习某

qq_40680151的博客 375

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

MYSQL入门到精通【1】:MySQL基础知识

章节一:MySQL基础只是 课时1:MySQL数据库的基础认识

SumIris的博客 301

MySql基础知识(1)

关于mysql的介绍和表创建与查询语法

m0_65670715的博客 687

【MySQL】基础知识Day1

MySQL 基础知识Day1

Daming_888的博客 1097

MySQL笔记1基础知识

MySQL概述

Annaday的博客 255

Mysql系列 - 第1天:mysql基础知识

我们每天都在访问各种网站、APP,如微信、QQ、抖音、今日头条、腾讯新闻等,这些东西上面都存在大量的信息,这些信息都需要有地方存储,存储在哪呢?数据库。所以如果我们需要开发一个网站、app,数据库我们必须掌握的技术,常用的数据库有mysql、oracle、sqlserver、db2等。上面介绍的几个数据库,oracle性能排名第一,服务也是相当到位的,但是收费也是非常高的,金融公司对数据库稳定性要求比较高,一般会选择oracle。

GitHub质检员 142

MySQL基础知识点1

表 表示一种结构化的文件,用来存储特定类型的数据。表包括:列,行,主键。列叫字段,行叫记录,每一个字段都有:字段名称/字段数据类型/字段约束/字段长度。 查看表的结构:desc 表名 SQL的分类 DQL 数据查询语言,select == DML数据操纵语言,增删改表中的数据(insert,delete,update)== DDL数据定义语言,增删该表的结构(create,drop,alter) TCL事务控制语言,commit(提交),rollback(回滚) DCL数据控制语言 简单命令

First 523

MySQL基础知识1

表是数据库存储数据的基本单元,数据库存储数据的时候,是将数据存储在表对象当中。任何一张表都有行和列:行:记录(一行就是一条数据)。列:字段(name字段、age字段、gender字段)。每个字段都有名、有数据类型(字符类型、数字类型、日期类型)、都有长度的限制、都可以有约束(某些字段要求该字段下的数据不能重复,不能为空,用来保证表格中数据合法有效)。创建初始化数据库:(仅供参考,数据来源于blbl:老杜带你学编程)LOSAL INT,HISAL INT。

Doyuuu的博客 400

MySQL基础知识(1)

** MySQL概述 ** 1.什么是数据库     数据库就是存储数据的仓库 2.都有那些公司在使用数据库 电商公司,游戏公司,金融机构,政府部门 3.提供数据库服务的软件 1.软件分类 MySQL,Oracle,SQL-Server,DB2,MongoDB,MariaDB,… //fa 2.生产环境中,如何选择使用哪一种数据库软件 1).是否开源 1.开源软件:MySQL,MongoD...

qq_42674918的博客 879

Mysql 基础知识1

建立索引会占用磁盘空间的索引文件。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。如果是组合索引,则列值的组合必须是唯一的,创建方法和普通索引类似。

damon_1203的博客 651
上一篇: Java-8:五分钟学习行为参数化
下一篇: 迁移到 AndroidX 过程中遇到的各种问题
开发者如是说
博客等级 码龄10年 67粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值