MySQL:

因为前面的两篇笔记已经写了SQL的常见用法,这里就重点介绍一下MySQL和SQL不同之处,相同的地方就简略一点了。

MySQL简介:

MySQL是一种DBMS,即是一种数据库软件。它以成本低,性能高,可信赖,简单等优点收获了大量公司和开发者。DBMS可以分为两部分:一部分为基于共享文件系统的DBMS,用于桌面用途,通常不用于高端或者更关键的应用;一部分为基于客户端-服务器端的DBMS,MySQL,Oracle等等数据库都是基于客户端-服务器端的数据库。其中客户端-服务器端应用又可以分为两部分,服务器部分是负责所有的数据访问和处理的一个软件。关于数据的添加,删除,更新的所有请求都是由服务器软件完成。而这些请求来自客户端软件的计算机,客户端是与用户打交道的软件。

补充概念:

  1. 自动增量:某些表需要唯一的值。在每个行添加到表中时,MySQL可以自动的为每个行分配下一个可用编号,不用在添加每一行时手动分配唯一值。这样做必须记住最后一次使用的值。这个功能就是所谓的自动增量,如果需要它,则必须在用CREATE语句创建表时把它作为表定义的组成部分。
  2. use选择数据库;show databases返回可用数据库列表;show tables返回一个数据库内的表;show columns from 表返回显示的表列(MySQL支持describe作为show columns from的一种快捷方式);show status返回用于显示广泛的服务器状态信息;show grants 用来授予用户的安全权限;show error和show warnings用来显示服务器错误或者警告的信息。

检索数据:

SELECT语句:用于从一个表或者多个表中检索信息。

检索单个列:

SELECT 列 --从该表中检索什么列
FROM 表名;--FROM关键字表示从哪个表中检索数据

检索多个列:

不同的是,检索多个列必须在SELECT关键字后面给出多个列名,列名之间必须以逗号分隔。注意:最后一个列名不需要加上逗号,否则报错。

​SELECT 列1,列2,列3--多个列,最后一个列不能有逗号
FROM 表名;--FROM关键字表示从哪个表中检索数据

检索所有列:

使用通配符(*)加上SELECT语句,一般而言,除非确实需要表的每一列,否则不要使用*通配符。虽然省事,但是会降低检索速度和应用程序的性能。注意:使用通配符有一个优点:由于检索每一列,所以可以检索出名字未知的列。

SELECT *
FROM 表名;

检索不同的值:

因为SELECT语句返回所有的匹配值,如果不希望匹配值重复出现,则可以使用SELECT和DISTINCT组合。它告诉MySQL只返回不同的匹配值,如果有多列,那么会返回不重复的列的组合。

SELECT DISTINCT 列--表中该列不重复的匹配值
FROM 表名;
 
SELECT DISTINCT 列1,列2--表中这些列不重复的组合匹配值
FROM 表名;

限制结果:

在MySQL,MariaDB,PostgreSQL或者SQLlite,需要使用LIMIT子句:

​SELECT 列
FROM 表名
LIMIT 5;--表示返回不超过5行;

​SELECT 列
FROM 表名
LIMIT 5 OFFSET 5;--表示从DBMS返回的第5行开始的5行数据,第一个数字是检索的行数,第二个数字是从哪里开始

注意:在使用带两个值的LIMIT时,注意行0.

排序检索数据:

排序数据:

ORDER BY子句可以取一个列或者多个列,据此对输出进行排序。在指定一条ORDER BY子句时,应该保证它是SELECT语句中的最后一句子句。

SELECT 列 
FROM 表名
ORDER BY 列;--对该列排序

按多个列排序:

SELECT 列1,列2,列3
FROM 表名
ORDER BY 列1,列2;--先对列1进行排序,当列1的值相同的时候,才会对列1相同值的行按照列2再进行排序。

指定排序方向:

数据排序不限于(从A到Z)升序排序,这是默认的排序顺序。还可以使用ORDER BY子句配合DESC关键字进行降序排序。

​SELECT 列1,列2,列3
FROM 表名
ORDER BY 列1 DESC;--对列1降序排序

过滤数据:

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。注意MySQL不支持!>,!<,IS NULL这三个WHERE子句操作符。

#检查相等
SELECT 列
FROM 表
WHERE 列=3;--返回列等于3的行
 
#检查单个值
SELECT 列
FROM 表
WHERE 列<3;--返回列小于3的行
 
#不匹配检查
SELECT 列
FROM 表
WHERE 列<>'D';--返回列不等于D的行
 
/*对于什么时候加上单引号的情况,单引号用来限定字符串。
也就是说,如果将值与字符串类型的列进行比较的话,那么
该值就要加上单引号,如果将值与数值列进行比较的话,那
么就不用加上单引号*/
 
#范围值检查
SELECT 列
FROM 表
WHERE 列 BETWEEN 5 AND 10;--返回列范围在5到10之间的行,包括5和10
 
