计算字段并不实际存在于数据库表中,计算字段是运行时在select语句内创建的,只有数据库知道select语句中哪些列是实际的表列,哪些是计算字段。
拼接 将值连接到一起构成单个值 注意:多数DBMS使用+或||来实现拼接,mysql使用concat()函数来实现;注意concat需要把一个或多个指定的串,各个串之间用逗号分隔。
通过LTrim()去掉数据项左边的空格,trim()去掉数据左右的空格;selecttrim(name)
首先要注意是mysql使用的日期格式,无论何时指定一个日期,不管是插入或更新表值,还是where子句进行过滤,日期格式必须是yyyy-mm-dd,消除歧义
Where order_date=’2005-09-01’
Order_date 的数据类型为datetime,该类型存储日期与时间(小时分钟秒),解决办法是将给出的日期与列中的日期进行比较,必须使用Date()函数,将列中的日期提出出来,Date(order_date)进行比较。
如果要检索出2005年9月的所有订单,方法一:
Where Date(order_date)between ‘2005-09-01’ and ‘2005-09-30’;
或者Year(order_date)=2005 and month(order_date)=9;
聚集函数:运行在行组上,计算和返回单个值的函数;
聚集函数:avg()返回某列的平均值 avg()只能用于单个列的平均值,获得多个列的平均值,必须给出多个avg()函数。
Count() 返回某列的行数 使用count(column)对特定列中具有值的行进行计数,忽略NULL值。count(*)对表的行数进行计数,包括NULL行。
Max() 返回某列的最大值 返回列的最大值,在文本数据时,如果数据按相应的列进行排序,则max()返回最后一行。
Min() 返回某列的最小值 返回列的最小值,在文本数据时,如果数据按相应的列进行排序,则min()返回最前一行。
Sum() 返回某列值得和
Where进行行过滤,having过滤分组,where在数据分组前进行过滤,having在数据分组后进行过滤
作为计算字段使用子查询:需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders中。
1、 从customers表中检索客户列表
2、 对于每个检索出的每个客户,统计在orders表中的订单数目。
Selectcust_name,cust_state,(select count(*) from orders whereorders.cust_id=customers.cust_id) as orders
From customers
Order by cust_name;
在用union组合查询时,只能使用一条orderby 子句,它必须出现在最后一条select语句之后。对于结果集,不存在用一种方式排序一部分,而用另一部分排序另一部分,因此,不允许使用多条orderby 子句。
使用全文本搜索
一般在创建表时,进行全文本搜索,createtable 语句接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表。
Create table productnotes
(
Note_id int not nullauto_increment,
Pro_id char(10) not null,
Note_date date_time,
Note_text text null,
Primary key(note_id),
FULLTEXT(note_text)
)engine=myisam;
不要在导入数据时,使用FULLTEXT应该首先导入所有数据,然后再修改表,定义FULLTEXT.
Select note_text fromproductnotes where match(note_text) against (‘raddit’);
在索引之后,使用两个函数match()和against()执行全文搜索,其中match()指定搜索的列,against()指定要使用的表达式。
传递给match()的值必须与FULLTEXT()定义中的相同,如果指定多列,则必须列出它们(次序相同)
使用查询扩展(与搜索有关的行)
在使用查询扩展时,mysql对数据与索引进行两遍扫描来完成搜索:
首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行。
其次,mysql检查这些匹配行并选择所有用的词
再其次,mysql再次进行全文搜索,这次不仅使用原来的条件,而且还使用所有有用的词。
Select note_text fromproductnotes where match(note_text) against (‘heavy’ in Boolean mode);
布尔文本搜素:
Select note_text
From productnotes
Where match(note_text)against(‘heavy –rope*’ in Boolean mode);
全文本布尔操作符
+ 包含,次必须存在
- 排除,次必须不出现
操作符 > 包含,而且增加等级
操作符 < 包含,而且减少等级
() 把词组成子表达式(允许这些子表达式作为一个祖被包含、排除、排列)
~ 取消一个词的排序值
操作符* 词尾通配符
“” 定义一个短语(它匹配整个短语以便包含或排除这个短语)