3.6.1. 列的最大值

“最大的物品号是什么?”

SELECT MAX(article) AS article FROM shop;+---------+
| article |
+---------+
|       4 |
+---------+

3.6.2. 拥有某个列的最大值的行

任务:找出最贵物品的编号、销售商和价格。这很容易用一个子查询做到:

SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop);

另一个解决方案是按价格降序排序所有行并用MySQL特定LIMIT子句只得到第一行:

SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;

:如果有多项最贵的物品( 例如每个的价格为19.95),LIMIT解决方案仅仅显示其中一个!

3.6.3. 列的最大值:按组

任务:每项物品的的最高价格是多少?

SELECT article, MAX(price) AS price
FROM   shop
GROUP BY article+---------+-------+
| article | price |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+

3.6.4. 拥有某个字段的组间最大值的行

任务:对每项物品,找出最贵价格的物品的经销商。

可以用这样一个子查询解决该问题:

SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)FROM shop s2WHERE s1.article = s2.article);

3.6.5. 使用用户变量

你可以清空MySQL用户变量以记录结果,不必将它们保存到客户端的临时变量中。(参见 9.3节,“用户变量”.)。

例如,要找出价格最高或最低的物品的,其方法是:

mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;
mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

3.6.6. 使用外键

在MySQL中,InnoDB表支持对外部关键字约束条件的检查。参见15.2节,“InnoDB存储引擎”。还可以参见 1.8.5.5节,“外键”。

只是联接两个表时,不需要外部关键字。对于除InnoDB类型的表,当使用REFERENCES tbl_name(col_name)子句定义列时可以使用外部关键字,该子句没有实际的效果,只作为备忘录或注释来提醒,你目前正定义的列指向另一个表中的一个列。执行该语句时,实现下面很重要:

·         MySQL不执行表tbl_name 中的动作,例如作为你正定义的表中的行的动作的响应而删除行;换句话说,该句法不会致使ON DELETE或ON UPDATE行为(如果你在REFERENCES子句中写入ON DELETE或ON UPDATE子句,将被忽略)。

·         该句法可以创建一个column;但不创建任何索引或关键字。

·         如果用该句法定义InnoDB表,将会导致错误。

你可以使用作为联接列创建的列,如下所示:

  1. CREATE TABLE person (
  2. id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  3. name CHAR(60) NOT NULL,
  4. PRIMARY KEY (id)
  5. );
  6. CREATE TABLE shirt (
  7. id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  8. style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
  9. color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
  10. owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
  11. PRIMARY KEY (id)
  12. );
  13. INSERT INTO person VALUES (NULL, 'Antonio Paz');
  14. SELECT @last := LAST_INSERT_ID();
  15. INSERT INTO shirt VALUES
  16. (NULL, 'polo', 'blue', @last),
  17. (NULL, 'dress', 'white', @last),
  18. (NULL, 't-shirt', 'blue', @last);
  19. INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');
  20. SELECT @last := LAST_INSERT_ID();
  21. INSERT INTO shirt VALUES
  22. (NULL, 'dress', 'orange', @last),
  23. (NULL, 'polo', 'red', @last),
  24. (NULL, 'dress', 'blue', @last),
  25. (NULL, 't-shirt', 'white', @last);
  26. SELECT * FROM person;
  27. +----+---------------------+
  28. | id | name                |
  29. +----+---------------------+
  30. |  1 | Antonio Paz         |
  31. |  2 | Lilliana Angelovska |
  32. +----+---------------------+
  33. SELECT * FROM shirt;
  34. +----+---------+--------+-------+
  35. | id | style   | color  | owner |
  36. +----+---------+--------+-------+
  37. |  1 | polo    | blue   |     1 |
  38. |  2 | dress   | white  |     1 |
  39. |  3 | t-shirt | blue   |     1 |
  40. |  4 | dress   | orange |     2 |
  41. |  5 | polo    | red    |     2 |
  42. |  6 | dress   | blue   |     2 |
  43. |  7 | t-shirt | white  |     2 |
  44. +----+---------+--------+-------+
  45. SELECT s.* FROM person p, shirt s
  46. WHERE p.name LIKE 'Lilliana%'
  47. AND s.owner = p.id
  48. AND s.color <> 'white';
  49. +----+-------+--------+-------+
  50. | id | style | color  | owner |
  51. +----+-------+--------+-------+
  52. |  4 | dress | orange |     2 |
  53. |  5 | polo  | red    |     2 |
  54. |  6 | dress | blue   |     2 |
  55. +----+-------+--------+-------+