#空值检查
SELECT 列
FROM 表
WHERE 列 IS NULL;--返回列等于NULL的行
 
/*在一个列不包含值时,我们称其包含空值NULL。它与字段包含
0,空字符串或者仅仅包含空格不同。*/
 
/*通过过滤选择不包含指定值的所有行时,你可能希望返回含NULL
值的行。但是这做不到,因为NULL比较特殊,所以在进行匹配过滤
或者非匹配过滤时,不会返回这些结果。*/
 

高级数据过滤:

AND操作符:用在WHERE子句中的关键字,用来指示检索满足所有指定条件的行。

SELECT 列1,列2
FROM 表
WHERE 列1=3 AND 列2=5;--返回列1等于3并且列2等于5的行

OR操作符:用在WHERE子句中的关键字,用来指示检索满足任一指定条件的行。当第一个条件满足时,不管第二个条件是否满足,相应的行都将被检索出来。

​SELECT 列1,列2
FROM 表
WHERE 列1=3 OR 列2=5;--返回列1等于3或者列2等于5的行

求值顺序:在处理OR操作符前,优先处理AND操作符。为了避免操作符被错误组合,可以使用圆括号()对操作符进行明确的分组。
 

IN操作符:

IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配,IN操作符取一组由逗号分隔,括在圆括号中的合法值。

SELECT 列1,列2,列3
FROM 表
WHERE 列1 IN(3,5);--返回列1满足3或者5的行

NOT操作符:

WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后面所跟着的任何条件。

SELECT 列1,列2,列3
FROM 表
WHERE NOT 列1=3;--返回列1!=3的行,也就是非列1=3的行

用通配符进行过滤:

通配符可用用来匹配值的一部分的特殊字符。为了在搜索子句中使用通配符,必须使用LIKE操作符,用于告诉MySQL利用通配符匹配。通配符搜索只能用于文本字段,非文本字段不能使用通配符搜索。

百分号%通配符:

最常使用的通配符是百分号%,在搜索串中,%表示任何字符出现任意次数。

WHERE 列 LIKE 'F%'--以F为开头的
WHERE 列 LIKE '%F'--以F为结尾的
WHERE 列 LIKE '%F%'--包含F的,不管之前之后是什么字符

注意:1.根据MySQL的配置方式,搜索是可以区分大小写的;2.尾空格;3.%不匹配null值。

下划线_通配符:

下划线通配符只匹配单个字符,而不是多个字符。当然下划线可以组合使用,比如:_,__,___。

WHERE 列 LIKE '__ for'--for前面有两个字符
WHERE 列 LIKE '_ for'--for前面有一个字符
WHERE 列 LIKE 'f_r'

*用正则表达式进行搜索:

正则表达式是用来匹配文本的特殊的串。MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式过滤SELECT检索出的数据。

基本字符匹配:

SELECT 列
FROM 表
WHERE 列 REGEXP '100'
ORDER BY 列;

关键字为REGEXP,它后面跟着的为正则表达式。注意:匹配不区分大小写。

其他操作还有:

SELECT 列
FROM 表
WHERE 列 REGEXP '1000|2000'--OR匹配
ORDER BY 列;

SELECT 列
FROM 表
WHERE 列 REGEXP '[123]'--匹配括号其中之一
ORDER BY 列;

SELECT 列
FROM 表
WHERE 列 REGEXP '[1-5]'--匹配范围内的数字,或者[a-s]
ORDER BY 列;

SELECT 列
FROM 表
WHERE 列 REGEXP '\\.'--匹配特殊字符,使用\\转义
ORDER BY 列;

当然还有匹配字符类:

说明
[:alnum:] 任意字母和数字(同[a-zA-Z0-9]) 
[:alpha:]任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\\t]) 
[:cntrl:]ASCII控制字符(ASCII0到31和127)
[:digit:]任意数字(同[0-9])
[:graph:] 与[:print:]相同,但不包括空格
[:print:]任意可打印字符
[:lower:]任意小写字母(同[a-z])
[:punct:]既不在[:alnum:]又不在[:cntrl:]中的任意字符 )
[: space:]包括空格在内的任意空白字符
[:upper:]任意大写字母(同[A-Z])
[:xdigit:]任意十六进制数字

匹配多个实例:

目前为止使用的正则表达式都试图匹配单次出现,如果存在一个匹配,该行被检索出来,如果不存在,就检索不出来。但有时候需要对匹配的数目进行更强的控制。

元字符说明
*0或者多个匹配
+1或者多个匹配
0或者1个匹配
{n}指定数目的匹配
{n,}不少于指定数目的匹配
{n,m}匹配数目的范围,不超过255
SELECT 列
FROM 表
WHERE 列 REGEXP 'RS?';--表示?前面的任何字符0或者1次出现

