阅读——mysql必知必会

什么是sql?

SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured QueryLanguage)的缩写。SQL是一种专门用来与数据库通信的语言。与其他语言(如,英语以及Java和Visual Basic这样的程序设计语言)不一样,SQL由很少的词构成,这是有意而为的。设计SQL的目的是很好地完成一项任务,即提供一种从数据库中读写数据的简单有效的方法。

什么是mysql?

我们在前一章中介绍了数据库和SQL。正如所述,数据的所有存储、检索、管理和处理实际上是由数据库软件——DBMS(数据库管理系统)完成的。MySQL是一种DBMS(database manage system),即它是一种数据库软件。

DBMS可分为两类:一类为基于共享文件系统的DBMS,另一类为基于客户机——服务器的DBMS。前者(包括诸如Microsoft Access和FileMaker)用于桌面用途,通常不用于高端或更关键的应用。MySQL、Oracle以及Microsoft SQL Server等数据库是基于客户机——服务器的。服务器部分是负责所有数据访问和处理的一个软件,运行在称为数据库服务器的计算机上,数据、数据添加、删除和数据更新的所有请求都由服务器软件完成。客户机是与用户打交道的软件。

❑ 服务器软件为MySQL DBMS。你可以在本地安装的副本上运行,也可以连接到运行在你具有访问权的远程服务器上的一个副本。

❑ 客户机可以是MySQL提供的工具、脚本语言(如Perl)、Web应用开发语言(如ASP、ColdFusion、JSP和PHP)、程序设计语言(如C、C++、Java)等。

MySQL关系型数据库于1998年1月发行第一个版本。它使用系统核心提供的多线程机制提供完全的多线程运行模式,提供了面向C、C++、Eiffel、Java、Perl、PHP、Python以及Tcl等编程语言的编程接口(APIs),支持多种字段类型并且提供了完整的操作符支持查询中的SELECT和WHERE操作。


mysql必知必会讲了些啥?

数据筛选——where —— xxx between min and max、xxx is null

数据通配符——like——h%d, d%,%hyd%、正则表达式

创建计算字段——concat 

数据处理函数—— Trim() 去除空格

汇总数据——AVG() 忽略列值为NULL的行,min,max,sum

分组数据——group by, having过滤分组

使用子查询——

连结表——

等价于
这种写法更加被鼓励,因为不会忘记关联条件,且效率通常会高
聚集函数也可以和联结一起使用

组合查询——  union会自动去除重复的行,如果想返回所有匹配行,可使用UNION ALL而不是UNION。

全文本搜索——功能与like差不多,但是会返回类似相似度的东西,like不支持相似度排序,fulltext类型的match & against语法支持

基础用法,全文本搜索提供了简单LIKE搜索不能提供的功能。而且,由于数据是索引的,全文本搜索还相当快。


拓展搜索,第一行包含词anvils,因此等级最高。第二行与anvils无关,但因为它包含第一行中的两个词(customer和recommend),所以也被检索出来。第3行也包含这两个相同的词,但它们在文本中的位置更靠后且分开得更远,因此也包含这一行,但等级为第三。


布尔搜索,这次只返回一行。这一次仍然匹配词heavy,但-rope*明确地指示MySQL排除包含rope*(任何以rope开始的词,包括ropes)的行,这就是为什么上一个例子中的第一行被排除的原因。

插入数据——

数据库经常被多个客户访问,对处理什么请求以及用什么次序处理进行管理是MySQL的任务。INSERT操作可能很耗时(特别是有很多索引需要更新时),而且它可能降低等待处理的SELECT语句的性能。,如果数据检索是最重要的(通常是这样),则你可以通过在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句的优先级。

从别的表里读出来插入  insert into customers(列名)select xxx from another_table

更新和删除数据——

更新数据语法
删除数据语法,如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更快(TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据)。

创建和操纵表——

如果你仅想在一个表不存在时创建它,应该在表名后给出IF NOT EXISTS。
主键值必须唯一。即,表中的每个行必须具有唯一的主键值。如果主键使用单个列,则它的值必须唯一。如果使用多个列,则这些列的组合值必须唯一。

与其他DBMS一样,MySQL有一个具体管理和处理数据的内部引擎。在你使用CREATE TABLE语句时,该引擎具体创建表,而在你使用SELECT语句或进行其他数据库处理时,该引擎在内部处理你的请求。多数时候,此引擎都隐藏在DBMS内,不需要过多关注它。