按照这种方式使用,REFERENCES子句不会显示在SHOW CREATE TABLE或DESCRIBE的输出中:

  1. SHOW CREATE TABLE shirt\G
  2. *************************** 1. row ***************************
  3. Table: shirt
  4. Create Table: CREATE TABLE `shirt` (
  5. `id` smallint(5) unsigned NOT NULL auto_increment,
  6. `style` enum('t-shirt','polo','dress') NOT NULL,
  7. `color` enum('red','blue','orange','white','black') NOT NULL,
  8. `owner` smallint(5) unsigned NOT NULL,
  9. PRIMARY KEY  (`id`)
  10. ) ENGINE=MyISAM DEFAULT CHARSET=latin1

在列定义中,按这种方式使用REFERENCES作为注释或“提示”适用于表MyISAM和BerkeleyDB。

该查询计算了在表中按年/月组合的不同天数,可以自动去除重复的询问。

3.6.9. 使用AUTO_INCREMENT

可以通过AUTO_INCREMENT属性为新的行产生唯一的标识:

  1. CREATE TABLE animals (
  2. id MEDIUMINT NOT NULL AUTO_INCREMENT,
  3. name CHAR(30) NOT NULL,
  4. PRIMARY KEY (id)
  5. );
  6. INSERT INTO animals (name) VALUES
  7. ('dog'),('cat'),('penguin'),
  8. ('lax'),('whale'),('ostrich');
  9. SELECT * FROM animals;

将返回:

  1. +----+---------+
  2. | id | name    |
  3. +----+---------+
  4. |  1 | dog     |
  5. |  2 | cat     |
  6. |  3 | penguin |
  7. |  4 | lax     |
  8. |  5 | whale   |
  9. |  6 | ostrich |
  10. +----+---------+

你可以使用LAST_INSERT_ID()SQL函数或mysql_insert_id() C API函数来查询最新的AUTO_INCREMENT值。这些函数与具体连接有关,因此其返回值不会被其它执行插入功能的连接影响。

注释:对于多行插入,LAST_INSERT_ID()和mysql_insert_id()从插入的第一行实际返回AUTO_INCREMENT关键字。在复制设置中,通过该函数可以在其它服务器上正确复制多行插入。

对于MyISAM和BDB表,你可以在第二栏指定AUTO_INCREMENT以及多列索引。此时,AUTO_INCREMENT列生成的值的计算方法为:MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。如果想要将数据放入到排序的组中可以使用该方法。

  1. CREATE TABLE animals (
  2. grp ENUM('fish','mammal','bird') NOT NULL,
  3. id MEDIUMINT NOT NULL AUTO_INCREMENT,
  4. name CHAR(30) NOT NULL,
  5. PRIMARY KEY (grp,id)
  6. );
  7. INSERT INTO animals (grp,name) VALUES
  8. ('mammal','dog'),('mammal','cat'),
  9. ('bird','penguin'),('fish','lax'),('mammal','whale'),
  10. ('bird','ostrich');
  11. SELECT * FROM animals ORDER BY grp,id;

将返回:

  1. +--------+----+---------+
  2. | grp    | id | name    |
  3. +--------+----+---------+
  4. | fish   |  1 | lax     |
  5. | mammal |  1 | dog     |
  6. | mammal |  2 | cat     |
  7. | mammal |  3 | whale   |
  8. | bird   |  1 | penguin |
  9. | bird   |  2 | ostrich |
  10. +--------+----+---------+

请注意在这种情况下(AUTO_INCREMENT列是多列索引的一部分),如果你在任何组中删除有最大AUTO_INCREMENT值的行,将会重新用到AUTO_INCREMENT值。对于MyISAM表也如此,对于该表一般不重复使用AUTO_INCREMENT值。

如果AUTO_INCREMENT列是多索引的一部分,MySQL将使用该索引生成以AUTO_INCREMENT列开始的序列值。。例如,如果animals表含有索引PRIMARY KEY (grp, id)和INDEX(id),MySQL生成序列值时将忽略PRIMARY KEY。结果是,该表包含一个单个的序列,而不是符合grp值的序列。

要想以AUTO_INCREMENT值开始而不是1,你可以通过CREATE TABLE或ALTER TABLE来设置该值,如下所示:

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

关于AUTO_INCREMENT的详细信息:

·         如何为列指定AUTO_INCREMENT属性:13.1.5节,“CREATE TABLE语法”和 13.1.2节,“ALTER TABLE语法”。

·         AUTO_INCREMENT的动作取决于SQL模式:5.3.2节,“SQL服务器模式”。

·         找出含有最新AUTO_INCREMENT值的行:12.1.3节,“比较函数和操作符”。

