【MySQL数据库开发之四】MySQL 处理模式/常用查询/模式匹配等(下)
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节,“外键”。
· 该句法可以创建一个column;但不创建任何索引或关键字。
- CREATE TABLE person (
- id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
- name CHAR(60) NOT NULL,
- PRIMARY KEY (id)
- );
- CREATE TABLE shirt (
- id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
- style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
- color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
- owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
- PRIMARY KEY (id)
- );
- INSERT INTO person VALUES (NULL, 'Antonio Paz');
- SELECT @last := LAST_INSERT_ID();
- INSERT INTO shirt VALUES
- (NULL, 'polo', 'blue', @last),
- (NULL, 'dress', 'white', @last),
- (NULL, 't-shirt', 'blue', @last);
- INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');
- SELECT @last := LAST_INSERT_ID();
- INSERT INTO shirt VALUES
- (NULL, 'dress', 'orange', @last),
- (NULL, 'polo', 'red', @last),
- (NULL, 'dress', 'blue', @last),
- (NULL, 't-shirt', 'white', @last);
- SELECT * FROM person;
- +----+---------------------+
- | id | name |
- +----+---------------------+
- | 1 | Antonio Paz |
- | 2 | Lilliana Angelovska |
- +----+---------------------+
- SELECT * FROM shirt;
- +----+---------+--------+-------+
- | id | style | color | owner |
- +----+---------+--------+-------+
- | 1 | polo | blue | 1 |
- | 2 | dress | white | 1 |
- | 3 | t-shirt | blue | 1 |
- | 4 | dress | orange | 2 |
- | 5 | polo | red | 2 |
- | 6 | dress | blue | 2 |
- | 7 | t-shirt | white | 2 |
- +----+---------+--------+-------+
- SELECT s.* FROM person p, shirt s
- WHERE p.name LIKE 'Lilliana%'
- AND s.owner = p.id
- AND s.color <> 'white';
- +----+-------+--------+-------+
- | id | style | color | owner |
- +----+-------+--------+-------+
- | 4 | dress | orange | 2 |
- | 5 | polo | red | 2 |
- | 6 | dress | blue | 2 |
- +----+-------+--------+-------+
按照这种方式使用,REFERENCES子句不会显示在SHOW CREATE TABLE或DESCRIBE的输出中:
- SHOW CREATE TABLE shirt\G
- *************************** 1. row ***************************
- Table: shirt
- Create Table: CREATE TABLE `shirt` (
- `id` smallint(5) unsigned NOT NULL auto_increment,
- `style` enum('t-shirt','polo','dress') NOT NULL,
- `color` enum('red','blue','orange','white','black') NOT NULL,
- `owner` smallint(5) unsigned NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=latin1
3.6.8. 根据天计算访问量
下面的例子显示了如何使用位组函数来计算每个月中用户访问网页的天数。
- CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
- day INT(2) UNSIGNED ZEROFILL);
- INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
- (2000,2,23),(2000,2,23);
示例表中含有代表用户访问网页的年-月-日值。可以使用以下查询来确定每个月的访问天数:
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month;
该查询计算了在表中按年/月组合的不同天数,可以自动去除重复的询问。
3.6.9. 使用AUTO_INCREMENT
可以通过AUTO_INCREMENT属性为新的行产生唯一的标识:
- CREATE TABLE animals (
- id MEDIUMINT NOT NULL AUTO_INCREMENT,
- name CHAR(30) NOT NULL,
- PRIMARY KEY (id)
- );
- INSERT INTO animals (name) VALUES
- ('dog'),('cat'),('penguin'),
- ('lax'),('whale'),('ostrich');
- SELECT * FROM animals;
将返回:
- +----+---------+
- | id | name |
- +----+---------+
- | 1 | dog |
- | 2 | cat |
- | 3 | penguin |
- | 4 | lax |
- | 5 | whale |
- | 6 | ostrich |
- +----+---------+
你可以使用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。如果想要将数据放入到排序的组中可以使用该方法。
- CREATE TABLE animals (
- grp ENUM('fish','mammal','bird') NOT NULL,
- id MEDIUMINT NOT NULL AUTO_INCREMENT,
- name CHAR(30) NOT NULL,
- PRIMARY KEY (grp,id)
- );
- INSERT INTO animals (grp,name) VALUES
- ('mammal','dog'),('mammal','cat'),
- ('bird','penguin'),('fish','lax'),('mammal','whale'),
- ('bird','ostrich');
- SELECT * FROM animals ORDER BY grp,id;
将返回:
- +--------+----+---------+
- | grp | id | name |
- +--------+----+---------+
- | fish | 1 | lax |
- | mammal | 1 | dog |
- | mammal | 2 | cat |
- | mammal | 3 | whale |
- | bird | 1 | penguin |
- | bird | 2 | ostrich |
- +--------+----+---------+
请注意在这种情况下(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 处理模式/常用查询/模式匹配等(下)相关推荐
- MySQL 数据库 之 高级 SQL 语句(常用查询,正则表达式,运算符,库函数,存储过程)
文章目录 前言 一 . 常用查询介绍 1.按关键字排序 1.1默认升序 1.2 降序 1.3 多字段的排序 2. 对结果进行分组 2.1 分组统计 3.限制结果条目 3.1 查看前4行 3.2 查看第 ...
- C/C++ MySQL数据库开发
C/C++ MySQL数据库开发笔记 MySQL启动方式 手动启动MySQL数据库: 命令行方式启动MySQL数据库: 配置环境变量 MySQL在Linux下安装 MySQL的配置文件重要参数设置 C ...
- MySQL数据库开发规范-EC
最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库.今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例.因为规范大部分还是 ...
- Mysql 数据库开发及企业级应用
文章目录 1.Mysql 数据库开发及企业级应用 1.1.为什么要使用数据库 1.1.1.数据库概念(Database) 1.1.2.为什么需要数据库 1.2.程序员为什么要学习数据库 1.3.数据库 ...
- MySQL数据库开发规范
MySQL数据库开发规范 一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码, ...
- PHP+mysql数据库开发搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))...
PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a) robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robb ...
- 58到家MySQL数据库开发规范(javamysql数据)
58到家MySQL数据库开发规范(javamysql数据) 一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字 ...
- MySQL数据库界面化工具 - Navicat的常用功能
写在前面:博主是一只经过实战开发历练后投身培训事业的"小山猪",昵称取自动画片<狮子王>中的"彭彭",总是以乐观.积极的心态对待周边的事物.本人的技 ...
- MySQL数据库开发的 36 条军规
转载自 MySQL数据库开发的 36 条军规 核心军规 尽量不在数据库做运算 控制单表数据量 纯INT不超过10M条,含Char不超过5M条 保持表身段苗条 平衡范式和冗余 拒绝大SQL,复杂事务, ...
最新文章
- yii2 引入php文件,Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
- vpwm的控制变频_变频V/F和矢量控制你知道区别吗?据说这四种控制没有几人能说清...
- Python GUI编程--Tkinter
- java session丢失_跨域造成session丢失
- spark 在启动的时候出现JAVA_HOME not set
- 《C++ Primer 第五版》第二章(第5小节)——using和typedef,auto和decltype总结
- Django环境安装和创建工程
- wait() 和 waitpid()
- 基于JavaWeb实现的研究室综合系统
- tp5分页不加载搜索参数
- HDU 1024 Max Sum Plus Plus
- web安全day22:linux系统最基本知识最常用操作和命令
- Kubernetes的调度机制
- Siemens M65...
- 计算机应用202001常规,2001年4月份全国高等教育自学考试计算机应用基础试题
- Hadoop高手之路1—Hadoop简介
- java怎么修改支付宝步数_支付宝怎么修改运动步数 刷步数方法
- 如何用python绘制灰度直方图_用python简单处理图片(5):图像直方图
- 写入excel文件的ExcelWriter、openpyxl、xlsxwriter
- yolov2中的reorg网络层数据理解
热门文章
- 循环获取另一个php变量,通过引用将多个变量传递给foreach循环(php)
- android.mk 编译jar包,Androidmk 使用详解
- GOOGLE的摄像头漏洞
- npm run build失败
- 【BZOJ1406】【codevs2478】密码箱,数论练习
- java jsp js xml,JSP语法的xml写法
- duilib 子窗口位置_duilib各种布局的作用,相对布局与绝对布局的的意义与使用方法...
- render注册一个链接组件_详解vue 动态加载并注册组件且通过 render动态创建该组件...
- Pentium 4处理器架构/微架构/流水线 (11) - NetBurst执行核详解 - Load/Store操作/存储转发
- 【英语学习】【Level 07】U03 Amazing wonders L1 My hometown