mysql之DQL

来源:互联网 发布:java游戏编程书 编辑:程序博客网 时间:2024/06/06 02:12
     数据查询语句
 
select 字段 as 别名 from 表达式 where 条件 group by 分组 having 分组条件 order by 排序 limit 限制 ;


输出项 包括 "表达式或字段或字段别名"
 
 字段或表达式 as 别名;
 
all 和distinct
  all 不消除重复 默认值
  distinct 消除重复
  
  from   数据源1,数据源2;
where字句 对数据源进行删选的字句
 算术运算符 + - * / %
 比较运算符 > >= < <= =(等于)
 比较运算符 and or not
select count(name) as 数量 from tab_option group by name having ;



is运算符: 空值和布尔值的判断
 
 
  xxx is  null
  xxx is not null;
  xxx is true
  xx  is false;
所谓bool值
      
between 运算符: 用于判断某个字段的数据值是否在某个给定的范围
     适用于数字类型;
       xx  between 值1 and 值2;
     含义:
  xx自读啊的值在给定"值1"和"值2"之间
  
     in 运算符:  给定确定数据的范围判断
      
 语法:
     xx in (值1,值2,值3,...)
 
like运算符: 模糊查询
语法:
   XX like 
     eg:select * from tab_option where name like 'y%' ;
实现对字符串的某种特征信息的模糊查找.
它其实依赖于2个特殊的"符号":
% : 它代表"任何个数的任何字符"
_ : 它代表"一个字符";
 
   nam like '%罗%';  表示name中 "罗" 这个字的所有数据行
name like '罗%';  // 以罗开头的所有数据行
name like '%罗';   // 以罗结尾的所有字符
一个新的问题:
   如果我要找某个字段中含"%"(或_)的行,怎么办? 
运用转义知识.
XX like %\%%';  表示XX中含有百分号(%)这个字符的所有行
\% 表示xx中的%号


                   group by 字句: 分组
形式:
  group by 字段1 [desc|asc], 字段2 [desc|asc],....
说明:
   1. 分组是对"前述"已经找出的数据(即 where子句 已经删选过的数据),按照某种标准
进行排序.
2. 标准就是指字段,即根据字段进行分组,可以同时指定其 "排序方式":
  desc:倒序,asc: 升序
什么叫做分组:
   分组的结果,一定要理解为:只有一个个组了

则结果是:在select语句中的"输出"部分,
只应该出现组信息,
不能说这个组的名称是什么,
也不能说他的价格,
也不能说出它的类型,

但可以确定
 select 组信息1,组信息2,... from 数据源 group by 字段;
 
 我们可以对组信息进行
   最大值: max(字段名);
最小值: min(字段名);
平均值: avg(字段名);
cunt(*):每一组的个数
   sum : 求和
     对组的删选
 
 having的作用跟where完全一样,
 但其只对"分组的结果数据"进行删选;
 
 eg:  
     select pingpai,count(*) as 数量,max(price) as 
 最高价,min(price) as 最低价 avg(price) as 平均价
 from product  group by pingpai having count(*)>2
 
             


         order by 子句
         
         它用于将前面"取得"的数据以设定的标准(字段)来进行排序以输出结果
          
形式:
     order by 字段 [asc|desc]
     
     说明:
       1, 对前面的结果数据以指定的一个或多个字段排序;
       2. 多个字段的排序,都是在前一个字段排序基础上,如果还有"相等值",就继续以后后续字段.
      
 
 
      limit 子句
  
含义:
  它用于将"前述取得的数据", 按指定的行取出来
  形式:
       limit 起始行号,要取出的行数.
       说明:
       1. 起始行号都是从0开始算起;
2. 起始行号跟数据中的任何一个字段,没有关系
3. 要取出的行数也是一个数字
4. 有一个简略形式:limit 行数,表示直接从第0行开始
 
对整个select语句的一些总结


        从from的数据源中获得"所有数据",然后使用where对这些数据进行"筛选",然后对筛选的数据进行
分组 ,having负责在这些分组中,挑选出一组合适的数据,order by 对这些分组的数据进行排序,将排序过后的数据源
进行挑选出指定的行数,这是最终的数据源,然后from前面的对这个最终的数据源进行处理.
     


                             连接查询
    基本概念:
      就是将两个或两个以上的表,"连接起来",当做一个数据源,并从中取得所需要的数据
    到底怎么连接?
  
  对接完的行个数 =  表1的行数 X 表2的行数
 
    select * from 表1,表2;
select * from 表1 join 表2;
select * from 表1 cross join 表2;


连接的基本形式
  表1 [链接形式] join 表2 [on 连接条件]
  
如果是3个表,则进一步 扩展为:
  表1 [连接形式] join 表2 [on 连接条件] [连接形式] join 表3 [on 连接条件];
  
  
  
  交叉连接:
        对于表1(n1个字段,n2行),表2(m个字段,m2行)
  n1+m1个列;
  n2*m2个列;
内连接:
    select * from inner join 表2 on 连接条件
 
内连接就是找出普通连接中有效的数据.
 
select * from product inner join product_type on product product.typeid = product_type.id;
结果就将普通连接中的无效数据连接在一起了.
而连接条件,就是,我们之前所设置的外键.
但并不是有外键才能使用
 
 
 
 
 
 

左外连接:
   
含义就是将两个表的内连接结果,再"加上"左边表的不符合内连接所设定
的条件 的条目.
形式:
  表1 (左边) left outer join 表2(右边) on 连接条件
  

右外连接:
      表1 (左边) right outer join 表2(右边) on 连接条件
            结果集是,表1和表2的内连结果 + 右边表中没有匹配上的数据项


全外连接:
   mysql 不支持
  即内连接结果 + 左表中不匹配的数据 + 右表中不匹配的数据.
  
  
  
  
  
子查询
  
         基本含义:
    一个select语句,就是一个查询语句;
        
        select 字段或表达式 from 数据源 where xx 条件判断;



       可以在下面这集中奇光下出现子查询
      select 字查询 from 子查询 wher 子查询 
  

exists 的查询
          
            形式:
                where exists(子查询);
            含义:
                该子查询如果有"数据", 则exists的结果是true


        联合查询: union
 

   基本概念:
   将两个查询语句的结果,以 "上下堆叠"的方式,合并为一个查询结果


   语法形式:
    select  语句1
union [all | distinct]
select 语句2
 
 
自动消除重复行,默认是distinct的
 
如果想要将所有数据都显示(允许重复行),就用
all.
 
select * from join2 
union
select * from join1 order by id2 desc;
正确的和order by使用.

 
   
     
  
  
  
  
  
  
       
   
       

 
 

 

 
     
       
0 0
原创粉丝点击