MySQL必知必会(二)

第十章:创建计算字段

计算字段发挥作用:存储在表中的数据都不是在应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再让客户机应用程序或报告程序中重新格式化。
计算字段并不存在于数据库表中。计算字段是运行时在SELECT语句内创建的。
字段基本上与的意思相同。
不过数据库列一般称为列。而术语字段通常用在计算字段的连接上。
拼接字段
Concat()函数来拼接2个列
MySQL的不同之处
多数DBMS使用+或者|| 来实现拼接。MySQL则使用该函数。当把SQL语句转换为MySQL时一定要注意
需要一个或多个指定的串,各个串之间用逗号分隔。
RTrim()函数去掉值右边的所有空格。
Trim()函数:去掉左右两边的所有空格。
使用别名
新计算列是没有名字的,只是一个值。如果仅在SQL查询工具中查看一下结果,一个未命名的列不能用于客户机应用中。因为客户机没法引用它。
别名是一个字段或值的替换名。别名用AS关键字赋予。
举例:
select Concat(RTrim(列名),’(’,RTrim(列名),’)’) AS 名字
创建后客户机就可以 根据需要进行引用。
别名有时候也称为导出列
执行算数计算
select 字段A,字段B,字段C,A*B*C AS RESULT FROM 表名

第十一章:使用数据处理函数

例如:RTrim() 去掉串尾空格
函数没有SQL的可移植性强。几乎每种DBMS的实现都支持其他不实现的函数。而且有时差异很大。
使用函数
大多数SQL支持以下类型的函数
1.用于处理文本串的文本函数
2.数值的算数操作
3.用于处理日期和时间值
4.返回DBMS正使用的特殊信息(返回用户登录信息,检查版本细节)
第一类:
Upper() 将文本转换为大写
Length() 返回串的长度
Lower()变为小写
等等…
第二类:
AddDate() 增加一个日期
AddTime() 增加一个时间
Day() 返回一个日期的天数部分
等等…
第三类:
在主要DBMS的函数中,数值函数是最一致最统一的函数。
Abs() 返回一个数的绝对值
Rand() 返回一个数的随机数
Sqrt() 返回一个数的平方根

第十二章:汇总数据

1.聚集函数
有些要求不是对表中数据本身,而是对表中数据进行汇总。因此返回实际表数据是一种对时间和处理资源的一种浪费。
MySQL给出了5个聚集函数
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 某列最大值
MIN() 最小值
SUM 某列之和
举例:
select AVG(列名) AS B from 表;
select count(*) as B from 表; 对所有行计数,不管包含的是空值(NULL)还是非空值。
使用count(column) 对特定列中具有值的行进行计数,忽略NULL值
2.聚集不同值
ALL 为默认的,不需要指定,如果不指定DISTINCT,则假定为NULL。
如果指定列名,则distinct只能用于count(),distinct不能用于count(*)
distinct必须使用列名

第十三章:分组数据

涉及2个子句:group by 和having子句
1.创建分组
举例:
select vend_id ,COUNT(*) AS num_prods from products group by vend_id;
实现了分组计数。
使用group by 子句前,需要知道
GROUP BY 子句可以包含任意数目的列。
如果在GROUP BY 自己嵌套了分组,数据将在最后一个分组上进行汇总。
子句列出的每个列都必须是检索列或者有效的表达式(非聚集函数)。
如果分组列中具有NULL值,则NULL将作为一个分组返回。多个NULL的话,作为一组返回。
GROUP BY 自己必须出现在WHERE子句之后,ORDER BY子句之前
WHERE过滤行,,HAVING过滤分组
HAVING支持所有的where操作符。
举例:
select cust_id ,COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >=2;
HAVING和ORDER的区别
where在数据分组前进行过滤,having在数据分组后进行过滤。
分组和排序
order by: :::::group by
排序产生的输出::::分组行,但输出可能不是分组的顺序
任意列都可以使用(甚至非选择的列也可以使用)::::只可能使用选择的列,而且必须使用每个选择列表达式
不一定需要::::如果与聚集函数一起使用列(或表达式),则必须使用
一般在使用GROUP BY 自己时,应该也给出ORDER BY 子句。这是保证数据正确培训的唯一方法。千瓦不要仅依赖GROUP BY 排序数据。
重要关键点:select 子句排序
select 要返回的列 或表达式
from 从哪个表
where 行级过滤
group by 分组说明
having 组级过滤
order by 输出排序顺序
limit 要检索的行数
第十四章————-第十八章
暂时未看