外键不能跨引擎,那么,你应该使用哪个引擎?这有赖于你需要什么样的特性。MyISAM由于其性能和特性可能是最受欢迎的引擎。但如果你需要可靠的事务处理,可以使用其他引擎。

alter table 表名 add column 列名 CHAR(20)

小心使用ALTER TABLE 使用ALTER TABLE要极为小心,应该在进行改动前做一个完整的备份(模式和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,可能不能删除它们。类似地,如果删除了不应该删除的列,可能会丢失该列中的所有数据。

删除表(删除整个表而不是其内容)非常简单,使用DROP TABLE语句即可

使用视图——

视图就是个虚拟表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

重要的是知道视图仅仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。
select * from productcustomers where xxx = xxx, 就是一个复用的概念
还有一个用途就是用来格式化数据,比如经常要的格式和原始数据不一致的时候,创建一个所需格式的视图往往很方便,比如这里在供应商后面加上了来源的国家

应该将视图用于检索(SELECT语句)而不用于更新(INSERT、UPDATE和DELETE),视图提供了一种MySQL的SELECT语句层次的封装,可用来简化数据处理以及重新格式化基础数据或保护基础数据。

使用存储过程——

使用存储过程有3个主要的好处,即简单、安全、高性能。显然,它们都很重要。不过,在将SQL代码转换为存储过程前,也必须知道它的一些缺陷。

❑ 一般来说,存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。

❑ 你可能没有创建存储过程的安全访问权限。许多数据库管理员限制存储过程的创建权限,允许用户使用存储过程,但不允许他们创建存储过程。

如果想要看一个存储过程的详情,也是show create procedure ordertotal

之前工作时候有用到过一个获取上一个交易日的函数,应该就是个存储过程,回头看一下

使用游标——

由前几章可知,MySQL检索操作返回一组称为结果集的行。这组返回的行都是与SQL语句相匹配的行(零行或多行)。使用简单的SELECT语句,例如,没有办法得到第一行、下一行或前10行,也不存在每次一行地处理所有行的简单方法(相对于成批地处理它们)。有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。

这边已经感觉不怎么常用了

使用触发器——

insert的时候触发触发器

管理事务处理——

并非所有引擎都支持事务处理 正如第21章所述,MySQL支持几种基本的数据库引擎。正如本章所述,并非所有引擎都支持明确的事务处理管理。MyISAM和InnoDB是两种最常使用的引擎。前者不支持明确的事务处理管理,而后者支持。这就是为什么本书中使用的样例表被创建来使用InnoDB而不是更经常使用的MyISAM的原因。如果你的应用中需要事务处理功能,则一定要使用正确的引擎类型。事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行

在使用事务和事务处理时,有几个关键词汇反复出现。下面是关于事务处理需要知道的几个术语:

❑ 事务(transaction)指一组SQL语句;

❑ 回退(rollback)指撤销指定SQL语句的过程;

❑ 提交(commit)指将未存储的SQL语句结果写入数据库表;

❑ 保留点(savepoint)指事务处理中设置的临时占位符(place-holder),你可以对它发布回退(与回退整个事务处理不同)。

哪些语句可以回退? 事务处理用来管理INSERT、UPDATE和DELETE语句。你不能回退SELECT语句。(这样做也没有什么意义。)你不能回退CREATE或DROP操作。

安全管理——

MySQL用户账号和信息存储在名为mysql的MySQL数据库中。

use mysql;

select user from user;

show grants for hyd, 数据库权限使用 grant select on 库名.* 表名 hyd

改善性能——

重要!!!!

附录——

mysql的数据类型


你可能会认为电话号码和邮政编码应该存储在数值字段中(数值字段只存储数值数据),但是,这样做却是不可取的。如果在数值字段中存储邮政编码01234,则保存的将是数值1234,实际上丢失了一位数字。需要遵守的基本规则是:如果数值是计算(求和、平均等)中使用的数值,则应该存储在数值数据类型列中。如果作为字符串(可能只包含数字)使用,则应该保存在串数据类型列中。

sql运行的慢是因为什么?

https://zhuanlan.zhihu.com/p/62941196


https://mp.weixin.qq.com/s/RemJcqPIvLArmfWIhoaZ1g

你可能感兴趣的:(阅读——mysql必知必会)