MySQL必知必会系列一



最近由于工作原因,自己需要单独开发一些统计数据接口,处理大量订单信息,关联表,分组,多表联查,筛选相关信息,以便前端生成图表相关信息,目前主要采用echarts、F2等组件库做pc和移动端,就此机会,抽空梳理了下MySQL相关内容,以供学习参考

相关资料:https://book.douban.com/subject/3354490/

一、了解 SQl

数据库基础

数据库是一个以某种有组织的方式存储的数据集合。理解数据库的一种最简单的办法是将其想象为一个文件柜。此文件柜是一个存放数据的物理位置,不管数据是什么以及如何组织的,
数据库(database) 保存有组织的数据的容器(通常是一个文件或一组文件)。

表 table

某种特定类型数据的结构化清单。

数据库中的每个表都有一个名字,用来标识自己。此名字是唯一的

表具有一些特性,这些特性定义了数据在表中如何存储,如可以存
储什么样的数据,数据如何分解,各部分信息如何命名,等等

模式 schema

关于数据库和表的布局及特性的信息。

描述表的这组信息就是所谓的模式,模式可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)。

列和数据类型

表由列组成,列中存储着表中某部分的信息,列(column)是表中的一个字段。所有表都是由一个或多个列组成的。

数据类型(datatype) 所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据

数据类型限制可存储在列中的数据种类,数据类型还帮助正确地排序数据,并在优化磁盘使用方面起重要的作用。因此,在创建表时必须对数据类型给予特别的关注。

表中的数据是按行存储的,所保存的每个记录存储在自己的行内。表中的行数为记录的总数,一行就是一条记录(record)

主键

表中每一行都应该有可以唯一标识(primary key)自己的一列(或一组列)

表中的任何列都可以作为主键,只要它满足以下条件:

1.任意两行都不具有相同的主键值 2.每个行都必须具有一个主键值(主键列不允许 NULL 值)

SQL

SQL 是结构化查询语言(Structured QueryLanguage)的缩写,SQL 是一种专门用来与数据库通信的语言

优点:

  1. 学习此语言使你几乎能与所有数据库打交道
  2. SQL 简单易学。它的语句全都是由描述性很强的英语单词组成
  3. 灵活
    使用其语言元素,可以进行非常复杂和高级的数据库操作。

手动模拟一个数据库样例

 管理供应商 : vendors
 管理产品目录 : products
 管理顾客列表 : customers
 录入顾客订单 : orders

要完成这几个任务需要作为关系数据库设计成分的紧密联系的 6 个表。以下几节描述各个表。

二、 MySQL 简介

  1. 简单命令行实用程序
 mysql -u username
    //为了给出用户名、主机名、端口和口令,
    // 完整的命令行选项和参数列表可用 mysql --help 获得

 mysql -u username -p -h myserver -P 9999

  1. MySQL Administrator,是一个图形交互客户机,用来简化 MySQL 服务器的管理

  2. MySQL Query Browser为一个图形交互客户机,用来编写和执行 MySQL 命令。

三、 使用数据库

连接数据流

mysql -u root -p -h 127.0.0.1 -P 3306;

查看数据库和表

show databases;

选择数据库

use databasesName;

查看表

show tables;

查看表列

show columns from customers;

其他语句

SHOW StATUS 用于显示广泛的服务器状态信息
SHOW CREATE DATABASE和SHOW CREATE TABLE ,分别用来显示创建特定数据库或表的MySQL语句;
SHOW GRANTS ,用来显示授予用户(所有用户或特定用户)的安全权限;
SHOW ERRORS 和 SHOW WARNINGS ,用来显示服务器错误或警告消息。

四、检索数据

  1. SQL 语句不区分大小写,但有些标识符(如数据库名、表名、列名)可能不同
  2. 在处理 SQL 语句时,其中所有空格都被忽略
  3. 多条 SQL 语句必须以分号(;)分隔
  4. 在选择多个列时,一定要在列名之间加上逗号

检索单个列

select prod_name from products

检索多个列

select prod_name,vend_id from products

检索所有列

select * from products

检索不同的行

select distinct vend_id from customers

不能部分使用 DISTINCT,如果给出 SELECT DISTINCT vend_id,prod_price ,除非指定的两个列都不同,否则所有行都将被检索出来。

限制结果

此语句使用 SELECT 语句检索单个列。 LIMIT 5 指示 MySQL 返回不多于 5 行

select prod_name from products limit 5
select prod_name from products limit 2,5

使用完全限定的表名

select products.prod_name from products

//限定的表名
select products.prod_name form databaseName.products

五、排序数据