第十九章: 插入数据

数据插入:insert
1.插入完整的行
2.插入行的一部分
3.插入多行
4.插入某些查询的结果
可针对每个表或每个用户,利用MySQL的安全机制禁止使用INSERT语句。
举例:
insert into customers values(NULL,”,…);
更安全的写法是:insert into customers (A,B,C) values(a,b,c);
因为编写依赖于特定列次序的SQL语句是很不安全的。有时第一种方法难免出错误。
尽量使用列的列表。能使SQL代码发挥作用,即使表结构发生变化。
插入多行:可以使用多条insert语句,甚至一次提交它们,每条语句使用一个分号结束。
如果它们的列名(次序)相同,其中单条insert语句有多组值,每组值用一对圆括号括起来,逗号隔开。
使用单条insert比用多条insert快多了。
插入检索出的数据
采用insert select 形式 在合并表时很有效果的。

第二十章:更新和删除数据

1.更新数据
为了更新(修改)表中的数据,可使用UPDATE语句。可采用2种方法使用update:
更新表中的特定行
更新所有行
更新多个列时,需要使用单个SET命令,每个“列=值”对之间用逗号分隔()
举例:
update customers
SET cust_email =’[email protected]
WHERE cust_id=1003;
2.删除数据
可以删除一行或者删除整行。
注意:delete语句从表中删除行,甚至是删除表中所有行,但是delete不删除表本身。
如果想从表中删除所有行,不要使用delete,可使用truncate table语句。它完成相同的工作,但速度更快。truncate 实际上是删除原来的表并重新创建一个表。而不是逐行删除表中的数据。

使用update和delete一般都需要带where子句,不然就是完全删除了。
使用2者的好习惯:
1.尽量带上where子句
2.保证每个表都有主键
3.在对update或delete之前,可以先用select进行测试,保证它过滤的是正确的记录,以防编写的where子句不正确。
4.使用强制实施引用完整性的数据库。
注意:mysql没有撤销按钮,非常小心使用update和delete。

第二十一章:创建和操纵表

1.创建
create table 表名;
不要把NULL值与空串相混淆,NULL值是没有值,它不是空串,如果指定’ ’ (2个单引号,其间没有字符),这在NOT NULL 中是允许的。空串是一个有效的值。它不是无值。NULL值用关键字NULL而不是空串指定。
每个表只允许一个AUTO_INCREMENT列,而且它必须被索引
指定默认值:使用default 关键字指定;
尽量使用默认值而不是NULL列。
引擎类型
ENGINE=InnoDB;
MYSQL和其他的DBMS不同,它具有多种引擎。它打包多个引擎,这些引擎都隐藏在MYSQL服务器中。
因为不同的引擎各自特性不同,为不同的任务选择正确的引擎能获得良好的功能和灵活性。
几个引擎的区别:
InnoDB是一个可靠的事务处理引擎,它不支持全文本搜索。
MEMORY,存储与内存(不是磁盘),速度很快
MyISAM :性能极高的引擎,支持全文本搜索,但是不支持事务处理。
更新表
alter table
添加add
删除drop
小心使用alter table;使用alter table 要极其小心,应该在进行改动前做一个完整的备份,因为表的更改是不能撤销的。
删除表:
drop table 表名;
重命名表
RENAME TABLE customers TO customers;

第二十二章 使用视图