定位符:

匹配特定位置的文本,就需要定位符:

元字符说明
^文本的开始
$文本的结尾
[[:<:]]词的开始
[[:>:]]词的结尾
​SELECT 列
FROM 表
WHERE 列 REGEXP '^[0-9]'--以0-9开始的文本

注意:^的双重用途,在集合中,除了用来否定该集合,还可以指定串的开始处。

创建计算字段:

拼接字段:使用Concat()函数,去掉空格使用RTrim()函数。

SELECT Concat(列1,列2)--或者SELECT Concat(列1,'(',列2,')'),加上括号
FROM 表
ORDER BY 列1;
​
SELECT Concat(RTRIM(列1),RTRIM(列2))--或者SELECT Concat(RTRIM(列1),'(',RTRIM(列2),')')
FROM 表
ORDER BY 列1;

使用别名:AS关键字。

SELECT Concat(RTRIM(列1),RTRIM(列2))--或者SELECT Concat(RTRIM(列1),'(',RTRIM(列2),')')
AS 别名
FROM 表
ORDER BY 列1;

执行算术计算:计算字段的另一个常见用途就是对检索的数据进行算术运算,SQL的基本算术运算符有:+,-,*,/(加,减,乘,除)四种,也可以配合圆括号区分优先级。

SELECT 列1,列2,列1*列2 AS 别名
FROM 表;

函数:

大多数SQL实现都支持以下类型的函数:

  1. 用于处理文本字符串的文本函数。 
  2. 数值函数。
  3. 日期和时间函数。
  4. 格式化函数。
  5. 返回DBMS正使用的特殊信息(如返回用户登录信息)的系统函数。

常用的文本处理函数:

函数说明
left()返回字符串左边的字符
length()返回字符串的长度
locate()找出串的一个子串
lower()将字符串转换为小写
lTrim()去掉字符串左边的空格
Right()返回字符串右边的字符
RTrim()去掉字符串右边的空格
Soundex() 返回字符串的SOUNDEX值
SubString()返回子串的字符
Upper()将字符串转换为大写

常用的日期和时间处理函数:

函数说明
AddDate()增加一个日期(天,周等)
AddTime()增加一个时间(时,分等)
CurDate()返回当前日期
CurTime()返回当前时间
Date()返回日期时间的日期部分
DateDiff()计算两个日期之差
Date_Add()高度灵活的日期运算函数
Date_Format()返回一个格式化的日期或者时间串
Day()返回日期的天数部分
DayOfWeek()对于一个日期,返回对应的星期几
Hour()返回时间的小时部分
Minute()返回时间的分钟部分
Month()返回日期的月份
Now()返回当前的日期和时间
Second()返回时间的秒部分
Time()返回日期时间的时间部分
Year()返回一个日期的年份部分

注意:首选的日期格式为yyyy-mm-dd。

常用的数值处理函数:

函数说明
Abs()返回一个数的绝对值
Cos()返回一个角度的余弦
Exp()返回一个数的指数值
Mod()返回除操作的余数
Pi()返回圆周率的值
Rand()返回一个随机数
Sin()返回一个角度的正弦
Sqrt()返回一个数的平方根
Tan()返回一个角度的正切

汇总数据:

聚集函数:运行在行组上,计算和返回单个值的函数。

函数

说明

AVG()返回某列的平均值
COUNT()返回某列的行数
MAX()返回某列的最大值
MIN()返回某列的最小值
SUM()返回某列值之和

聚集不同的值:如果只需要不同的值的行参与,那么指定DISTINCT参数。

SELECT AVG(DISTINCT 列)AS 别名--不同值的列的平均值,也就是没有重复
FROM 表;

分组数据:

创建分组::使用分组可以将数据分为多个逻辑组,从而对每个组进行聚集计算。分组是使用SELECT和GROUP BY 子句建立的。

SELECT 列 ,COUNT(*) AS 别名--再对每组进行聚集计算
FROM 表
GROUP BY 列;--先对表按照该列分组,列值相同的一组

注意:

  1. 分组嵌套;
  2. GROUP BY 子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。
  3. 除聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出。
  4. 如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。

还可以使用WITH ROLLUP关键字可以得到每个分组以及每个分组汇总级别的·值·。

SELECT 列 ,COUNT(*) AS 别名
FROM 表
GROUP BY 列 WITH ROLLUP;

过滤分组:使用HAVING。与WHERE不同的是,WHERE过滤行,HAVING过滤分组。并且WHERE在分组之前过滤,HAVING在分组之后过滤。

使用子查询:

子查询:SELECT语句是SQL的查询,上述都是简单的查询,即从单个数据库表中检索数据的单条语句。SQL还支持创建子查询,即嵌套在其他查询中的查询。(由内向外)