如果数据后来进行过更新或删除,则此顺序将会受到 MySQL 重用回收存储空间的影响

子句(clause)

SQL 语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。子句的例子有 SELECT 语句的 FROM 子句

为了明确地排序用 SELECT 语句检索出的数据,可使用 ORDER BY 子句。ORDER BY 子句取一个或多个列的名字,据此对输出进行排序

//根据产品价格排序
select prod_name,vend_id,prod_price from products ORDER BY prod_price;

通常, ORDER BY 子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的

多个列排序

select prod_name,vend_id,prod_price from products ORDER BY prod_price,prod_id;

指定排序方向

这只是默认的排序顺序 A-Z,还可以使用 ORDER BY 子句以降序(从 Z 到 A )顺序排序。为了进行降序排序,必须指定 DESC 关键字

//按价格以降序排序产品(最贵的排在最前面):
select prod_name,prod_price from products ORDER BY prod_price DESC;

//以降序排序产品(最贵的在最前面),然后再对产品名排序
select prod_name,prod_price from products ORDER BY prod_price DESC,prod_name;

与 DESC 相反的关键字是 ASC ( ASCENDING ),在升序排序时可以指定它。但实际上, ASC 没有多大用处,因为升序是默认的(如果既不指定 ASC 也不指定 DESC ,则假定为 ASC )。

六、 过滤数据

搜索条件也称为过滤条件(filter condition)。

SQL 过滤与应用过滤

数据也可以在应用层过滤。为此目的,SQL 的 SELECT 语句为客户机应用检索出超过实际所需的数据,然后客户机代码对返回数据进行循环,以提取出需要的行。
这种实现并不令人满意。因此,对数据库进行了优化,以便快速有效地对数据进行过滤

在同时使用 ORDER BY 和 WHERE 子句时,应该让 ORDER BY 位于 WHERE 之后

where 子句操作符

=
<>  不等于
!=
<
<=
>
=>
between 两个值之间

空值检查

在创建表时,表设计人员可以指定其中的列是否可以不包含值。在一个列不包含值时,称其为包含空值 NULL

NULL 无值(no value),它与字段包含 0 、空字符串或仅仅包含空格不同,SELECT 语句有一个特殊的 WHERE 子句,可用来检查具有 NULL 值的列。

select prod_name from products where prod_price IS NULL
select cust_id from customers where cust_email is null;

七、 数据过滤

组合 where 句子

操作符(operator) 用来联结或改变 WHERE 子句中的子句的关键字。也称为逻辑操作符(logical operator)。

AND

用来指示检索满足所有给定条件的行。

//供应商 1003 制造且价格小于等于10美元的所有产品的名称和价格
select * from products where vend_id=1003 and prod_price<=10;

OR

它指示 MySQL 检索匹配任一条件的行。

//检索由任一个指定供应商制造的所有产品的产品名和价格
select * from products where vend_id=1002 or vend_id=1003

优先级

WHERE 可包含任意数目的 AND 和 OR 操作符。允许两者结合以进行复杂和高级的过滤
在处理 OR 操作符前,优先处理 AND 操作符

