zoukankan      html  css  js  c++  java
  • mysql DQL语言操作

    SQL语句的执行顺序:from-where-group by-having-select-order by

    where 可以筛选多个条件,如 where  A and B

    1.排序
    order by 列名  asc|desc
    asc:升序排列 默认就是升序 所以可以省略
    desc:降序排列
    永远sql语句的最后

    2.distinct 去除重复,只能指定一个字段,指定多个字段是distinct无效

    无效:SELECT DISTINCT price,pname FROM product ORDER BY price

    有效:SELECT DISTINCT price FROM product ORDER BY price


    3.alter table 从表 add constraint 外键名(自定义) foreign key 从表(列名)
    references 主表(列名);

    4.如果时间的类型是date,则使用符号比较大小
    SELECT empno,ename,hiredate FROM emp WHERE hiredate > '1981-02-01'
    AND hiredate < '1987-05-01'
    l  简单查询

        去除重复数据

        Select distinct  *|列名,列名  from  表  where 条件

        别名(as可以省略)

        Select *  from  product as  p

        Select   pname        as  pn  from product

        查询结果是表达式(运算查询):将所有商品的价格+10元进行显示

        select  pname,price+10  from  product;
    l  条件查询

    比较运算符
        

    >  <  <=   >=   =  <>
        

    大于、小于、大于(小于)等于、不等于

    BETWEEN  ...AND...
        

    显示在某一区间的值(含头含尾)

    IN(set)
        

    显示在in列表中的值,例:in(100,200)

    LIKE ‘张pattern’
        

    模糊查询,Like语句中,

    %代表零个或多个任意字符,

    _代表一个字符,

    例如:first_name like ‘_a%’;

    IS NULL
        

    判断是否为空

    逻辑运算符
        

    and
        

    多个条件同时成立

    or
        

    多个条件任一成立

    not
        

    不成立,例:where not(salary>100);

    #查询商品价格在200到1000之间所有商品

    SELECT * FROM product WHERE price >= 200 AND price <=1000;

    SELECT * FROM product WHERE price BETWEEN 200 AND 1000;

     

    #查询商品价格是200或800的所有商品

    SELECT * FROM product WHERE price = 200 OR price = 800;

    SELECT * FROM product WHERE price IN (200,800);

     

    #查询含有'霸'字的所有商品

    SELECT * FROM product WHERE pname LIKE '%霸%';

     

    #查询以'香'开头的所有商品

    SELECT * FROM product WHERE pname LIKE '香%';

     

    #查询第二个字为'想'的所有商品

    SELECT * FROM product WHERE pname LIKE '_想%';

     

    #商品没有分类的商品

    SELECT * FROM product WHERE category_id IS NULL

     

    #查询有分类的商品

    SELECT * FROM product WHERE category_id IS NOT NULL
    l  排序查询

    #通过order by语句,可以将查询出的结果进行排序。

        SELECT * FROM 表名 ORDER BY 排序字段 ASC|DESC;

    #在价格排序(降序)的基础上,以分类排序(降序)

        SELECT * FROM product ORDER BY price DESC,category_id DESC;

    #显示商品的价格(去重复),并排序(降序)

        SELECT DISTINCT price FROM product ORDER BY price DESC;
    l  聚合查询

    之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。

    今天我们学习如下五个聚合函数:

        count:统计指定列不为NULL的记录行数;

        sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

        max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

        min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

        avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

     

    l  查询分类为'c001'的所有商品价格的总和

       SELECT SUM(price) FROM product WHERE category_id = 'c001';

    l  查询分类为'c002'所有商品的平均价格

      SELECT AVG(price) FROM product WHERE category_id = 'c002';

    l   查询商品的最大价格和最小价格

      SELECT MAX(price),MIN(price) FROM product;
    l  分组查询

    分组查询是指使用group by字句对查询信息进行分组。

    格式:

        SELECT 字段1,字段2… FROM 表名 GROUPBY分组字段 HAVING 分组条件;

        分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。

            

    having与where的区别:

         having是在分组后对数据进行过滤.

         where是在分组前对数据进行过滤

              having后面可以使用分组函数(统计函数)

              where后面不可以使用分组函数。

    1 统计各个分类商品的个数

        SELECT category_id ,COUNT(*) FROM product GROUP BY category_id ;

    2 统计各个分类商品的个数,且只显示个数大于1的信息

        SELECT category_id ,COUNT(*) FROM product GROUP BY category_idHAVING COUNT(*) > 1;
    l  外键约束

    l  声明外键约束        

    语法:alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);

    [外键名称]用于删除外键约束的,一般建议“_fk”结尾

        altertable 从表 drop foreignkey 外键名称

    l  使用外键目的:

        保证数据完整性

     
    l  多表查询

    SQL语句的执行顺序:from-where-group by-having-select-order by

    1.        交叉连接查询(基本不会使用-得到的是两个表的乘积) [了解]

              语法:select *from A,B;

    2.        内连接查询(使用的关键字 inner join  -- inner可以省略)

               隐式内连接:select* from A,B where 条件;

               显示内连接:select* from A inner join B on 条件;

    3.        外连接查询(使用的关键字 outer join -- outer可以省略)

              左外连接:leftouter join

                  select * from A left outer join B on 条件;

              右外连接:rightouter join

                  select * from A right outer join B on 条件;

    三种连接的区别:

    例如:

    CREATE TABLE category (

      cidVARCHAR(32) PRIMARY KEY ,

      cnameVARCHAR(50)

    );

    CREATE TABLE products(

      pidVARCHAR(32) PRIMARY KEY ,

      pnameVARCHAR(50),

      price INT,

      flagVARCHAR(2),              #是否上架标记为:1表示上架、0表示下架

      category_idVARCHAR(32),

      CONSTRAINTproducts_fk FOREIGN KEY (category_id) REFERENCES category (cid)

    );

     

    #分类

    INSERT INTO category(cid,cname) VALUES('c001','家电');

    INSERT INTO category(cid,cname) VALUES('c002','服饰');

    INSERT INTO category(cid,cname) VALUES('c003','化妆品');

    #商品

    INSERT INTO products(pid,pname,price,flag,category_id) VALUES('p001','联想',5000,'1','c001');

    INSERT INTO products(pid,pname,price,flag,category_id) VALUES('p002','海尔',3000,'1','c001');

    INSERT INTO products(pid,pname,price,flag,category_id) VALUES('p003','雷神',5000,'1','c001');

     

    INSERT INTO products (pid,pname,price,flag,category_id) VALUES('p004','JACK JONES',800,'1','c002');

    INSERT INTO products (pid,pname,price,flag,category_id) VALUES('p005','真维斯',200,'1','c002');

    INSERT INTO products (pid,pname,price,flag,category_id) VALUES('p006','花花公子',440,'1','c002');

    INSERT INTO products (pid, pname,price,flag,category_id)VALUES('p007','劲霸',2000,'1','c002');

     

    INSERT INTO products (pid,pname,price,flag,category_id) VALUES('p008','香奈儿',800,'1','c003');

    INSERT INTO products (pid,pname,price,flag,category_id) VALUES('p009','相宜本草',200,'1','c003');

     

    #1.查询哪些分类的商品已经上架

    #隐式内连接

    SELECT DISTINCT c.cname FROM category c , productsp

        WHEREc.cid = p.category_id AND p.flag = '1';

     

    #内连接

    SELECT DISTINCT c.cname FROM category c

        INNER JOINproducts p ON c.cid = p.category_id

        WHEREp.flag = '1';

     

    #2.查询所有分类商品的个数

    #左外连接

    INSERT INTO category(cid,cname) VALUES('c004','奢侈品');

    SELECT cname,COUNT(category_id) FROM category c

         LEFT OUTER JOIN products p

            ONc.cid = p.category_id

        GROUP BYcname;

     
    l  子查询

    子查询:一条select语句结果作为另一条select语法一部分(查询条件,查询结果,表等)。

    select ....查询字段 ... from ... 表.. where ...查询条件

     

    #3 子查询,查询“化妆品”分类上架商品详情

    #隐式内连接

    SELECT p.* FROM products p , category c

        WHEREp.category_id=c.cid AND c.cname = '化妆品';

     

    #子查询

    ##作为查询条件

    SELECT * FROM products p

        WHEREp.category_id =

        (

            SELECTc.cid FROM category c

                WHEREc.cname='化妆品'

        );

        ##作为另一张表

        SELECT * FROM products p ,

                (SELECT * FROM category WHERE cname='化妆品') c

            WHERE p.category_id = c.cid;    

     

    #查询“化妆品”和“家电”两个分类上架商品详情

    SELECT * FROM products p

        WHEREp.category_id in

        (

            SELECTc.cid FROM category c

                WHEREc.cname='化妆品' or c.name='家电'
    )

  • 相关阅读:
    嵌入式培训学习历程第二十四天
    嵌入式培训学习历程第二十三天
    嵌入式培训学习历程第二十二天
    嵌入式培训学习历程第二十一天
    嵌入式培训学习历程第二十天
    嵌入式培训学习历程第十九天
    嵌入式培训学习历程第十八天
    嵌入式培训学习历程第十七天
    嵌入式培训学习历程第十六天
    系统编程之进程的创建.僵尸与孤儿进程
  • 原文地址:https://www.cnblogs.com/kingle-study/p/9967350.html
Copyright © 2011-2022 走看看