Mysql的select

SELECT
DISTINCT:应用于所有列而不仅是前置它的列。列出的元组的属性只要有一个不同都要列出来。
SELECT DISTINCT id,name FROM table;
LIMIT:限制返回的最大行值。LIMIT 5—返回不多于5行。LIMIT 5,5—从行5开始的5行,第一个数为开始位置,第二个数为要检索的行数
SELECT DISTINCT vend_id FROM products LIMIT 5,5;

子句:sql语句由子句构成。一个子句通常由一个关键字和所提供的数据组成。


排序检索数据:
ORDER BY:按字母顺序排序数据。通常ORDER BY子句中使用的列将是为显示所选择的列。但实际上并不一定要这样,用非检索的列排序数据时完全合法的。按多个列排序:只要指定列名,列名之间用逗号分开即可。

DESC:按降序排序,DESC只应用到直接位于其前面的列名。如果想在多个列上进行降序排序,必须对每个列指定DESC关键字

ASC:升序(默认)

SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
过滤数据:WHERE
WHERE和ORDER BY同时出现时,ORDER BY位于WHERE后面


操作符:用来联结或改变WHERE子句中子句的关键字。
AND,OR,AND的优先级大于OR,使用圆括号。
IN:用来指定条件范围,范围中的每个条件都可以进行匹配,由逗号分隔,IN完成与OR相同的功能
NOT:否定它之后所跟的任何条件
通配符:用来匹配值的一部分的特殊字符。在搜索子句中使用通配符,必须使用LIKE操作符。
%:表示匹配任何字符出现任意次数(也能匹配0个字符),但不能匹配NULL;
_(下划线):匹配任意字符,但只匹配单个字符。


正则表达式:REGEXP
mysql中的正则表达式匹配不区分大小写,为区分大小写,用BINARY关键字, REGEXP BINARY
.:匹配任意一个字符
|:匹配其中之一
[]:匹配特定字符[]中的一个字符,[123],[^123]表示匹配除这些字符外的任何字符,[1-9]、[a-z]表示范围
为了匹配特殊字符,必须用\\为前导,转义。
元字符:具有特殊含义的字符。
\\f:换页
\\n:换行
\\r:回车
\\t:制表
\\v:纵向制表


例:REGEXP '\\([0-9] sticks?\\)'.     \\(匹配(,[0-9]匹配任意数字,sticks匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任意字符的0次或1次出现,\\)匹配))
^:在集合中[]用它来否定该集合,否则,用来指串的开始处

LIKE匹配整个串,REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用&结束每个表达式,可以使REGEXP的作用与LIKE一样

计算字段、拼接字段:使用Concat()函数拼接。使用RTrim()函数删除数据右侧多余的空格,LTrim()去掉左边的空格,Trim()去掉左右两边的空格


别名AS:一个字段或值的替换名。


SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') AS vend_title FROM vendors ORDER BY vend_name;


AS vend_title指示SQL创建一个包含指定计算的名为vend_title的计算字段,任何客户机应用都可以按名引用这个列

SELECT prod_id,quantity,item_price,quantity*itme_price AS expanded_price FROM orderitems WHERE order_num=20005;

汇总数据:
聚集函数:运行在行组上,计算和返回单个值的函数


分组数据:分组是在SELECT语句的GROUP BY子句中建立的
使用WITH ROLLUP关键字,得到每个分组以及每个分组汇总级别(针对每个分组)的值

HAVING支持所有WHERE操作符,WHERE过滤行,HAVING过滤分组。WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。WHERE排除的行不包括在分组中。

SELECT vend_id,COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2;

子查询:嵌套在其他查询中的查询。
SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN(SELECT cust_id
                 FROM orders
                 WHERE order_num IN (SELECT order_num
                                     FROM orderitems
                                     WHERE prod_id='TNT2'));


SELECT cust_name,
       cust_state,
       (SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders
       FROM customers
       ORDER BY cust_name;


相关子查询:设计外部查询的子查询。只要列名可能有多义性,就使用(表名和列名由一个句点分隔)


联结
在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的。在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,它只包含哪些匹配给定条件(这里的联结条件)的行。应该保证所有联结都有WHERE子句
笛卡儿积:没有联结条件(WHERE子句)的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数

等值联结
SELECT vend_name,prod_name,prod_price
FROM vendors,products 
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name,prod_name;

内部联结
SELECT vend_name,prod_name,prod_price 
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;


联结多个表
SELECT prod_name,vend_name,prod_price,quantity
FROM orderitems,products,vendors
WHERE products.vend_id = vendors.vend_id
  AND orderitems.prod_id = products.prod_id

  AND order_num = 20005;


表别名:缩短SQL语句;允许在单条SELECT语句中多次使用相同的表。customers AS c


自联结、自然联结、外部联结(联结包含了那些在相关表中没有关联行的行)
SELECT customer.cust_id, orders.order_num
FROM customers INNER JOIN orders

ON customer.cust_id = orders.cust_id;


包括没有订单的客户:
SELECT customer.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
在使用OUTER JOIN 语法时,必须使用LEFT或RIGHT关键字指定包含其所有行的表。

使用带聚集函数的联结

组合查询
UNION:1、UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键词UNION分隔;
     2、UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出);
     3、列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如不同的数值类型或不同的日期类型)。

UNION从查询结果集中自动去除了重复的行(它的行为与单条SELECT语句中使用多个WHERE子句条件一样),这是UNION的默认行为,使用UNION ALL可以返回所有匹配行。
在用UNION组合查询时,只能使用一条ORDER BY子句,必须出现在最后一条SELECT语句之后。用来排序所有SELECT语句返回的所有结果。

使用UNION极大地简化复杂的WHERE子句,简化从多个表中检索数据的工作。


全文本搜索
mysql支持几种基本的数据库引擎,最常用的是MyISAM和InnoDB,前者支持全文本搜索,后者不支持。
为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。可以索引单个列,也可以指定多个列。可以在创建表时指定FULLTEXT,或者在稍后指定(在这种情况下所有已有数据必须立即索引)。在索引之后,使用Match()和Against()执行全文本搜索,Match()指定被搜索的列,Against()指定要使用的搜索表达式。

传递给Match()的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们(而且次序正确)。搜索不区分大小写。
全文本搜索的一个重要部分是对结果排序。具有较高等级的行先返回

查询扩展(放宽所返回的全文本搜索结果的范围)
步骤:1、首先进行一次全文本搜索,找出与搜索条件匹配的所有行;
     2、mysql检查这些匹配行并选择所有有用的词(mysql如何断定什么有用,什么无用)
     3、mysql再次进行全文本搜索,不仅使用原来的条件,而且还使用所有有用的词。

SELECT note_text 
FROM productnotes
WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);

布尔文本搜索(提供内容细节):即使没有FULLTEXT索引也可以使用
     1、要匹配的词;
     2、要排斥的词;
     3、排列提示(等级);
     4、表达式分组;
     5、另外一些内容。

SELECT note_text 
FROM productnotes
WHERE Match(note_text) Against('heavy' IN BOOLEAN MODE );

匹配包含heavy但不包含任意以rope开始的词的行:
SELECT note_text 
FROM productnotes
WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE );

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值