是什么,怎么工作,何时用。
视图:虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
视图的一些常见应用
1.重用SQL语句
2.简化复杂的SQL操作,在编写查询后,可以方便地重用它而不必知道它的基本查询细节。
3.使用表的组成部分而不是整个表
4.保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
5.更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
视图创建后,可以与表基本相同的方式利用它们,可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至能添加和更新数据 。
视图本身不包含数据,因为它们返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。
性能问题:因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,性能可能会大大下降,所以当要部署大量视图时,先进行测试。
视图的规则和限制
1名字唯一
2.数目无限制
3.得有权限
4.可嵌套
5.order by 可用于视图中,但如果从该视图检索数据的select语句也有order by,按后者。
6.视图不能索引,也不能有关联的触发器或默认值
7.可以和表一起用
视图使用
创建CREATE VIEW 语句来创建
show create view viewname;
drop view viewname;
更新视图:先用drop再用create。或者create or replace view。
视图简化复杂的联结
就是对select封装一次
**create view viewname AS
select A,B,C,D FROM 表名 WHERE ….**
得到的就是视图。
视图极大的简化了复杂SQL语句的使用,利用视图,可一次性编写基础的SQL,然后根据需要多次使用。
创建可重用的视图:创建不受特定数据限制的视图是一种好办法。
视图的另一常用用途是:重新格式化检索出来的数据。
用视图过滤掉不想要的数据:视图对于应用普通的where子句很有用,
使用视图与计算字段
视图对于简化计算字段的使用特别有用。
更新视图
是否能否被更新?
答案:视情况而定。
通常,视图是可更新的,即,可以对它们使用INSERT,UPDATE和DELETE.更新一个视图将更新其基表。如果对视图增加或者删除行,其实是对基表增加或者删除行。
并非所有视图都能被更新。如果Mysql不能正确地确定被更新的基数据,则不允许数据(包括插入和删除)。这实际上意味着,如果视图定义中有以下操作,则不能进行视图的更新。就是有以下操作时,不能进行视图的更新:
分组: GROUP BY 和 HAVING
联结:
子查询:
并;
聚集函数(Min/Count/Sum)
DISTINCT;
导出(计算)列
一般,应该将视图用于检索,而不用于更新

第二十三章:使用存储过程

什么是、为什么要用、如何使用、创建和使用的语法
存储过程:为以后的使用而保存的一条或多条的MySQL语句的集合。可将其视为批文件,虽然他们的作用不仅限于批处理。
为什么使用,以及它的好处?
1.把处理封装在容易使用的单元中,简化复杂操作。
2.不要求反复建立一系列的处理步骤,保证了数据的完整性。
3.简化对变动的管理。如果表名或者列名有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。
4.提高性能。因为使用存储过程比使用单独的SQL语句要快。
简单来说:简单、安全、高性能。
缺陷:编写复杂,很多管理员仅允许使用,但不允许创建存储过程。
使用存储过程
称“存储过程”的执行为调用。因此MySQL执行存储过程的语句为CALL,CALL接受存储过程的名字以及需要传递给它的参数。大多数时候都是调用,而不是定义。
举例: CALL productpricing(@pricelow,@pricehigh,@priceaverage); 执行名为productpricing的存储过程。
创建存储过程:举例:
create procedure producepricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END;
因为这个也是由;结束函数体的。mysql命令行可能会遇到问题:
解决方法:临时更改命令行实用程序的语句分隔符。如下所示
DELIMITER //
CREATE PROCEDURE**重点内容** productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END //
DELIMITER ;
删除存储过程: drop procedure xx;
MySQL支持IN、OUT、INOUT (对存储过程传入和传出)类型的参数。存储过程的代码位于begin和end语句内,是一系列的select语句,用来检索值,然后保存到相应的变量(通过指定INTO关键字)。
参数的数据类型
存储过程的参数允许的数据类型与表中使用的数据类型相同。
记录集不是允许的类型,因此,不能通过一个参数返回多个行和列
检查存储过程
show create procedure ordertotal;

第二十四章 使用游标

为什么有,什么是,如何使用?
MySQL检索返回一组称为结果集的行,这组返回的行都是与SQL语句相匹配的行(0行或多行),使用简单的SELECT语句,没有办法得到下一行或前10行,有时,需要在检索出来的行汇总前进或后退一行或多行。这就是使用游标的原因。
游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
游标主要用于交互式应用。其中用户需要滚动屏幕上的数据,并对数据进行浏览或作出更改。
只能用于存储过程 不像多数DBMS,MySQL游标只能用于存储过程(和函数)
使用游标
1.在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的select语句。
2.一旦声明后,必须打开游标以供使用。这个过程用前面定义的select语句把数据实际检索出来。
3.对于填有数据的游标,根据需要取出(检索)各行。
4.在结束游标使用时,必须关闭游标。
在声明游标后,可根据需要频繁打开和关闭游标。在游标打开后,可根据需要频繁地执行取操作
创建游标
游标用DECLARE语句创建,DECLARE命名游标,并定义相应的SELECT语句,根据需要带WHERE和其他子句。
举例:
CREATE PROCEDURE processorders()
BEGIN