#三者结一,子查询
​SELECT cust_name,cust_contact
FROM Customers
WHERE cust_id IN(SELECT cust_id
                 FROM Orders
                 WHERE order_num IN(SELECT order_num
                                    FROM OrderItems
                                    WHERE prod_id='RGAN01'));
 
​

作为计算字段使用子查询:

SELECT cust_name, cust_state,
       (SELECT COUNT(*)
        FROM Orders
        WHERE Orders.cust.id=Customers.cust.id)AS orders
FROM Customers
ORDER BY cust_name;

联结表:

SQL最强大的功能之一就是可以在数据查询的执行中联结表。联结表是利用SQL的SELECT能够执行的最重要的操作。

创建联结:指定要联结的表以及关联它们的方式即可。

SELECT 表1的列,表2的列
FROM 表1,表2
WHERE 表1.列=表2.列;--这两个表通过WHERE子句进行联结,指示表1的某个列和表2的某个列匹配起来

注意:WHERE子句它过滤只包含给定条件的行,且要注意笛卡儿积。

内部联结:不同的语法。

SELECT 表1的列,表2的列
FROM 表1 INNER JOIN 表2 ON 表1.列=表2.列;
--INNER JOIN用于指定两个表的关系,联结条件用ON子句。传递给ON的实际条件与传递给WHERE的相同。

​连接多个表:SQL不限制于一条SELECT语句中可以联结的表的数目。创建联结的基本规则也相同,首先列出表,再定义表的关系。

SELECT 表1的列1,表2的列1,表3的列1
FROM 表1,表2,表3
WHERE 表1.列=表2.列 AND 表2.列=表3.列;

创建高级联结:

SQL还允许给表名起别名,表的别名只在查询执行中使用,与列名不同的是,表的别名不返回到客户端中。

自联结:一条SELECT语句中多次使用相同的表。

SELECT c1.列,c1.列
FROM 表 AS c1,表 AS c2--一个表多个别名,实际上还是同一个表
WHERE c1.公司名=c2.公司名 AND c2.名字='Jim';

自然联结:无论何时对表进行联结,应该至少有一列不止出现在一个表中(被联结的列)。标准的联结返回所有数据,相同的列甚至多次出现。自然联结排除多次出现,使每一列只返回一次。

外联结:许多联结将一个表中的行于另一个表中的行进行相互关联,但是有时候需要包含那些没有关联行的那些行。

SELECT 表1.列,表2.列
FROM 表1
LEFT OUTER JOIN 表2 ON 表1.列1=表2.列1;

与内联结的INNER JOIN不同的是,外联结使用OUTER JOIN前面再加一个关键字(LEFT.RIGHT,FULL).LEFT表示加入OUTER JOIN左边的表中未关联的行;RIGHT表示加入OUTER JOIN右边的表中未关联的行;FULL加入OUTER JOIN左右两边的表中未关联的行。

组合查询:

多数SQL查询只包含从一个或者多个表中返回数据的单条SELECT语句;或者是从多个SELECT语句中查询,并且将结果作为一个查询结果集返回。这些组合查询通常叫做并或者叫做复合查询。主要有两种情况需要组合查询:1.在一个查询中从不同的表返回结构数据。2.对一个表执行多个查询,按一个查询返回数据。
 

创建组合查询:

使用UNION操作符来组合数条SQL查询,可以将多条SELECT语句的结果组合成为一个结果集

SELECT 列
FROM 表
WHERE 列 IN(值)
UNION
SELECT 列
FROM 表
WHERE 列=1;

注意:UNION使用规则详见SQL(下)这篇文章,使用之前最好看一下。

*全文本搜索:

并非所有的数据库引擎都支持全文本搜索,比如最常使用的两个引擎MyISAM和InnoDB,前者支持全文本搜索,而后者却不支持。

虽然通配符和正则表达式这些搜索机制非常有用,但是有几个限制:

  1. 性能:两者在尝试匹配所有行时,随着行数增加,可能会非常耗时。
  2. 明确控制:两者很难明确的控制匹配什么或者不匹配什么。
  3. 智能化的结果:两者不提供智能化的选择结果的方法。

所有的这些限制都可以使用全文本搜索来解决。在使用全文本搜索时,MySQL不需要分别查看每个行,不需要查看每个词。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。这样MySQL就可以快速有效的决定哪些词匹配,哪些不匹配,匹配的频率等等。

使用全文本搜索:

为了进行全文本搜索,必须索引被搜索的列,而且还要随着数据改变不断的重新索引。在对表列进行适当设计后,MySQL会自动的进行所有的索引和重新索引。在索引之后,SELECT就可以与Match()和Against()一起使用以实际的执行搜索。

启用全文本搜索的支持

一般在创建表时启用全文本搜索。使用FULLTEXT子句,它给出被索引列的一个逗号分隔的列表。例如:

