当前位置: 代码迷 >> MySQL >> 【六】mysql数据查询语言DQL(Data Query Language)①
  详细解决方案

【六】mysql数据查询语言DQL(Data Query Language)①

热度:260   发布时间:2016-05-05 16:21:05.0
【6】mysql数据查询语言DQL(Data Query Language)①

1. 基本查询

select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];

SELECT 8+5;# 8+58>5是表达式SELECT name,8>5,8+5,id+class_id,NOW(),CONCAT('a','b','c') FROM stu;

1.1 all和 distinct

用于设定select出来的数据,是否消除“重复行”,可以不写,那就是默认值all:
all:表示不消除,即所有都出来,默认值;
distinct:表示消除重复行;
这里写图片描述

1.2 from子句

from子句表示select语句从中“取得”数据的数据源——其实就是表。
通常,其后面就是表名; 比如: from table1,
但,也可能是其他一些数据来源;from table1,table2(连接表);

#查询学生表stu的所有数据SELECT  *  FROM stu;

1.3 where子句

  1. where子句就是对from子句中的“数据源”中的数据进行筛选的条件设定,筛选的机制是“一行一行进行判断”,其作用,几乎就跟各种语言中if语句的作用一样。
  2. where子句依赖于from子句
  3. where子句中,通常都需要使用各种“运算符”:
    ①算术运算符: + - * / %
    ②比较运算符: >, >= , < , <= , =(等于) , < >(不等于) , ==(等于) , !=(不等于)
    ③逻辑运算符: and or not
#查询学生表中班级号为偶数的学生信息SELECT  *  FROM stu WHERE class_id % 2 = 0;#查询学生表中班级号>=学生信息SELECT  *  FROM stu WHERE class_id >= 2;#查询学生表中班级号不等于2的学生信息SELECT  *  FROM stu WHERE class_id <> 2;#查询学生表中班级号等于1 或者班级号等于2的学生信息SELECT  *  FROM stu WHERE class_id = 1 or class_id = 2;#查询学生表中性别不是男的学生信息SELECT  *  FROM stu WHERE not (gender = '男');#查询学生表中班级号为3且性别为女的学生信息SELECT  *  FROM stu WHERE class_id = 3 and gender = '女';

4.where后面为 true 或 false

#查询所有学生的信息SELECT *  from stu WHERE true;#结果集为空SELECT * from stu WHERE false;

5.is 运算符

#判断name字段是"null"值  -- 就是没有值;select * from stu name is  null;# field is  not  null:判断某个字段不是“null”值# field is  true:判断某个字段为"真"true)# field is  false:判断某个字段为"假"false):00.0,  '',  null 这几个值都为false

6.between运算符:范围判断

#查询学生表中班级号范围为[1,2] 也就是班级号大于等于1且班级号小于等于2SELECT * from stu where class_id BETWEEN 1 AND 2;#等价于上一句SELECT SELECT * from stu where class_id >=1 and  class_id <= 2;

7.in运算符:给定确定数据的范围判断
field in(1,8,3);
表示字段值为所列出的这些值中的一个,就算是满足了条件;这些值,通常是零散无规律的

SELECT * from stu where class_id in(1,8,3);

这里写图片描述

8.like运算符:对字符串进行模糊查找
实现对字符串的某种特征信息的模糊查找。它其实依赖于以下2个特殊的“符号”:
%:它代表“任何个数的任何字符”;
_ :(下杠),它代表“一个任何字符”;

address like ‘%广州%’: 表示address中包含’广州’这一个字的所有数据行;比如: 你知道广州吗 广州天河
address like ‘广州%’: 表示address中以’广州’开头的所有数据行;比如:广州人民,广州欢迎你来
address like ‘%广州’: 表示address中以’广州’结尾的所有数据行;比如:广东广州,中国城市广州
address like ‘广州_’: 表示address中以’广州’开头并只有3个字符的所有数据行;比如:广州市
address like ‘_广州’: 表示address中以’广州’结尾并只有3个字符的所有数据行;比如:去广州

如果字符串中含有 “%” 或者 “_” 那么就需要进行转义
\% 就代表 % 本身
\_ 就代表 _ 本身

SELECT * from stu WHERE name LIKE '张%';SELECT * from stu WHERE name LIKE '_三';

1.4 group by 子句:分组

形式:

group by 字段1 【desc | asc】, 字段2 【desc | asc】, …

说明:
1,分组是对“前述”已经找出的数据(也可能是where已经筛选过了)按照指定的依据(字段)进行分组;
2,同时,该分组结果,可以同时指定其“排序方式”:desc(倒序),asc(顺序);
3,分组的依据可以是2个或者2个以上字段,但是通常的应用只用一个分组依据。

注意: 分组之后,通常只有如下几种可用的“组信息”了(即可以出现在select中):
1,分组依据本身的信息,其实就是该分组依据的字段名;
2,每一组的“数量”信息:就是用count(*)获得;
3,原来数据中的“数值类型字段的聚合信息”,包括如下几个:
最大值: max(字段名)
最小值: min(字段名)
平均值: avg(字段名)
总和值: sum(字段名)

产品表:product 有如下数据:
这里写图片描述

#不会报错是因为mysql比较宽松的语法SELECT * from product GROUP BY chandi;

正确的写法:

SELECT pinpai,count(*) as 品牌的产品数量 ,max(price) as 最高价,min(price) as 最低价, avg(price) as 平均价,sum(price) as 总价格  from product GROUP BY pinpai;

这里写图片描述

1.5 having 子句

having对分组之后的数据行进行筛选,having子句的出现依赖于group by子句。
①找出品牌中产品平均价格超过5000的品牌

SELECT    pinpai,    avg(price) AS 平均价FROM    productGROUP BY    pinpaiHAVING    平均价 > 5000;

这里写图片描述
②找出品牌中产品数量大于2的品牌

SELECT    pinpai,    count(*) AS 品牌的产品数量FROM    productGROUP BY    pinpaiHAVING 品牌的产品数量 > 2;

这里写图片描述

1.6 order by 子句

用于将前面“取得”的数据以设定的依据(字段)来进行排序以输出结果。

order by 字段1 【asc | desc】, 字段2 【asc | desc】,…
1,对前面的结果数据以指定的一个或多个字段排序;
2,排序可以谁定正序(asc,默认值)或倒序(desc);
3,多个字段的排序,都是在前一个字段排序基础上,如果还有“相等值”,才继续以后续字段排序,如果按前面的字段排序结果每个值都不相等,后续的字段排序没有任何意义。

#查询所有学生信息,按照班级号倒序排,班级号相同的按照学生ID升序排序SELECT * FROM stu ORDER BY class_id desc,id asc;

这里写图片描述

1.7 limit 子句

用于将“前述取得的数据”,按指定的行取出来:从第几行开始取出多少行,行号是从0开始;
limit n; 等价于 limit 0 , n;

SELECT *  from stu ORDER BY class_id desc LIMIT 3;SELECT *  from stu ORDER BY class_id desc LIMIT 0,3;#因为下标是0开始的,实际上是从第三行算起(包括第三行)取出3条数据SELECT *  from stu ORDER BY class_id desc LIMIT 2,3;
  相关解决方案