//由于 AND 在计算次序中优先级更高,操作符被错误地组合了
select * from products where vend_id=1002 or vend_id=1003 and prod_price>=10;
//由供应商 1003 制造的任何价格为10美元(含)以上的产品,或者由供应商 1002 制造的任何产品
+---------+---------+----------------+------------+-------------------------------------------------+
| prod_id | vend_id | prod_name      | prod_price | prod_desc                                                                                                |
+---------+---------+----------------+------------+-------------------------------------------------+
| DTNTR   |    1003 | Detonator      |      13.00 | Detonator (plunger powered), fuses not included |
| FB      |    1003 | Bird seed      |      10.00 | Large bag (suitable for road runner
| FU1     |    1002 | Fuses          |       3.42 | 1 dozen, extra long                                                                                      |
| OL1     |    1002 | Oil can        |       8.99 | Oil can, red                                                                                             |
| SAFE    |    1003 | Safe           |      50.00 | Safe with combination lock                                                                               |
| TNT2    |    1003 | TNT (5 sticks) |      10.00 | TNT, red, pack of 10 sticks                                                                              |
+---------+---------+----------------+------------+------------------------------------                                                         -------------+


//此问题的解决方法是使用圆括号明确地分组相应的操作符,因为圆括号具有较 AND 或 OR 操作符高的计算次序


select * from products where (vend_id=1002 or vend_id=1003) and prod_price>=10;
//由供应商 1002 或 1003 制造的且价格都在10美元(含)以上的任何产品
+---------+---------+----------------+------------+-------------------------------------------------+
| prod_id | vend_id | prod_name      | prod_price | prod_desc                                       |
+---------+---------+----------------+------------+-------------------------------------------------+
| DTNTR   |    1003 | Detonator      |      13.00 | Detonator (plunger powered), fuses not included |
| FB      |    1003 | Bird seed      |      10.00 | Large bag (suitable for road runners)           |
| SAFE    |    1003 | Safe           |      50.00 | Safe with combination lock                      |
| TNT2    |    1003 | TNT (5 sticks) |      10.00 | TNT, red, pack of 10 sticks                     |
+---------+---------+----------------+------------+-------------------------------------------------+

IN 操作符

IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配, IN 操作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号

//此 SELECT 语句检索供应商 1002 和 1003 制造的所有产品
select * from products where vend_id in (1002,1003) ORDER BY prod_price

IN 与 OR 能实现相同的功能,但是为什么还要使用 IN 呢?

1. 在使用长的合法选项清单时, IN操作符的语法更清楚且更直观
2. 在使用 IN时,计算的次序更容易管理(因为使用的操作符更少)。
3. IN 操作符一般比 OR 操作符清单执行更快
4. IN 的最大优点是可以包含其他 SELECT 语句,使得能够更动态地建
立 WHERE

NOT 操作符

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

//MySQL不是匹配 1002和 1003 的 vend_id ,而是匹配 1002 和 1003 之外供应商的vend_id

select * from products where vend_id  not in (1002,1003) ORDER BY prod_price

对于简单的 WHERE 子句,使用 NOT 确实没有什么优势。但在更复杂的子句中, NOT 是非常有用的。
例如,在与 IN 操作符联合使用时, NOT 使找出与条件列表不匹配的行非常简单

八、 通配符 过滤

利用通配符可创建比较特定数据的搜索模式

% 通配符

select * from products where prod_name like '米%'

下划线

下划线只匹配单个字符而不是多个字符

//总是匹配一个字符,不能多也不能少
select * from products where prod_name like '_num'  // 1 nums  而 .5 nums就不行

使用通配符的技巧

  1. 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
  2. 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
  3. 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数

九、 正则表达式搜索

更新中

十、创建计算字段

计算字段

计算字段并不实际存在于数据库表中。计算字段是运行时在 SELECT 语句内创建的

字段(field) 基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。

拼接字段

拼接(concatenate) 将值联结到一起构成单个值。

如要生成一个供应商报表,需要在供应商的名字中按照 name(location) 这样的格式列出供应商的位置。

Concat() 拼接串,即把多个串连接起来形成一个较长的串,需要一个或多个指定的串,各个串之间用逗号分隔。

  1. 存储在 vend_name 列中的名字;
  2. 包含一个空格和一个左圆括号的串;
  3. 存储在 vend_country 列中的国家;
  4. 包含一个右圆括号的串

select concat(vend_name,"(",vend_country,")")  from vendors ORDER BY vend_name

+----------------------------------------+
| concat(vend_name,"(",vend_country,")") |
+----------------------------------------+
| ACME(USA)                              |
| Anvils R Us(USA)                       |
| Furball Inc.(USA)                      |
| LT Supplies(USA)                       |
+----------------------------------------+
4 rows in set (0.00 sec)

使用别名

select concat(vend_name,"(",vend_country,")") as vend_title from vendors ORDER BY vend_name;

+----------------------------------------+
|             vend_title                 |
+----------------------------------------+
| ACME(USA)                              |
| Anvils R Us(USA)                       |
| Furball Inc.(USA)                      |
| LT Supplies(USA)                       |
+----------------------------------------+
4 rows in set (0.00 sec)

执行算术计算

select prod_id,quantity,item_price,quantity*item_price as total from orderitems;
/*
    +,-,*,/
*/

未完持续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,869评论 0 9
  • 表 存储在表中的数据是同一种类型的数据或清单。 数据库中的表有为一个名字来标识自己。 表具有一些特性,这些特性定义...
    蛐蛐囍阅读 1,268评论 0 7
  • 第三课: 排序检索数据 distinct关键字:distinct 列名1,列名2,列名3DISTINCT 关键字会...
    VictorBXv阅读 1,443评论 0 8
  • 数据库入门 数据库: 保存有组织的数据的容器(通常是一个文件或一组文件).数据库软件应该称为 DBMS(DataB...
    Mjericho阅读 470评论 0 0
  • 我仿佛了解你的悲伤 了解你抱起岁月的酒坛时 那大口狂饮的决绝 你本是最美的风景 可你看不见你喜爱的风景 所以那漫长...
    简村小吹阅读 237评论 24 32