CREATE TABLE 表--创建表的语句,先忽略
(
  --先忽略列的定义
  FULLTEXT(列)--给出索引的列,多个列用逗号分隔
)ENGINE=MyISAM;--忽略
--在已存在的表加索引
ALTER TABLE 表名 add 索引类型 索引名称(列);
--或者
CREATE 索引类型 索引名称 ON 表名(列);

在定义之后,MySQL将自动维护该索引。在表列发生变化时,索引随之自动更新。可以在创建表时指定FULLTEXT,或者在稍后指定(这种情况所有已有数据必须立即索引)注意:不要在导入数据的时候使用FULLTEXT,如果正在导入数据到新表,那么先导入再定义FULLTEXT。

进行全文本搜索

在索引之后,使用Match()和Against()函数执行全文本搜索,其中前者指定被搜索的列,后面指定使用的搜索表达式。

SELECT 列
FROM 表
WHERE Match(列) Against('搜索表达式');

注意:传递给Match()的值必须和FULLTEXT定义之一相同,除非使用BINARY方式,不然全文本搜索不区分大小写。

​SELECT 列 
       Match(列) Against('搜索表达式') AS rank
FROM 表;

全文本搜索还可以对结果排序,具有较高等级匹配度高的行先返回。

查询扩展:

查询扩展用来设法放宽所返回的全文本搜索结果的范围。在使用查询扩展时,MySQL对数据和索引进行两遍扫描来完成搜索:1.使用全文本搜索找出匹配行;2.MySQL自动检查匹配行再选择出有用的词;3.再次进行全文本搜索,不仅使用原来的条件还使用选择的词。使用查询扩展极大增加了返回的行数,但也增加了你实际上不需要的行数目。

​SELECT 列
FROM 表
WHERE Match(列) Against('搜索表达式' WITH QUERY EXPANSION);--WITH QUERY EXPANSION

布尔文本搜索:

MySQL还支持全文本搜索的另外一种形式,叫做布尔方式。以布尔方式可以提供以下细节:1.要匹配的词;2.要排斥的词;3.排列提示(指示哪些词等级高);4.表达式分组;5.另外一些内容。即使没有FULLTEXT索引也可以使用布尔方式。关键字为:IN BOOLEAN MODE。

全文本布尔操作符

布尔操作符说明
+包含,词必须存在
-排除,词必须不存在
>包含,且增加等级值
<包含,且减少等级值
()把词组成子表达式
~取消一个词的排序值
*词尾的通配符
""定义一个短语
​SELECT 列
FROM 表
WHERE Match(列) Against('+搜索表达式' IN BOOLEAN MODE);--返回包含该表达式的行
​
SELECT 列
FROM 表
WHERE Match(列) Against('>搜索表达式' IN BOOLEAN MODE);--包含且增加等级值

全文本使用说明

  • 在索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词(如果需要,这个数目可以更改)。
  • MySQL带有一个内建的非用词(stopword)列表,这些词在索引全文本数据时总是被忽略。如果需要,可以覆盖这个列表。
  • 许多词出现的频率很高,搜索它们没有用处(返回太多的结果)。因此,MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不用于IN BOOLEAN MODE。
  • 如果表中的行数少于3行,则全文本搜索不返回结果(因为每个词或者不出现,或者至少出现在50%的行中)。
  • 忽略词中的单引号。例如,don't索引为dont。
  • 具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文本搜索结果。
  • 如前所述,仅在MyISAM数据库引擎中支持全文本搜索。
  • 没有邻近操作符。

插入数据:

插入数据使用INSERT

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

当然还有插入部分行,插入多个行(每个INSERT语句用;分隔),插入检索的数据。详见文章SQL(下)。

更新或删除数据:

更新数据使用UPDATE

UPDATE 表
SET 列=值
WHERE 过滤条件;

注意:IGNORE关键字,因为UPDATE更新多行时出现错误,则操作取消,前面更新的也被恢复,而IGNORE关键字使发生错误后,还继续更新。(UPDATE IGNORE 表)

删除数据使用DELETE

DELETE FROM 表
WHERE 过滤条件;

当然,更详细的内容参考文章SQL(下)。

创建和操纵表:

创建表有两种方式:交互式工具和MySQL语句。

创建表:使用CREATE TABLE创建表。

​CREATE TABLE 表名
(
列1名 数据类型 是否允许NULL,
列2名 数据类型 是否允许NULL,
列3名 数据类型 是否允许NULL DEFAULT 1,
……
PRIMARY KEY(列1)--不同的是指定主键,或者PRIMARY KEY(列1,列2)多个列为主键
)ENGINE=InnoDB;--不同的是指定引擎

