mysql基础--查询

1、mysql查询的五种子句:

  where子句(条件查询):按照“条件表达式”指定的条件进行查询。

  group by子句(分组):按照“属性名”指定的字段进行分组。group by子句通常和count()、sum()等聚合函数一起使用。

  having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出。

  order by子句(排序):按照“属性名”指定的字段进行排序。排序方式由“asc”和“desc”两个参数指出,默认是按照“asc”来排序,即升序。

  limit(限制结果集)。

2、基础查询--where:

  where常用运算符

运算符说明
比较运算符
< 小于
<= 小于或等于
= 等于
!=或<> 不等于
>= 大于或等于
> 大于
in 在某个人集合内
between 在某范围内
逻辑运算符
not或! 逻辑非
or或|| 逻辑或
and或&& 逻辑与

3、通配符的使用:

  SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。  

  注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。

  (1)为了找出以“b”开头的名字: 

mysql> SELECT * FROM pet WHERE name LIKE "b%";

  (2)为了找出以“fy”结尾的名字:

mysql> SELECT * FROM pet WHERE name LIKE "%fy";

   (3)为了找出包含一个“w”的名字:

mysql> SELECT * FROM pet WHERE name LIKE "%w%";

  (4)为了找出包含正好2个字符开头第三个是a的名字,使用“_”模式字符:

mysql> SELECT * FROM pet WHERE name LIKE "__a";

由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。

4、正则表达式的使用:

  (1)“.” 匹配任何单个的字符。 

  (2)一个字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的一个范围,使用一个“-”。“[a-z]” 匹配任何小写字母,而“[0-9]”匹配任何数字。 

  (3)“ * ”匹配零个或多个在它前面的东西。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。 

正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。 

如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。 

为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。 
为了说明扩展正则表达式如何工作,上面所示的LIKE查询在下面使用REGEXP重写:

  (1)为了找出以“b”开头的名字,使用“^”匹配名字的开始并且“[bB]”匹配小写或大写的“b”:

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

  (2)为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";

  (3)为了找出包含一个“w”的名字,使用“[wW]”匹配小写或大写的“w”:

mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";

  (4)为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.”实例在两者之间:

mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";

  (5)你也可以使用“{n}”“重复n次”操作符重写先前的查询:

mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";

 5、使用数据处理函数:

  常用的文本处理函数:

  left(str,len)    返回串左边的字符

select left("abcd",2);

  right(str,len)    返回串右边的字符

select right("abcd",1);

  length(str)    返回串的长度

select length("abcd");

  lower(str)     将串转换为小写

select lower('ABCD');

  upper(str)     将串转换为大写 

select upper('abcd');

  instr(str,substr)

  这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始)

select instr("substr","bs");    【返回 3】

  locate(substr,str)      locate(substr,str,pos) 

    第一个语法返回字符串 str中子字符串substr的第一个出现位置。第二个语法返回字符串 str中子字符串substr的第一个出现位置, 起始位置在pos。如若substr 不在str中,则返回值为0。 

SELECT LOCATE('bar', 'foobarbar');  【返回 4】
SELECT LOCATE('bar', 'foobarbar',5);  【返回 7】

  position(substr IN str) 

  返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substr 在 str 中不存在,返回值为 0。

SELECT POSITION('bar', ‘foobarbar');   【返回 4】

  ltrim(str)    去掉串左边的空格

select ltrim("  aac");

  rtrim(str)    去掉串右边的空格

select rtrim("  aac");

聚集函数如下表:

  
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和

 distinct与聚集函数:

  MySQL5.0.3以及之后的版本,聚集函数和distinct可以搭配使用,比如:

  ①对所有的行执行计算,指定all参数或不给参数(all是默认所有行为,不需要指定,如果不指定distinct,则假定为all);

  ②只包含不同的值,指定distinct参数;

  ③如果指定列名,则distinct只能用于count();distinct不能用于count(*),因此不允许使用count(distinct);distinct必须使用列名,不能用于计算或者表达式;

select avg(distinct prod_price) as avg_price from products where vend_id = 1003;

  这条SQL语句中,使用avg()函数返回vend列中vend_id=1003的对应的price平均价格,因为使用了distinct参数,因此平均值只考虑不同的值(唯一值)

组合聚集函数:
  select语句可以包含多个聚集函数,比如:

select count*as num_items,

          min(prod_price) as price_min,

          max(prod_price) as price_max,

          avg(prod_price) as price_avg

from products;

这条SQL语句,使用了单条select语句执行4个聚集计算,返回四个值(products表中items的数目、price的最高、最低以及平均值)

PS:在指定别名以包含某个聚集函数的结果时,不应该使用表中实际的列名;这样便于使用SQL更加容易和理解,以及排除方便排除错误。

6、group by 分组

  “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。

select 类别, sum(数量) as 数量之和
from A
group by 类别

  注:group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。(聚集函数上面已给出)

7、order by 排序

 (1)order by price  //默认升序排列
    (2)order by price desc //降序排列
    (3)order by price asc //升序排列,与默认一样
    (4)order by rand() //随机排列,效率不

8、having

   having子句可以让我们筛选成组后的各种数据,where子句在聚合前先筛选记录,也就是说作用在group by和having子句前。而 having子句在聚合后对组记录进行筛选。 

示例:

select 类别, sum(数量) as 数量之和 from A
group by 类别
having sum(数量) > 18

示例:Having和Where的联合使用方法

select 类别, SUM(数量)from A
where 数量 >8
group by 类别
having SUM(数量) >10

where和having的区别:

  作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。
  WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。(严格说来,你可以写不使用聚集的 HAVING 子句, 但这样做只是白费劲。同样的条件可以更有效地用于 WHERE 阶段。)
在上面的例子中,我们可以在 WHERE 里应用数量字段来限制,因为它不需要聚集。 这样比在 HAVING 里增加限制更加高效,因为我们避免了为那些未通过 WHERE 检查的行进行分组和聚集计算。

综上所述:
  having一般跟在group by之后,执行记录组选择的一部分来工作的。where则是执行所有数据来工作的。

9、limit  

  limit [offset,] N
  offset 偏移量,可选,不写则相当于limit 0,N
       N  取出条目

  示例:取价格第4-6高的商品

select good_id,goods_name,goods_price from goods order by good_price desc limit 3,3;

10、总结:

  select字句顺序

子句说明是否必须使用
select 要返回的列
from 要检索的表 仅从表中选择数据时使用
where 行级过滤
group by 分组说明 仅在按组计算聚集时使用
having 组级过滤
order by 输出排序顺序
limit 要检索的行数
原文地址:https://www.cnblogs.com/tg666/p/9526303.html