DECLARE o INT;  //声明的局部变量o
DECLARE ordernumbers CURSOR       //声明的游标ordernumbers
FOR        
SELECT order_num FROM orders;      
OPEN ordernumbers;               //打开游标
.......................
FETCH ordermbers INTO o;                  //将检索值存放到一个名为o的局部声明的变量中。

CLOSE ordernumbers; //关闭游标
END;
这个存储过程中,使用DECLARE语句来定义和命名游标。存储过程处理完成后,游标就消失 。(因为它局限与存储过程)。
打开游标
OPEN ordernumbers;
关闭游标
CLOSE ordernumbers;
使用游标数据
在一个游标被打开后,可以使用FETCH语句分别访问它的每一行。FETCH指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针使下一条FETCH语句检索下一行(不重复读取下一行)
注意:
DELEARE语句的发布存在特定的次序。用DECLARE语句定义的局部变量必须在定义任意游标或句柄之前定义,而句柄必须必须在游标之后定义。
重复:使用REPEAT语句,还支持循环语句,直到使用LEAVE语句手动退出为止。通常REPEAT语句的语法使它更适合于对游标进行循环。

扫描二维码关注公众号,回复: 2776227 查看本文章

第二十五章:触发器

什么是,为什么用,如何用?
当某个表发生更改时自动处理,确切说就是触发器。
触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句。
DELETE
INSERT
UPDATE
其他mysql语句不支持触发器
创建触发器:给出4条信息
1.唯一的名
2.关联的表
3.应该响应的活动(DELETE、INSERT、UPDATE)
4.何时执行(处理之前或之后)
在MySQL中,每个表的触发器名字不同就可以,但是,其他的DBMS中这是不行的,最好在库范围内使用唯一的触发器名字。
采用 CREATE TRIGGER语句创建 举例子:
CREATE TRIGGER newproduct AFTER INSERT ON products
FOR EACH ROW SELECT ‘Product added’
仅支持表:只有表才支持触发器,视图不支持(临时表也不支持)
每个表每个事件每次只允许一个触发器。因此每个表最多支持6个触发器。(每条INSERT/UPDATE/DELETE的之前或之后),单一触发器不能与多个事件或多个表关联。
触发器失败
如果BEFORE触发器失败,则MySQL将不执行请求的操作,此处,如果BEFORE触发器或语句本身失败,MySQL将不执行AFTER触发器(如果有的话)。
删除触发器:
drop trigger 名字;
触发器不能更新或覆盖,为了修改一个触发器,必须先删除它,然后再重新创建
使用触发器
其他内容:
1.创建触发器可能需要特殊的安全访问权限,但是触发器的执行时自动的。只要insert、update和delete可以执行,则相关的触发器也能执行。
2.应该用触发器来保证数据的一致性(大小写,格式等),在触发器中执行这种类型的处理的优点是它总是进行这种处理,而是是透明地进行。
3.一个应用:创建审计跟踪。使用触发器,把更改记录到另一个表很容易。
4.触发器不支持call语句。这表示不能从触发器内调用存储过程。

第二十六章:事务管理