AUTO_INCREMENT:

  1. 在指定列的属性的时候,可以在是否允许NULL后面加上AUTO_INCREMENT,它告诉MySQL,每次执行INSERT插入操纵时,MySQL自动对该列进行自动增量,给该列赋予下一个可用的值。从而可用为主键值。
  2. 每个表只允许一个AUTO_INCREMENT列,而且它必须被索引。当然你可以在插入操作时给指定为AUTO_INCREMENT的列指定一个值,只要它是唯一的,就可以替代自动生成的值,而后续的增量将开始使用该手工插入的值。
  3. 确定AUTO_INCREMENT值使用last_insert_id()返回最后一个AUTO_INCREMENT值,然后可以将它用于后续的语句。

引擎类型:

MySQL有一个具体管理和处理数据的内部引擎,在使用创建表时,它创建表,在使用其他的数据库处理时,也是它在内部处理请求。MySQL有多种引擎类型,隐藏在MySQL服务器中,各自有不同的特性和功能。如果忽略ENGINE语句时,就会使用默认引擎。引擎类型可以混用,比如一个表使用一种,另一个一种这样。但是外键不能跨引擎,即使用一个引擎的表不能引用具有不同引擎的表的外键。需要了解的引擎类型:1.InnoDB是一个可靠的事务处理引擎,不支持全文本搜索;2.MEMORY在功能上等同于MyISAM,但是数据存储在内存,速度快;3.MyISAM是一个性能极高的引擎,支持全文本搜索,不支持事务处理。

指定默认值:DEFAULT关键字。

更新表:ALTER TABLE语句。该语句除了添加和删除列,还经常用于定义外键。

删除表:DROP TABLE语句。

重命名表:使用RENAME TABLE语句。

RENAME TABLE 老表 TO 新表;

RENAME TABLE 老表 TO 新表,
             老表 TO 新表;
--多个表重命名

使用视图:

视图的常用:

  1. 创建视图使用CREATE VIEW创建;
  2. 查看创建视图使用SHOW CREATE VIEW 视图名字;
  3. 删除视图使用DROP VIEW 名字;
  4. 更新视图使用先DROP再CREATE,或者直接使用CREATE OR REPLACE VIEW,它要更新的视图不存在的话,会创建一个视图,存在的话就替换。

使用视图可以简化联结,重新格式化检索的数据,过滤不需要的数据,还可以配合计算字段。详见SQL(下)这篇文章。

更新视图再述:

迄今为止所有视图都是和SELECT一起使用的,但是视图是可更新的,即可以对它使用INSERT,UPDATE,DELETE。更新一个视图将更新其基表,并非所有的视图都可更新的,如果MySQL不能正确的确定被更新的基数据,则不允许更新。实际上包含:分组,联结,子查询,并,聚集函数,DISTINCT,导出列时不能进行视图更新。

使用存储过程:

存储过程就是为以后使用而保存的一条或者多条SQL语句,可以将其视为批文件,虽然它们的作用不限于批处理。关于一些概念性的内容参考SQL(下)这篇文章。

执行存储过程:

MySQL称存储过程的执行为调用,因此语句为CALL。CALL接收存储过程的名字和传递给它的参数。存储过程可以显示结果或者不显示。

​CALL 名字(@变量1,@变量2……);

创建存储过程:

CREATE PROCEDURE 存储过程名()
BEGIN 
     SELECT 列
     FROM 表;
END;

定义存储过程使用CREATE PROCEDURE语句,如果存储过程接收参数的话,那么它们会在括号内列举出来,即使没参数也需要括号。BEGIN和END用来限定存储过程体,而存储过程可以是一条或者多条SQL语句。

删除存储过程

存储过程创建之后,被保存在服务器以供使用,直到删除。删除命令从服务器删除存储过程,使用DROP PROCEDURE 存储过程名字;语句,这句在指定存储过程不存在时使用会报错;而DROP PROCEDURE  IF EXISTS 存储过程名字;这句在不存在时删除也不会报错。

使用参数的存储过程

上面的存储过程只是显示了SELECT检索的结果。一般情况下,存储过程不显示结果,而是把结果返回到你指定的变量中。

​CREATE PROCEDURE 存储过程名(OUT p1 数据类型)--多个用逗号分隔
BEGIN 
     SELECT 列
     INTO p1
     FROM 表;
END;

在存储过程体内使用SELECT检索,然后保存到变量p1中,它是通过INTO关键字来把检索的列导入变量中的。当然定义变量方式还有set @变量=值或者DECLARE 变量 数据类型。而括号内的是参数列表,关键字OUT代表把参数从存储过程传出一个值返回给调用方。MySQL还支持IN(传递给存储过程),OUT,和INOUT(从存储过程传入和传出)。在调用时就CALL 存储过程名(@变量);

检查存储过程:

使用SHOW PROCEDURE STATUS显示存储过程的信息。

使用游标:

游标是一个存储在MySQL服务器的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或者游览其中的数据。MySQL的游标只能用于存储过程和函数。

创建游标:

游标使用DECLARE创建,加上CURSOR和相应的SELECT语句,根据需要带上WHERE或者其他子句。