·         设置将用到的AUTO_INCREMENT值: 13.5.3节,“SET语法” 。

·         AUTO_INCREMENT和复制:6.7节,“复制特性和已知问题”.

·         AUTO_INCREMENT相关的可用于复制的Server-system变量(auto_increment_increment和auto_increment_offset):5.3.3节,“服务器系统变量”。

更多API,可以参考,http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#retrieving-data

【MySQL数据库开发之四】MySQL 处理模式/常用查询/模式匹配等(下)相关推荐

  1. MySQL 数据库 之 高级 SQL 语句(常用查询,正则表达式,运算符,库函数,存储过程)

    文章目录 前言 一 . 常用查询介绍 1.按关键字排序 1.1默认升序 1.2 降序 1.3 多字段的排序 2. 对结果进行分组 2.1 分组统计 3.限制结果条目 3.1 查看前4行 3.2 查看第 ...

  2. C/C++ MySQL数据库开发

    C/C++ MySQL数据库开发笔记 MySQL启动方式 手动启动MySQL数据库: 命令行方式启动MySQL数据库: 配置环境变量 MySQL在Linux下安装 MySQL的配置文件重要参数设置 C ...

  3. MySQL数据库开发规范-EC

    最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库.今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例.因为规范大部分还是 ...

  4. Mysql 数据库开发及企业级应用

    文章目录 1.Mysql 数据库开发及企业级应用 1.1.为什么要使用数据库 1.1.1.数据库概念(Database) 1.1.2.为什么需要数据库 1.2.程序员为什么要学习数据库 1.3.数据库 ...

  5. MySQL数据库开发规范

    MySQL数据库开发规范 一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码, ...

  6. PHP+mysql数据库开发搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))...

    PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a)   robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robb ...

  7. 58到家MySQL数据库开发规范(javamysql数据)

    58到家MySQL数据库开发规范(javamysql数据) 一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字 ...

  8. MySQL数据库界面化工具 - Navicat的常用功能

    写在前面:博主是一只经过实战开发历练后投身培训事业的"小山猪",昵称取自动画片<狮子王>中的"彭彭",总是以乐观.积极的心态对待周边的事物.本人的技 ...

  9. MySQL数据库开发的 36 条军规

    转载自  MySQL数据库开发的 36 条军规 核心军规 尽量不在数据库做运算 控制单表数据量 纯INT不超过10M条,含Char不超过5M条 保持表身段苗条 平衡范式和冗余 拒绝大SQL,复杂事务, ...

最新文章

  1. yii2 引入php文件,Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
  2. vpwm的控制变频_变频V/F和矢量控制你知道区别吗?据说这四种控制没有几人能说清...
  3. Python GUI编程--Tkinter
  4. java session丢失_跨域造成session丢失
  5. spark 在启动的时候出现JAVA_HOME not set
  6. 《C++ Primer 第五版》第二章(第5小节)——using和typedef,auto和decltype总结
  7. Django环境安装和创建工程
  8. wait() 和 waitpid()
  9. 基于JavaWeb实现的研究室综合系统
  10. tp5分页不加载搜索参数
  11. HDU 1024 Max Sum Plus Plus
  12. web安全day22:linux系统最基本知识最常用操作和命令
  13. Kubernetes的调度机制
  14. Siemens M65...
  15. 计算机应用202001常规,2001年4月份全国高等教育自学考试计算机应用基础试题
  16. Hadoop高手之路1—Hadoop简介
  17. java怎么修改支付宝步数_支付宝怎么修改运动步数 刷步数方法
  18. 如何用python绘制灰度直方图_用python简单处理图片(5):图像直方图
  19. 写入excel文件的ExcelWriter、openpyxl、xlsxwriter
  20. yolov2中的reorg网络层数据理解

热门文章

  1. 循环获取另一个php变量,通过引用将多个变量传递给foreach循环(php)
  2. android.mk 编译jar包,Androidmk 使用详解
  3. GOOGLE的摄像头漏洞
  4. npm run build失败
  5. 【BZOJ1406】【codevs2478】密码箱,数论练习
  6. java jsp js xml,JSP语法的xml写法
  7. duilib 子窗口位置_duilib各种布局的作用,相对布局与绝对布局的的意义与使用方法...
  8. render注册一个链接组件_详解vue 动态加载并注册组件且通过 render动态创建该组件...
  9. Pentium 4处理器架构/微架构/流水线 (11) - NetBurst执行核详解 - Load/Store操作/存储转发
  10. 【英语学习】【Level 07】U03 Amazing wonders L1 My hometown