SELECT杂谈二

1 使用视图来简化查询

    mysql> SELECT

               > DATE_FORMAT (t, '%M %e, %Y' ) AS date_sent,

             > CONCAT ( srcuser,'@', srchost ) AS sender,

             > CONCAT ( dstuser,'@', dsthost ) AS recipient,

             > size FROM mail;

    当频繁使用类似上述查询时,需要每一次都在查询中重复写入类似的复杂结构的表达式,

    视图是一个虚拟的数据库表,它并不包含任何实际的数据,实际上,一个视图可以看做是一个特定的SELECT语句。

    mysql> CREATE VIEW mail_view AS

             > SELECT

             > DATE_FORMAT (t, '%M %e, %Y' ) AS date_sent,

             > CONCAT ( srcuser,'@', srchost ) AS sender,

             > CONCAT ( dstuser,'@', dsthost ) AS recipient,

             > size FROM mail;

    查询视图与查询其他普通数据库表是一样的:

    mysql> SELECT date_sent, sender, size FROM mail_view

     mysql> SELECT date_sent, sender, size FROM mail_view

             >  WHERE size>100000 ORDER BY size; 

 

2  多表查询(使用联合join,或者使用子查询)

    使用联合join:

    mysql> SELECT id, name, service, contact_name

             > FROM profile INNER JOIN profile_contact ON id = profile_id;

   以上查询语句中,From子句制定了要查询的表(profile表和profile_contact), ON子句制定了两个表的行的绑定规则。

   在显示的结果中,id列和name列来自profile表,而service和contact_name列来自profile_contact表,它们按照

   id = profile_id的规则绑定到一行。

   使用子查询:

   mysql> SELECT * FROM profile_contact

            > WHERE profile_id = (SELECT id FROM profile WHERE name = 'Mort');

 

3 从查询结果集中取出部分行

   mysql> SELECT * FROM profile LIMIT 5;     -------->取出头5行

   mysql> SELECT * FROM profile ORDER BY birth LlMIT 1;     -------->找到出生最早的人

   mysql> SELECT * FROM profile ORDER BY birth DESC LlMIT 1;     -------->找到出生最晚的人

   mysql> SELECT name, DATE_FORMAT(birth, '%m-%d') AS birthday

            >  FROM profile ORDER BY birthday LIMIT 1;     -------->找到出生月份和日期最早的人

   mysql> SELECT * FROM profile ORDER BY birth LIMIT 20, 20;     -------->找到排序后第20~39个人

  

4  关于ORDER BY和LIMIT的一些问题

   这两者的结合可以很方便的从查询结果中得到含有某个最大值或者最小值的n行记录,但并不能保证每一次这样的查询都是正确

   的,例如当所要查询的行中有重复或者相等的值时,解决办法:使用预查询来帮助确定LIMIT的参数值

   mysql> SELECT name, wins, FROM al_winner

            >  WHERE wins >=

            >      (SELECT wins FROM al_winner

            >       ORDER BY wins DESC, name

            >       LIMIT 3, 1)

            >  ORDER BY wins DESC, name;

   这样就避免了分割具有相同wins值的数据

   如果加入DISTINCT?

   mysql> SELECT name, wins, FROM al_winner

            >  WHERE wins >=

            >      (SELECT DISTINCT wins FROM al_winner

            >       ORDER BY wins DESC, name

            >       LIMIT 3, 1)

            >  ORDER BY wins DESC, name;

   则获得wins列中排名前四的(含相等)的队伍,注:和前一种区别在于wins的值

 

5 查询逆序的排列,结果按照升序输出

   mysql> SELECT * FROM

            > (SELECT name, birth FROM profile ORDER BY birth DESC LIMIT 4)  AS t

            >  ORDER BY birth;

   在查询语句中,FROM子句之后必须是表名,因此在上例中使用了AS t对子查询结果赋予别名,作为FROM的一个临时表名

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值