《MySQL 必知必会》读书总结
这是
《MySQL 必知必会》
的读书总结。也是自己整理的常用操作的参考手册。
使用 MySQL
- 连接到 MySQL
shell>mysql -u root -p Enter password:****** |
- 显示数据库
mysql>SHOW DATABASES; |
- 选择数据库
mysql>USE mytest; |
- 显示数据库中的表
mysql>SHOW TABLES; |
- 显示表列
mysql>SHOW COLUMNS FROM tmall_user; |
mysql>DESCRIBE tmall_user; |
第二种方法与第一种方法效果相同 |
- SHOW 的其他用法
mysql>SHOW STATUS; |
显示服务器的状态信息 |
mysql>SHOW CREATE DATABASE mytest; |
显示创建数据库的语句 |
mysql>SHOW CREATE TABLE tmall_user; |
显示创建表的语句 |
mysql>SHOW GRANTS; |
显示授权用户的安全权限 |
mysql>SHOW ERRORS; |
显示服务器错误 |
mysql>SHOW WARNINGS; |
显示服务器警告信息 |
基本查询(SELECT 语句)
- 查询某列
mysql>SELECT username FROM tmall_user; |
- 查询多列
mysql>SELECT username, password, time FROM tmall_user; |
- 查询所有列
mysql>SELECT * FROM tmall_user; |
- 查询不同行
mysql>SELECT |
注:DISTINCT 关键字应用于所有列。 |
- 限制结果
mysql>行 |
mysql>行开始的5行 |
注:查询结果的第一行为行0,因此,LIMIT 1,1 将检索出第二行 |
新语法:LIMIT 4 OFFSET 3 从行3开始取4行,就像 LIMIT 3,4 一样 |
- 使用完全限定的列名、表名
mysql>SELECT tmall_user.username FROM mytest.tmall_user; |
排序数据(ORDER BY 子句)
- 排列数据
mysql>SELECT username FROM tmall_user ->ORDER |
对 username 结构列以字母顺序排列数据 |
- 按多个列排序
mysql>SELECT prod_id, prod_price, prod_name FROM products ->ORDER BY prod_peice, prod_name; |
查询三个列,先按照价格排序,然后再按名称排序 |
- 指定排序方向
mysql>SELECT prod_id, prod_price, prod_name FROM products ->ORDER BY prod_price DESC |
默认的排序是升序排序,DESC 关键字指定降序排序(价格由高到低) |
- 多个列排序并指定方向
mysql>SELECT prod_id, prod_price, prod_name FROM products ->ORDER BY prod_price DESC, prod_name; |
以降序排序产品(价格从高到低),然后再对产品名排序。 |
注:DESC 关键字之应用到直接位于其前面的列名,如果想在多个列上进行降序排序,必须对每个列指定 DESC 关键字。 |
- 使用 ORDER BY 和 LIMIT 的组合,找出一个列中最高或最低的值
mysql>SELECT prod_price FROM products ->ORDER BY prod_price DESC ->LIMIT 1; |
查询价格最贵的那个商品 |
查询条件(WHERE 子句)
- 查询满足条件的行
mysql>SELECT prod_name, prod_price FROM products ->WHERE prod_price = 2.50 |
返回 prod_price 值为 2.50 的行 |
- WHERE 子句操作符
= |
等于 |
<> |
不等于 |
!= |
不等于 |
< |
小于 |
<= |
小于等于 |
> |
大于 |
>= |
大于等于 |
BETWEEN |
在指定的两个值之间 |
- 一些操作符的例子
mysql>SELECT prod_name, prod_price FROM products ->WHERE prod_price < 10; |
列出价格小于 10 的所有产品 |
mysql>SELECT vend_id, prod_name FROM products ->制造的所有产品 |
mysql>SELECT prod_name, prod_price FROM products ->WHERE prod_price BETWEEN 5 AND 10 |
查询价格在 5 和 10 之间的所有产品 |
mysql>SELECT prod_name FROM products ->WHERE prod_price IS NULL; |
查询价格列值为 NULL 的行。(空值=值为NULL) |
- 组合 WHERE 子句(逻辑操作符)
AND |
与 |
OR |
或 |
- IN 操作符
mysql>SELECT prod_name FROM products ->WHERE vend_id IN (1002, 1003) ->和1003制造的所有产品 |
IN WHERE 子句中用来指定要匹配值得清单的关键字,功能与 OR 相当 |
- NOT 操作符
mysql>SELECT prod_name FROM products ->WHERE vend_id NOT (1002, 1003) ->和1003之外的所用供应商制造的产品 |
NOT WHERE 子句中用来否定后跟条件的关键字,MySQL中的 NOT 支持使用 |
- LIKE 操作符(通配符过滤)
% |
任何字符出现任意次数,不能匹配 NULL |
_ |
任何一个字符 |
mysql>SELECT prod_name FROM products ->WHERE prod_name LIKE 's%e'; |
|
查询以s开头以e结尾的产品 |
函数
- 文本处理函数
Left() |
返回串左边的字符 |
Length() |
返回串的长度 |
Locate() |
找出串的一个子串 |
Ltrim() |
去掉串左边的空格 |
Right() |
返回串右边的字符 |
Rtrim() |
去掉串右边的空格 |
Soundex() |
返回串SOUNDEX值(根据发音比较而不是字母比较) |
SubString() |
返回子串的字符 |
Upper() |
转换为大写 |
mysql>SELECT name FROM tmall_user ->WHERE 返回:雷军 |
- 时间和日期处理函数
AddDate() |
|
AddTime() |
|
CurDate() |
返回当前日期 |
CurTime() |
返回当前时间 |
Date() |
返回日期时间的日期部分 |
DateDiff() |
计算两个日期之差 |
Date_Add() |
高度灵活的日期运算函数 |
Date_Format |
返回一个格式化的日期或时间串 |
Day() |
返回日期的天数部分 |
DayOfWeek() |
返回日期对应的星期数 |
Hour() |
返回时间的小时部分 |
Minute() |
返回时间的分钟部分 |
Month() |
返回日期的月份部分 |
Now() |
返回当前日期和时间 |
Second() |
返回时间的秒数部分 |
Time() |
返回日期时间的时间部分 |
Year() |
返回日期的年份部分 |
mysql>SELECT username FROM tmall_user ->WHERE |
|
使用日期比较过滤查询结果 |
|
mysql>SELECT count(id) FROM tmall_user ->WHERE |
|
mysql>SELECT count(id) FROM tmall_user ->WHERE |
|
效果与上例相同 |
- 数值处理函数
Abs() |
|
Cos() |
|
Mod() |
|
Pi() |
|
Rand() |
|
Sin() |
|
Sqrt() |
|
Tan() |
汇总数据(聚集函数)
- 聚集函数
AVG() |
返回某列的平均值 |
COUNT() |
返回某列的行数 |
MAX() |
返回某列的最大值 |
MIN() |
返回某列的最小值 |
SUM() |
返回某列值之和 |
- AVG() 函数
mysql>SELECT |
返回所有products表中产品的平均价格 |
mysql>SELECT ->WHERE vend_id = 1003; |
返回特定供应商所提供产品的平均价格 |
AVG() 函数只应用于单个列,忽略列值为NULL的行 |
- COUNT() 函数
mysql>SELECT |
对所有行进行计数,包括列值为NULL的行 |
mysql>SELECT |
只对有昵称的行进行计数,忽略列值为NULL的行 |
- MAX()函数和MIN()函数
mysql>SELECT |
返回最贵的物品的价格 |
MAX()函数一般用于找出最大的数值或日期值,但也可以返回任意列中的最大值。在用于文本数据时,按照相应顺序排序,返回最后一行。 |
MAX()函数忽略列值为NULL的行 |
MIN()函数与MAX()函数功能相反。 |
- SUM()函数
mysql>SELECT ->WHERE order_num = 20005; |
查询所订购物品的总数(所有quantity之和) |
mysql>SELECT ->WHERE order_num = 20005; |
查询所订购物品的总金额。 |
- 聚集不同值(DISTINCT)
mysql>SELECT ->WHERE vend_id = 1003; |
返回特定供应商的产品的平均价格,平均值只考虑各个不同的价格。 |
- 组合聚集函数
mysql>SELECT ->个聚集计算,返回4个值 |
分组数据(GROUP BY 子句和 HAVING 子句)
- 创建分组
mysql>SELECT vend_id, COUNT(*) FROM products ->GROUP BY vend_id; |
按vend_id排序并分组数据,COUNT()会对每个 vend_id 分组计算 num_prods 一次而不是对整个表计算。 |
- 过滤分组
HAVING 非常类似于 WHERE。HAVING 支持所有 WHERE 操作符。他们之间的差别是WHERE 过滤行,而HAVING 过滤分组。 另一种理解:WHERE 在数据分组前进行过滤,HAVING 在数据分组后进行过滤。 |
mysql>SELECT cust_id, COUNT(*) FROM orders ->GROUP BY cust_id ->HAVING |
过滤两个以上的订单的分组 |
mysql>SELECT vend_id, COUNT(*) FROM products ->WHERE prod_price >=10 ->GROUP BY vend_id ->HAVING |
mysql>SELECT order_num, SUM(quantity*item_price) AS ordertotal ->FROM orderitems ->ORDER BY order_num ->HANVING SUM(quantity*item_price) >= 50 ->ORDER BY ordertoal; |
GROUP BY 子句按照订单号分组数据,以便SUM(*)返回总计订单价格。HAVING 子句过滤数据,使得返回总计订单价格>=50的订单。最后用ORDER BY排序输出。 |
- SELECT 子句顺序
SELECT |
要返回的列或表达式 |
FROM |
要查询的表 |
WHERE |
行过滤 |
GROUP BY |
分组 |
HAVING |
分组过滤 |
ORDER BY |
输出排序顺序 |
LIMIT |
行数 |
子查询
- 查询订购物品TNT2的所有客户
mysql>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 = 'TNT2')); |
虽然子查询一般与IN操作符结合使用,但也可以用于测试等于=、不等于<>。 |
- 作为计算字段使用子查询
mysql>SELECT cust_name, cust_state, (SELECT COUNT(*)FROM orders -> WHERE orders.cust_id = customers.cust_id) AS orders ->FROM customers ->ORDER BY cust_name; |
查询customers表中每个客户的订单总数。订单与相应客户ID存储在orders表中 |
联结表
- 创建联结
mysql>SELECT vend_name, prod_name, prod_price ->FROM vendors, products ->WHERE vendors.vend_id = products.vend_id ->的行数×表2的行数。应该保证所有联结都有WHERE子句。 |
- 内部联结(等值联结)
mysql>SELECT vend_name, prod_name, prod_price ->FROM vendors INNER JOIN products ->ON vendors.vend_id = products.vend_id; |
两个表之间的关系以 INNER JOIN 指定,ON 的条件与上例 WHERE 条件相同 |
- 联结多个表(内部联结)
mysql>SELECT prod_name, vend_name, prod_price, quantity ->FROM orderitems, products, vendors ->WHERE products.vend_id = vendors.vend_id -> AND orderitems.prod_id = products.prod_id -> AND order_num = 20005; |
mysql>SELECT cust_name, cust_contact ->FROM customers, orders, orderitems ->WHERE customers.cust_id = orders.cust_id -> AND orderitems.order_num = orders.order_num -> AND prod_id = 'TNT2'; |
使用联结查询订购物品TNT2的所有客户 |
- 使用表别名
mysql>SELECT cust_name, cust_contact ->FROM customers AS c, orders AS o, orderitems AS oi ->WHERE c.cust_id = o.cust_id -> AND oi.order_num = o.order_num -> AND prod_id = 'TNT2'; |
- 自联结
mysql>SELECT prod_id, prod_name FROM products ->WHERE vend_id = (SELECT vend_id FROM products -> WHERE prod_id = 'DTNTR'); |
mysql>SELECT p1.prod_id, p1.prod_name ->FROM products AS p1, products AS p2 ->WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR' |
选择某物品的供应商所生产的其他物品,第一种方法使用子查询,第二种方法使用自联结,推荐用自联结而不用子查询。 |
使用表别名的主要原因是能在单条SELECT语句中不止一次引用相同的表 |
- 自然联结
自然联结排除多次出现,使每个列只返回一次。这一般是通过对第一个表使用SELECT *,对所有其他的表使用明确的子集来完成的。 |
mysql>SELECT c*, o.order_num, o.order_date, oi.prod_id, oi_quantity, ->oi.item_price ->FROM customers AS c, orders AS o, orderitems AS oi ->WHERE c.cust_id = o.cust_id ->AND oi.order_num = o.order_num ->AND prod_id = 'FB'; |
- 外部联结
mysql>SELECT customers.cust_id, orders.order_num ->FROM customers INNER LEFT OUTER JOIN orders ->ON customers.cust_id = orders.cust_id; |
查询所有客户及其订单,包括没有订单的客户, LEFT 指从左边的表选择所有行 RIGHT 指从右边的表选择所有行 |
- 带聚集函数的联结
mysql>SELECT customers.cust_name, customers.cust_id, -> COUNT(orders.order_num) AS num_ord ->FROM customers INNER JOIN orders -> ON customers.cust_id = orders.cust_id ->GROUP BY customers.cust_id; |
检索所有客户及每个客户所下的订单数 |
mysql>SELECT customers.cust_name, customers.cust_id, -> COUNT(orders.order_num) AS num_ord ->FROM customers LEFT -> ON customers.cust_id = orders.cust_id ->GROUP BY customers.cust_id; |
检索所有客户及每个客户所下的订单数(包括没有下订单的客户) |
- 使用联结的要点
|
组合查询(UNION 操作符)
全文本搜索
插入数据
更新和删除数据
- 更新数据(UPDATE 语句)
不要省略WHERE子句,再使用UPDATE时一定要注意细心。因为稍不注意,就会更新表中所有行。 |
UPDATE customers SET cust_email = 'elmer@fudd.com' WHERE cust_id = 10005; |
更新多个列 |
UPDATE customers SET cust_email = 'The Fudds', cust_email = 'elmer@fudd.com' WHERE cust_id = 10005; |
规范
- 对 SQL 关键字使用大写,而对所有列和表名使用小写,这样做使代码更易于阅读和调试。
- 任何时候使用具有 AND 和 OR 操作符的 WHERE 子句,都应该使用圆括号明确地分组操作符。
- 不要过度使用通配符,通配符通常消耗更多的时间。
- 使用聚集函数来汇总数据,比你在自己的软件中计算要快得多,这些函数是高效设计的。
- 用逐渐子查询来建立查询
《MySQL 必知必会》读书总结的更多相关文章
- 高性能MySQL --- 读书笔记(1) - 2016/8/2
此书不但帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径.全书包括14章,内容覆盖MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优. ...
- 高性能MySQL --- 读书笔记(2) - 2016/8/2
第1章 MySQL架构 MySQL架构与其他数据库服务器大不相同,这使它能够适应广泛的应用.MySQL足够灵活,能适应高要求架构.例如Web应用,同时还适用于嵌入式应用.数据仓库.内容索引和分发软件. ...
- 高性能mysql读书笔记(一):Schema与数据类型优化
4.5 加快ALTER TABLE 操作的速度 原理: MySQL 的ALTER TABLE 操作的性能对大表来说是个大问题. MySQL 执行大部分修改表结构操作的方法是用新的结构创建一个空表,从旧 ...
- 《高性能MySQL》读书笔记--锁、事务、隔离级别 转
1.锁 为什么需要锁?因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对表中同一行记录进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进 ...
- 【高性能Mysql 】读书笔记(三)
第5章 创建高性能的索引 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 索引基础 索引的重要性:找一本800面的书的某一段内容,没有目录也没有页码(页码也可类比 ...
- 【高性能Mysql 】读书笔记(二)
第4章 Schema 与数据类型优化 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 选择优化的数据类型 选择合适数据类型的三个原则 更小的通常更好 - 速度更快 ...
- 《高性能MySQL》 读书总结
目录: 第一章.MySQL架构与历史 第二章.MySQL基准测试 第三章.服务器性能剖析 第四章.Schema与数据类型优化 第五章.创建高性能的索引 第六章.查询性能优化 第七章.MySQL高级特性 ...
- 【高性能Mysql 】读书笔记(一)
第1章 Mysql架构与历史 MYSQL最重要.最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理( Query Processing)及其他系统任务( Server Task)和数据的存储 ...
- 1121高性能MySQL之运行机制
本文来自于拜读<高性能MySQL(第三版)>时的读书笔记作者:安明哲转载时请注明部分内容来自<高性能MySQL(第三版)> MySQL的逻辑构架 MySQL服务器逻辑架构 最上 ...
- 高性能mysql——高性能索引策略
<高性能MySQL>读书笔记 一. 索引的优点 1. 索引可以让服务器快速定位到表的指定位置,大大减少了服务器需要扫描的数量: 2. 最常见的B-Tree索引按照顺序存储数据,可以用来做o ...
随机推荐
- 深入理解脚本化CSS系列第二篇——查询计算样式
× 目录 [1]getComputedStyle [2]注意事项 [3]currentStyle[4]IE 前面的话 元素的渲染结果是多个CSS样式博弈后的最终结果,这也是CSS中的C(cascade ...
- enote笔记法使用范例(1)——自己总结的一些编写代码的常识 (a)
章节. 编程习惯 why 函数(<<为了>>便于提升软件开发效率和维护效率) 开发角度: 1)隐藏实现细节,这也是API质量最重要的品质2)复用:通过使用函数来代码复用 ...
- 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法
1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...
- 再谈HashMap
HashMap是一个高效通用的数据结构,它在每一个Java程序中都随处可见.先来介绍些基础知识.你可能也知 道,HashMap使用key的hashCode()和equals()方法来将值划分到不同的桶 ...
- mui scroll和上拉加载/下拉刷新
mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/* */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...
- Ubantu【第一篇】:Ubantu中openssh连接
h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...
- iOS - 捕获应用程序崩溃日志
作为一名iOS移动应用开发者,为了确保你的应用程序正确无误,在将应用程序提交到应用商店之前,你必定会进行大量的测试工作:而且在你测试的过程中应用程序运行的很好,但是在应用商店上线之后,还是有用户抱怨应 ...
- AEAI WM V1.5.0 升级说明,开源工作管理系统
1.升级说明 本次AEAI WM升级内容主要是针对数通畅联推出AEAI ECP企业云联平台而升级的,其中对AEAI WM的各模块进行扩展,同时增加了移动门户版功能及为AEAI ECP提供数据服务接口. ...
- CAS Client集群环境的Session问题及解决方案
[原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 之前写过一篇文章,介绍单点登录的基本原理.这篇文章重点介绍开源单点登录系统CAS的登录和注销的实现方法.并结合实际工作中碰到的问题,探讨 ...
- [Erlang 0115] 2014值得期待的Erlang两本新书
在2014年的开头就有这样一个令人振奋的好消息,Erlang有一本新书即将出版 <The Erlang Runtime System>,其作者happi在2013年3月份公布了这本书的写作 ...