什么是,如何用COMMIT和ROLLBACK语句
并非所有的引擎都支持事务处理:InnoDB支持事务处理管理,MyISAM不支持。
事务处理:可以用来维护数据库的完整性。能保证成批的MySQL操作要么完全执行,要么完全不执行。
事务transaction:指一组SQL语句。
回退rollback:指撤销指定SQL语句的过程
提交commit:指将未存储的SQL语句结果写入数据库表
保留点savepoint:指事务处理中设置的临时占位符(place-holder),你可以对它发布回退(与回退整个事务处理不同)
MySQL使用下面的语句来标识事务的开始
START TRANSACTION
ROLLBACK只能在一个事务处理内使用(在执行上面一条命令之后)。
不能回退的语句
1.不能回退select语句
2.不能回退create或drop操作
使用COMMIT
一般的MySQL语句都是直接针对数据库表执行和编写的,就是隐含提交。即提交是自动完成的。
但是,在事务管理块中,提交不会隐含进行。为进行明确的提交,使用commit语句。
当使用commit或rollback后,事务会隐含自动关闭
使用保留点
为了支持回退部分事务处理,必须能在事务处理块中合适的位置上放置占位符。这样,如果需要回退,可以回退到某个占位符。这些占位符就称为保留点。为了创建占位符,可如下使用SAVEPOINT语句
SAVEPOINT delete1;
每个保留点都取标识它的唯一名字,以便在回退时,MySQL知道要回退到何处,为了回退到本例给出的保留点。
ROLLBACK TO delete1;
保留点越多越好:
释放保留点:保留点在事务处理完成后自动释放。也可以用RELEASE SAVEPOINT来明确地释放保留点。
更改默认的提交行为
默认的MYSQL是自动提交所有更改,任何时候你执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即生效。
为了让MySQL不自动提交更改,需要使用以下语句
SET autocommit=0;
autocommit 标志决定是否自动提交更改。该标志是针对每个连接而不是服务器的。

第二十七章:全球化和本地化

字符集:字母和符号的集合
编码:为某个字符集成员的内部表示
校对:为规定字符如何比较的指令
显示字符集:show character set;
show collation;
此语句显示所有可用的校对,以及它们适用的字符集。
有的字符集具有不止一种校对。

二十八章:安全管理

需要给用户提供它们所需要的访问权,并仅提供它们所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。
创建用户账号
create user ben ;
rename user ben to negn;
删除用户账号
drop user ben;
设置访问权限
首先查看赋予的权限:show grants for ben;
设置权限使用grant语句,要求以下信息:
1.要授予的权限
2.被授予访问权限的数据库或表
3.用户名
举例:
GRANT select ON cranscourse.* TO ben;
允许用户在crashcourse.*(该数据库的所有表上)使用select。此时ben具有只读权限。
撤销权限是:revoke
GRANT和REVOKE可在几个层次上控制访问权限
整个服务器:GRANT ALL REVOKE ALL;
整个数据库:ON database.*
特定的表:使用ON database.table
特定的列:
特定的存储过程:
使用GRANT和REVOKE,用户账号必须存在。
通过逗号,可以简化授权,将多条GRANT语句串在一起。
GRANT SELECT ,INSERT ON crashcourse.* TO BEN;
更改口令
SET PASSWD FOR B=Passwd(‘fdjlfjdlj’);
SET PASSWD 更新用户口令,新口令必须传到passwd()函数加密。
设置自己的口令:
SET PASSWD =PASSWD ();

第二十九章:数据库维护

备份数据:

必须经常备份。
方案:
1.mysqldump 转存所有数据库内容到某个外部文件。在进行常规备份前这个实用程序应该正常运行。以便能正确备份转存文件。
2.mysqlhotcopy
3.BACKUP TABLE 或SELECT INTO OUTFILE转存到外部文件。
备份前刷新:FLUSH TABLES语句。
数据库维护
ANALYZE TABLE;用来检查表键是否正确。
CHECK TABLE;针对许多问题对表进行检查。
查看日志文件
1.错误日志:包含启动和关闭问题以及任意关键错误的细节。通常名为hostname.err
2.查询日志:记录所有MySql活动,hostname.log
3.二进制日志:记录更新过数据的所有语句。
4.缓慢查询日志:记录执行缓慢的任何查询。这个日志在确定数据库何处需要优化很有用。
使用日志前,需要FLUSH LOGS 刷新和重新开始所有日志文件。

第三十章:

改善性能:
MySQL是一个多用户多线程的DBMS.
经常同时执行多个任务,可使用show processlist 查看所有活动进程。
kill关闭进程
总有不止一种方法编写同一条select语句,找出最佳的
存储过程更快
决不要检索比需求还多的数据;
在导入数据时,应该关闭自动提交;
必须索引数据库表以改善数据检索的性能。
LIKE很慢。一般最好使用FULLTEXT而不是LIKE
数据库是不断变化的实体,一组优化良好的表一会儿可能就面目全非了。
重要原则:每条规则在某些条件都会被打破。

猜你喜欢

转载自blog.csdn.net/xiongluo0628/article/details/81665232