​CREATE PROCEDURE 存储过程名()
BEGIN 
DECLARE 游标 CURSOR
     SELECT 列
     FROM 表;
END;

打开和关闭游标:

  • 打开:OPEN 游标;
  • 关闭:CLOSE 游标;--释放所有的内部内存和资源。在不明确关闭时,MySQL会在存储过程结束时关闭。

使用游标数据:

使用FETCH语句,还可以配合INTO表示检索数据到该变量中。还可以知道检索的数据存储在哪里或者移动游标指针。例如:FETCH 游标 INTO  变量。还有配合REPEAT 检索到最后一行。

*使用触发器:

我们在想要某条语句在事件发生时自动执行,那么就可以使用触发器。触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句或者位于BEGIN和END语句之间的一组语句,除了DELETE,INSERT,UPDATE以外,其他的MySQL语句不支持触发器。

创建触发器:

在创建触发器时,需要给出4条信息:

  • 唯一的触发器名;
  • 触发器关联的表;
  • 触发器应该响应的活动;
  • 触发器在什么时候执行。

​CREATE TRIGGER 触发器名 AFTER INSERT ON 表名
FOR EACH ROW 执行的语句;
  1. 其中CREATE TRIGGER用于创建触发器,
  2. AFTER INSERT表示在插入成功后执行,与之相反的是BEFORE之前执行,
  3. FOR EACH ROW是指代码对每个插入行,触发器都执行,叫行级触发器。MySQL仅仅支持行级触发器。它的后面就是要执行的语句。多条语句可以放在BEGIN,END块内。UP
  4. 只有表才支持触发器,视图不支持。
  5. 触发器按每个表每个事件每次的定义,每个表每个事件每次只允许一个触发器。因此每个表最多支持6个触发器,即每条INSERT,UPDATE,DELETE之前和之后。单一的触发器不可以和多个事件多个表相关联。
  6. 如果BEFORE触发器失败,则MySQL不执行请求的操作;或者将不执行原本有的AFTER语句。

删除触发器:使用语句DROP TRIGGER 触发器名字;触发器不能更新或者覆盖,为了修改一个触发器,必须先删除再重新创建。

使用触发器:

INSERT触发器:

  • 在INSERT触发器内,有一个叫做NEW的虚拟表,用来访问插入的行。
  • 在BEFORE INSERT触发器中,NEW中的值也可以被更新,即允许更改被插入的值。
  • 对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,之后包含新的自动生成的值。

DELETE触发器:

  • 在DELETE触发器内,有一个叫做OLD的虚拟表,用来访问被删除的行。
  • OLD中的值全都是只读的,不能更新。

UPDATE触发器:

  • 在UPDATE触发器内,可以使用一个叫做OLD的虚拟表访问UPDATE语句之前的值,引用一个NEW的虚拟表访问新更新的值。
  • 在BEFORE UPDATE触发器中,NEW中的值也可能被更新,即允许更改将要用于UODATE语句的值。
  • OLD的值都是只读的,不能更新。

其他触发器介绍:

  • 与其他DBMS相比,MySQL支持的触发器比较初级。
  • 创建触发器可能需要权限,但是触发器执行是自动的。
  • 应该使用触发器来保证数据的一致性。
  • 触发器的一种使用是审计跟踪。把之前之后的状态记录到另一个表中。
  • MySQL的触发器不支持CALL语句,表示不能从触发器内调用存储过程,只能复制进来。

管理事务处理:

并非所有的数据库引擎都支持事务管理,比如最常使用的两个引擎MyISAM和InnoDB,前者不支持,而后者却支持。使用事务处理,通过确保成批的SQL操作要么完全执行,要么完全不执行,以此来维护数据库的完整性

控制事务处理:

  1. 管理事务的关键在于将SQL语句分解为逻辑块,并且明确规定数据何时应该回退,何时不应该回退。
  2. START TRANSACTION用于开启一个事务,
  3. ROLLBACK用来回退撤销MySQL语句,它只能在一个事务处理块中使用,也就是执行一条START TRANSACTION命令之后,不能回退SELECT,DROP ,CREATE语句。
  4. COMMIT用来明确提交,
  5. SAVEPOINT用来使用保留点。也是为了方便支持部分回退,在块中放置占位符。保留点在事务处理块完成后自动释放,也可以使用RELEASE SAVEPOINT手动释放。
  6. 当使用COMMIT或者ROLLBACK后,事务会自动关闭,将来的更改会隐含提交。

ROLLBACK:

SELECT * 列 FROM 表;
START TRANSACTION;
DELETE FROM 表;
ROLLBACK;
SELECT * 列 FROM 表;--ROLLBACK回退START TRANSACTION之后的所有语句,所以最后还是不为空

COMMIT: 

START TRANSACTION
DELETE FROM 表1 WHERE 列=值;
DELETE FROM 表2 WHERE 列=值;
COMMIT;--保证不被部分删除,第一条成功,第二条失败,也不会提交

