《Mysql必知必会》学习笔记
第一章 了解SQL
- 数据库(database)是保存有组织的数据的容器(通常是一个文件或一组文件)。数据库软件应称为DBMS(数据库管理系统)。数据库是通过DBMS创建和操纵的容器。我们并不直接访问数据库,我们使用的是DBMS,它替我们访问数据库。
- 主键(primary key):一列(或一组列),其值能够唯一区分表中每个行。
唯一标识表中每行的这个列(或这组列)成为主键。主键用来表示一个特定的行。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。
在使用多列作为主键时,上述条件必须应用到构成主键的所有列,所有列值得组合必须是唯一的(但单个列的值可以不唯一)。
- SQL: 结构化查询语言structured query language的缩写,专门与数据库通信的语言。
第二章 MySQL简介
本章介绍了什么是MySQL,并引入了几个客户机使用程序。
第三章 使用MySQL
本章介绍了如何连接和登录MySQL,如何用USE选择数据库,如何用SHOW查看MySQL数据库、表和内部信息。
- 为了连接到MySQL,需要以下信息
- 主机名(计算机名)--如果连接到本地MySQL服务器,为localhost;
- 端口(如果使用默认端口3306之外的端口)
- 一个合法的用户名
- 用户口令(如果需要)
- USE语句--选择数据库
- 必须使用USE打开数据库,才能读取其中数据。
- 双击左侧schemata列表中任一个数据库以使用它,看不到USE命令的实际执行,但会看到被选择的数据库(黑体加亮)。
- SHOW语句—了解数据库和表
- 数据库、表、列、用户、权限等信息被存储在数据库和表中,但内部的表一般不直接访问。可用MySQL的SHOW命令来提取和显示。
- SHOW DATABASES;
- 返回可用数据表的一个列表;
- SHOW TABLES;
- 返回所选择的数据库中表的列表;
- SHOW COLUMNS FROM TABLE;
- SHOW COLUMNS要求给出一个表名,对表中每个字段返回一行,包括字段名、数据类型、是否允许NULL、键信息、默认值以及其他信息。
- DESCRIBE语句,是使用SHOW COLUMNS FROM的一种快捷方式。如表名为score,那么DESCRIBE SCORE语句和SHOW COLUMNS FROM SCORE语句执行结果是一样的。
- SHOW ERRORS 和 SHOW WARNINGS, 用来显示服务器错误或警告信息;
第四章 检索数据
本章介绍如何使用SELECT语句从表中检索一个或多个数据列。
SELECT语句,用途是从一个或多个表中检索信息。所以,必须至少给出两条信息-想选择什么信息,从什么表进行选择。
多数SQL开发人员认为将SQL语句,按照逻辑,分成多行,更容易阅读和调试。
- 检索单列,如:SELECT prod_name FROM products;
- 检索多列,如:SELECT prod_id,prod_name,prod_price FROM products;
- 注意多列名之间逗号分开
- 通配符(*)返回表中所有列,如:SELECT * FROM products;
- 使用DISTINCT关键字对检索结果去重
- SELECT DISTINCT vend_id FROM products; 只返回不同(唯一)的vend_id行,
- DISTINCT必须直接放在列名的前面
- 不能部分使用DISTINCT。DISTINCT关键字应用于所有列而不仅是前置它的列。
- 使用LIMIT子句指定返回表中的几行数据
- 检索单列,如:SELECT prod_name FROM products LIMIT 5; 输出结果不多于5行。
- 如何指定检索的开始行和行数?
- SELECT prod_name FROM products LIMIT 5,5;
- LIMIT 5,5指示MySQL返回从行5开始的5行,第一个数是开始位置,第二个数是检索的行数。
结合数据表,以id从1开始的数据表为例,输出几行数据如下:
- select id,Countrycode from City limit 0,1;
- select id,Countrycode from City limit 1;(同上)
- select id,Countrycode from City limit 1,1;
- select id,Countrycode from City limit 5,5;
第五章 排序检索数据
本章讲授如何使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据。
SELECT prod_name
FROM products
ORDER BY prod_name;
请注意,通常,ORDER BY子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列进行排序也是完全合法的。
- 按多个列排序
SELECT prod_id, prod_price ,prod_name FROM products
ORDER BY prod_price ,prod_name
重要的是理解在按多个列排序时,排序完全按所规定的顺序进行。换句话说,对于上述例子中的输出,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。
- 按单列降序排序
SELECT prod_id, prod_price ,prod_name
FROM products
ORDER BY prod_price DESC;
- 按多列降序排序
SELECT prod_id, prod_price ,prod_name
FROM products
ORDER BY prod_price DESC, prod_name;
- 特别要注意的是:
- DESC关键字只应用到直接位于其前面的列名。如上句,只对prod_price列以降序排列,而prod_name仍然按标准升序排列。
- 在多个列上降序排序:必须对每个列制定DESC关键字。
- 升序关键字是ASC(ASCENDING), 但实际上并没有多大用处,因为升序是默认的。
- 使用ORDER BY 和LIMIT组合,能够找到一个列中最高或最低的值。
请注意,在给出ORDER BY子句时,应该保证它位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY之后。使用子句的次序不对会产生错误信息。
第六章 过滤数据
本章将讲授如何使用SELECT语句的WHERE子句指定搜索条件。
- 用WHERE子句进行过滤数据,WHERE子句必须在表名(FROM子句)之后给出。
- 在同时使用ORDER BY 和 WHERE子句时,应该让ORDER BY位于WHERE之后,否则会报错。
- WHERE子句操作符
- 使用BETWEEN操作符,需要设定两个值,即范围的开始值和结束值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括制定的开始值和结束值,同【numberA ,numberB】,闭括号。.
- SELECT prod_name,prod_price From products WHERE prod_price BETWEEN 5 AND 10;
- IS NULL 子句,检查是否具有NULL值的数据。如,SELECT prod_name From products WHERE prod_price IS NULL;
第七章 数据过滤
本章讲授如何组合WHERE子句以建立功能更强的更高级的搜索条件。同时学习如何使用NOT 和IN操作符。
- AND用在WHERE子句中,用来只是检索满足所有给定条件的行。可以添加多个过滤条件,每添加一条就要使用一个AND,
- OR操作符,检索匹配任一条件的行。
- WHERE子句中运算顺序:( )优先于AND 优先于 OR。在多个过滤条件的情况下,不要过分依赖默认计算次序,多使用圆括号,消除歧义,便于代码阅读。
- IN
- 功能与OR相当,但各方面优于OR.
- 例子:
同代码:
输出结果一致。
- NOT
NOT操作符有且只有一个功能,否定它之后所跟的任何条件。
MySQL支持使用NOT对IN, BETWEEN,EXISTS子句取反。
第八章 用通配符进行过滤
本章介绍什么是通配符、如何使用通配符以及怎样使用LIKE操作符进行通配搜索,以便对数据进行复杂过滤。
百分号(%)通配符:%表示任何字符出现任意次数
%b: 以b结尾的字符
b%:以b开头的字符
%b%:中间含有b的字符
s%e:以s开头,e结尾的字符
通配符不能匹配NULL
下划线(_)通配符:下划线通配符的用途与%一样,但是下划线只匹配单个字符而不是多个字符。下划线_ 总是匹配一个字符,不能多也不能少
第十章 创建计算字段
- 串拼接:将值联结一起构成单个值。使用Concat()函数。
使用RTRIM()函数去除参数右侧空格:
- Trim函数:RTrim( ) 去除右侧空格; LTrim( )去除左边空格
Trim( ) 去掉左右两边的空格
- 关键字AS赋予别名,即一个字段或值得替换名
- 执行算术计算
第十一章 使用数据处理函数
本章介绍什么是函数,MySQL支持何种函数,以及如何使用这些函数。
- 常见的文本处理函数
- SOUNDEX:将任何文本串转换为描述其语音表示的字母数字模式的算法。其考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。
例子:如人名拼写输入错误,无法正确检索到。但可以通过发音检索。
- 常用的时间和日期处理函数
- 为了避免歧义,日期格式推荐为yyyy-mm-dd
- 如果要的是日期,请使用DATE()。
- 数值处理函数
第十二章 汇总数据
本章介绍什么是SQL的聚集函数以及如何利用它们汇总表的数据。
- 聚集函数(aggregate function)是指运行在行组上,计算和返回单个值的函数。
SQL聚集函数
- COUNT()函数两种方式
- 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
- 使用COUNT(COLUMN)对特定列中具有值得行进行计数,忽略NULL值。
- MAX()函数
- 对非数值数据使用MAX()。虽然MAX()一般用来找到最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。在用于文本数据时,如果数据按相应的列排序,则MAX()返回最后一行。
- MIN()函数
- 在用于文本数据时,如果数据按相应的列排序,则MIN()返回最前面的一行。
第十三章 分组数据
本章将介绍如何分组数据,以便能汇总表内容的子集。这涉及两个新SELECT语句子句,分别是GROUP BY子句和HAVING子句。
- GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
- GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
- WITH ROLLUP关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值。在分组统计数据下面再进行统计汇总。
- HAVING子句。WHERE子句过滤行,而HAVING过滤分组。
- 这里有另外一种理解,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
- SELECT子句及其顺序
第十四章 使用子查询
本章介绍什么是子查询以及如何使用它们。
- 子查询:嵌套在其他查询中的查询。
- 在WHERE子句中使用子查询能够编写出功能很强并且很灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。
- 子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等。
- 小TIP:逐渐增加子查询来建立查询。子查询的调试很有技巧性,最可靠的方法是逐渐进行。先建立和测试内层的查询,然后,用硬编码数据建立和测试外层查询。这样做仅给构造查询增加了一点点时间,但节省了查找不正常/错误问题的大量时间,极大地提高了查询一开始就正常工作的可能性。
第十五章 联结表
本章将介绍什么是联结,为什么要使用联结,如何编写使用联结的SELECT语句。
- 外键(foreign key)外键为某个表中的一列,它包含另一表的主键值,定义了两个表之间的关系。
- 可伸缩性(scale) 能够适应不断增加的工作量而不失败。
- 完全限定列名 在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分割的表名和列名)。如果引用一个没有用表名限制的具有二义性的列名,MySQL将返回错误。
- 笛卡尔积(cartesian product)
WHERE子句作为过滤条件,可以限定匹配和联结的行。
如果没有WHERE子句,第一个表中的行将会与第二个表中的每个行进行配对,而不管这些数据在逻辑上是否可以配对。
笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。