常见查询示例
假设有一个表格,是商店为某些交易员(经销商)保存每种商品(项目号)的价格。假设每个交易者的每件商品都有一个固定的价格,那么(商品,交易者)就是记录的主键
1 | mysql> create database shop; |
1.列的最大值
1 | mysql> select max(price) from shop_tab; |
2.包含某一列的最大值的行
使用子查询完成此操作
1 | mysql> select * from shop_tab |
按价格降序排序所有行,并使用特定于MySQL的LIMIT子句获取第一行
1 | mysql> select * from shop_tab |
3.每种商品的最高价格
1 | mysql> select article,max(price) as price |
4.对于每种商品,找到价格最贵的经销商
1 | 1解:以price为条件,使用where s1.article = s2.article或者any操作符使主查询一条记录 |
1 | 2解:筛选出每件商品最贵的价格作为s2,与原表S1内连接,显示两边表同时有对应的数据, |
1 | 3解:s2左连接s1,通过s1.article = s2.article 两张表进行价格比较 |
5.用户自定义变量
1 | mysql> select @min_price:=min(price),@max_price:=max(price) |
6.使用外键
1 | CREATE TABLE person ( |
7.使用两个键搜索
逻辑运算符or 使用一个主键能够被很好的优化,就像处理and一样
但是使用or去搜索两个不同的主键比较棘手
1 | SELECT field1_index, field2_index FROM test_table |
可以使用union结合两个单独的select语句进行查询,会更加有效。每个select只搜索一个键则会很好的优化
1 | SELECT field1_index, field2_index |
8.计算每日访问量
以下示例显示如何使用位组功能计算用户访问网页的每月天数。
1 | CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, |
示例表包含表示用户对页面的访问的年 - 月 - 日值。要确定这些访问每月发生的天数,请使用以下查询:
1 | SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 |
该查询计算每个年/月组合在表中显示的天数,并自动删除重复的条目
9.使用AUTO_INCREMENT
该AUTO_INCREMENT属性可用于为新行生成唯一标识:
1 | mysql> CREATE TABLE animals ( |
AUTO_INCREMENT列没有指定值,因此MySQL自动分配序列号。也可以显式地为列分配0来生成序列号,除非启用了NO_AUTO_VALUE_ON_ZERO SQL模式(NO_AUTO_VALUE_ON_ZERO影响AUTO_INCREMENT列的处理。一般情况下可以向该列插入NULL或0生成下一个序列号)。例如
1 | mysql> INSERT INTO animals (id,name) VALUES(0,'groundhog'); |
如果声明了列NOT NULL,则还可以分配NULL给列以生成序列号。例如:
1 | mysql> INSERT INTO animals (id,name) VALUES(NULL,'squirrel'); |
将任何其他值插入AUTO_INCREMENT列时,列被设置为该值,序列被重置,以便下一个自动生成的值按照最大列值的顺序生成。例如:
1 | mysql>INSERT INTO animals (id,name) VALUES(100,'rabbit'); |
AUTO_INCREMENT使用LAST_INSERT_ID() SQL函数或mysql_insert_id() C API函数检索最新自动生成的值 。这些函数是特定于连接的,因此它们的返回值不受另一个执行插入的连接的影响。
1 | mysql> select LAST_INSERT_ID(); |
注意
- 对于多行插入,LAST_INSERT_ID()和mysql_insert_id()实际上从插入的第一行返回AUTO_INCREMENT键。
要从除1之外的AUTO_INCREMENT值开始,使用CREATE TABLE或ALTER TABLE设置该值,如下所示:
1 | mysql> ALTER TABLE animals AUTO_INCREMENT = 100; |