SAVEPOINT: 

SAVEPOINT 保留点;--唯一名字
ROLLBACK TO 保留点;--回退到该保留点

*全球化和本地化:

数据库表被用来存储和检索数据,不同的语言和字符集需要以不同的方式存储和检索。在数据库正常活动中,不需要操心太多这样的东西。

术语:

  • 字符集:字母和符号的集合。
  • 编码:为某个字符集成员的内部表示。
  • 校对:规定字符如何比较的指令。

使用字符集和校对顺序:

MySQL支持众多的字符集:

  1. 查看所支持的字符集完整列表使用:SHOW CHARACTER SET;
  2. 查看所支持的校对完整列表使用:SHOW COLLATION;
  3. 通常在系统管理在安装时会定义一个默认的字符集和校对,也可以在创建数据库时,指定默认。为了确定所用的字符集和校对,可以使用:SHOW VARIABLES LIKE 'character%';或者SHOW VARIABLES LIKE 'collation%';
  4. 不同的表或者列也可以指定字符集和校对,所有CHARACTER SET 和COLLATE。在两者指定时,使用它们;指定一个,则另一个使用默认;都不指定,都使用默认。

​CREATE TABLE 表名
(
列1名 数据类型 是否允许NULL,
列2名 数据类型 是否允许NULL CHARACTER SET 字符集 COLLATE 校对,
列3名 数据类型 是否允许NULL DEFAULT 1,
……
PRIMARY KEY(列1)--不同的是指定主键,或者PRIMARY KEY(列1,列2)多个列为主键
)DEFAULT CHARACTER SET 字符集 
 COLLATE 校对;

*安全管理:

MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,不能多也不能少。root账号对整个MySQL服务器有完全的控制。而在现实生活中,绝不能使用root,应该创建一系列的账号,有的用户使用,有的开发使用。不仅仅是防止用户恶意使用,也是防止无意错误。

管理用户:

MySQL用户账号和信息存储在名为mysql的MySQL数据库中。一般不需要直接访问它,但有时候需要直接访问它,比如:需要获取所有用户账号列表的时候。使用语句:USE mysql;SELECT user FROM user;即可获取。

创建用户账号:

使用CREATE USER语句:

CREATE USER 名字 ;
--也可以加上口令
CREATE USER 名字 IDENTIFIED BY 口令;

使用GRANT或者INSERT也可以创建用户。

重命名用户账号:使用RENAME USER语句

RENAME USER 旧 TO 新;

删除用户账号:使用DROP USER语句

DROP USER 账号;

设置访问权限:

在创建用户账号后,必须接着分配访问权限。新创建的账号没有访问权限,只能登录MySQL,但是不能看数据,执行操作。

查看用户账户的权限:使用SHOW GRANTS FOR语句

SHOW GRANTS FOR 用户;

设置权限:使用GRANT,还要提供授予什么权限,被授予权限的数据库或者表,用户名。

GRANT SELECT ON 数据库.* TO 用户;
--授予SELECT访问权限,对该数据库所有表具有只读权限

取消权限:使用REVOKE

​REVOKE SELECT ON 数据库.* TO 用户;

GRANT和REVOKE可以在这几个层次控制访问权限:

  • 整个服务器,使用GRANT ALL和REVOKE ALL。
  • 整个数据库,使用ON 数据库.*。
  • 特定表,使用ON 数据库.表。
  • 特定的列。
  • 特定的存储过程。

更改口令:使用SET PASSWORD语句

SET PASSWORD FOR 用户=PassWord(口令);

*数据库维护:

  • ANALYZE TABLE用来检查表键是否正确。
  • CHECK TABLE用来针对许多问题对表进行检查。CHANGED检查自最后一次检查以来改动过的表;EXTENDED执行最彻底的检查,FASH只检查那些未正常关闭的表,MEDIUM检查所有被删除的链接并且进行键检验;QUICK进行快速扫描。
  • 如果经常从表中删除大量数据,应该使用OPTIMIZE TABLE来收回所用的空间。

诊断启动问题:

服务器启动问题通常在对MySQL配置或者服务器本身进行更改时出现。但是由于多数MySQL服务器是自动启动,这些问题可能看不见。在排除系统启动问题时,首先应该尽量手动启动服务器。MySQL服务器通过在命令行执行mysqld启动。下面是几个重要的mysqld命令行选项:--help(显示帮助);--safe-mode(装载减去某些最佳配置的服务器);--verbose(显示全文本信息);--version(显示版本信息后退出)。

查看日志文件:

  • 错误日志:hostname.err,位于data目录
  • 查询日志:hostname.log,位于data目录
  • 二进制日志:hostname.bin,位于data目录
  • 缓慢查询日志:hostname-slow.log,位于data目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mo@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值