MySQL使用教程(五)

3.6. 常用查询的例子

3.6.1. 列的最大

3.6.2. 有某个列的最大的行

3.6.3. 列的最大:按

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

3.6.5. 使用用户变

3.6.6. 使用外

3.6.7. 根据两个搜索

3.6.8. 根据天访问

3.6.9. 使用AUTO_INCREMENT

下面是一些学如何MySQL解决一些常见问题的例子。

在一些例子中,使用数据“shop存某个商人(经销商)的件物(物品号)的价格。假定个商人对每项物品有一个固定价格,那(物品,商人)为该记录的主关键字。

命令行工mysql选择数据

shell> mysql your-database-name

(在大多数MySQL中,你可以使用test数据)。

你可以使用以下建示例表:

mysql> CREATE TABLE shop (

    -> article INT(4)UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,

    -> dealer CHAR(20)                DEFAULT ''     NOT NULL,

    -> price  DOUBLE(16,2)            DEFAULT '0.00' NOT NULL,

    -> PRIMARYKEY(article, dealer));

mysql> INSERT INTO shop VALUES

    -> (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),

    -> (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);

句后,表包含以下内容:

mysql> SELECT * FROM shop;

+---------+--------+-------+

| article | dealer | price |

+---------+--------+-------+

|    0001 |A      |  3.45 |

|    0001 |B      |  3.99 |

|    0002 |A      | 10.99 |

|    0003 |B      |  1.45 |

|    0003 |C      |  1.69 |

|    0003 |D      |  1.25 |

|    0004 |D      | 19.95 |

+---------+--------+-------+

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) FROMshop);

另一个解决方案是按价格降序排序所有行并用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 s2

             WHERE 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)子句定可以使用外部关键字,子句没有实际效果,只作为备或注来提醒,你目前正定的列指向另一个表中的一个列该语实现下面很重要:

·         MySQLtbl_name 中的作,例如作你正定的表中的行的作的响除行;话说句法不会致使ON DELETEON UPDATE(如果你REFERENCES子句中写入ON DELETEON UPDATE子句,将被忽略)。

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

·         如果用句法定InnoDB表,将会错误

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

CREATE TABLE person (

    id SMALLINT UNSIGNED NOTNULL AUTO_INCREMENT,

    name CHAR(60) NOT NULL,

    PRIMARY KEY (id)

);

 

CREATE TABLE shirt (

    id SMALLINT UNSIGNED NOTNULL AUTO_INCREMENT,

    style ENUM('t-shirt','polo', 'dress') NOT NULL,

    color ENUM('red', 'blue','orange', 'white', 'black') NOT NULL,

    owner SMALLINT UNSIGNEDNOT NULL REFERENCES person(id),

    PRIMARY KEY (id)

);

 

INSERT INTO person VALUES (NULL, 'AntonioPaz');

 

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, 'LillianaAngelovska');

 

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 | AntonioPaz         |

|  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

 WHEREp.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 TABLEDESCRIBE:

SHOW CREATE TABLE shirt\G

*************************** 1. row***************************

Table: shirt

Create Table: CREATE TABLE `shirt` (

`id` smallint(5) unsigned NOT NULLauto_increment,

`style` enum('t-shirt','polo','dress') NOTNULL,

`color`enum('red','blue','orange','white','black') NOT NULL,

`owner` smallint(5) unsigned NOT NULL,

PRIMARY KEY  (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1

在列定中,按这种方式使REFERENCES提示适用于表MyISAMBerkeleyDB

3.6.7. 根据两个搜索

可以充分利用使用单关键OR子句,如同AND理。

一个比灵活的例子是找两个通OR合到一起的关键字:

SELECT field1_index, field2_index FROMtest_table

WHERE field1_index = '1' OR field2_index = '1'

情形是已经优的。参7.2.6索引合并

可以使UNION将两个SELECT句的出合成到一起来更有效地解该问题。参13.2.7.2“UNION

SELECT只搜索一个关键字,可以化:

SELECT field1_index, field2_index

    FROM test_table WHEREfield1_index = '1'

UNION

SELECT field1_index, field2_index

    FROM test_table WHEREfield2_index = '1';

3.6.8. 根据天访问

下面的例子示了如何使用位函数来个月中用户访问的天数。

CREATE TABLE t1 (year YEAR(4), month INT(2)UNSIGNED ZEROFILL,

            day INT(2) UNSIGNED ZEROFILL);

INSERT INTO t1VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),

           (2000,2,23),(2000,2,23);

示例表中含有代表用户访问的年-月-日。可以使用以下查询来确定个月的访问天数:

SELECTyear,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1

       GROUP BYyear,month;

将返回:

+------+-------+------+

| year | month | days |

+------+-------+------+

| 2000 |    01|    3 |

| 2000 |    02|    2 |

+------+-------+------+

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

3.6.9. 使用AUTO_INCREMENT

可以通AUTO_INCREMENT属性新的行生唯一的标识

CREATE TABLE animals (

     id MEDIUMINT NOTNULL AUTO_INCREMENT,

     name CHAR(30) NOTNULL,

     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关键字。在置中,通过该函数可以在其它服器上正确制多行插入。

MyISAMBDB表,你可以在第二AUTO_INCREMENT以及多列索引。此AUTO_INCREMENT列生成的算方法MAX(auto_increment_column)+ 1 WHERE prefix=given-prefix。如果想要将数据放入到排序的中可以使用方法。

CREATE TABLE animals (

    grpENUM('fish','mammal','bird') NOT NULL,

    id MEDIUMINT NOT NULLAUTO_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_INCREMENTMyISAM表也如此,表一般不重使AUTO_INCREMENT

如果AUTO_INCREMENT列是多索引的一部分,MySQL将使用索引生成AUTO_INCREMENT始的序列。。例如,如animals表含有索引PRIMARYKEY (grp, id)INDEX(id)MySQL生成序列值时将忽PRIMARYKEY果是,表包含一个个的序列,而不是符grp的序列。

要想以AUTO_INCREMENT值开始而不1,你可以通CREATETABLEALTERTABLE该值,如下所:

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_INCREMENT6.7制特性和已知问题.

·         AUTO_INCREMENT的可用于Server-system(auto_increment_incrementauto_increment_offset)5.3.3器系统变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值