美文网首页
PHP -- 数据库4 -- select的五种字句

PHP -- 数据库4 -- select的五种字句

作者: 潘肚饿兵哥哥 | 来源:发表于2019-08-13 23:28 被阅读0次

    \color{rgba(254, 67, 101, .8)}{创建一个表goods}

    create table `goods`(
        `goods_id` mediumint(8) unsigned not null auto_increment,
        //auto_increment主键自增长
        `cat_id` smallint(5) unsigned not null default '0',
        //smallint: 从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据
        `goods_sn` varchar(60) not null default '' unique,
        `goods_name` varchar(120) not null default '',
        `click_count` int(10) unsigned not null default '0',
        //unsigned 无符号
        `goods_number` smallint(5) unsigned not null default '0',
        `market_price` decimal(10, 2) unsigned not null default '0.00',
        //decimal 所有数位10位,小数部分2位
        `shop_price` decimal(10, 2) unsigned not null default '0.00',
        `add_time` int(10) unsigned not null default '0',
        `is_best` tinyint(1) unsigned not null default '0',
        //tinyint(1) 显示长度1
        `is_new` tinyint(1) unsigned not null default '0',
        `is_hot` tinyint(1) unsigned not null default '0',
        primary key (`goods_id`) 
        ) engine=myisam default charset=utf8;
    

    \color{rgba(254, 67, 101, .8)}{数据:}

    insert into goods
    values
    (1, '4', 'ECS000000', 'KD876', '25', '1', '1665.6', '1388', '1240902890', '1', '1', '1'),
    (4, '8', 'ECS000004', '诺基亚N85原装充电器', '0', '17', '69.6', '58', '1241422402', '0', '0', '0'),
    (3, '8', 'ECS000002', '诺基亚原装5800耳机', '3', '24', '81.6', '68', '1241422082', '0', '0', '0'),
    (5, '11', 'ECS000005', '索爱原装M2卡读卡器', '3', '8', '24', '20', '1241422518', '1', '1', '0'),
    (6, '11', 'ECS000006', '盛创KINGMAX内存卡', '0', '15', '50.4', '42', '1241422573', '0', '0', '0'),
    (7, '8', 'ECS000007', '诺基亚N85原装立体声耳机', '0', '20', '120', '100', '1241422785', '0', '0', '0'),
    (8, '3', 'ECS000008', '飞利浦9@9v', '16', '1', '478.79', '399', '1241425512', '1', '1', '1'),
    (9, '3', 'ECS000009', '诺基亚E66', '88', '100', '2757.6', '2298', '1241511871', '1', '1', '1'),
    (10, '3', 'ECS000010', '索爱C702c', '12', '7', '1593.6', '1328', '1241965622', '0', '0', '1'),
    (11, '3', 'ECS000011', '索爱C702c', '0', '1', '0', '1300', '1241966951', '0', '0', '0'),
    (12, '3', 'ECS000012', '摩托罗拉A810', '14', '8', '1179.6', '983', '1245297652', '0', '1', '0'),
    (13, '3', 'ECS000013', '诺基亚5320 XpressMusic', '13', '8', '1573.2', '1311', '1241967762', '0', '0', '1'),
    (14, '4', 'ECS000014', '诺基亚5800XM', '6', '1', '3150', '2625', '1241968492', '0', '1', '1'),
    (15, '3', 'ECS000015', '摩托罗拉A810', '8', '3', '945.6', '788', '1241968703', '0', '1', '1'),
    (16, '2', 'ECS000016', '恒基伟业G101', '3', '0', '988', '823.33', '1241968949', '0', '0', '0'),
    (17, '3', 'ECS000017', '夏新N7', '9', '1', '2760', '2300', '1241969394', '1', '0', '1'),
    (18, '4', 'ECS000018', '夏新T5', '0', '1', '3453.6', '2878', '1241969533', '0', '0', '0'),
    (19, '3', 'ECS000019', '三星SGH-F258', '10', '12', '1029.6', '858', '1241970139', '1', '1', '1'),
    (20, '3', 'ECS000020', '三星BC01', '15', '12', '336', '280', '1241970417', '1', '1', '1'),
    (21, '3', 'ECS000021', '金立 A30', '4', '40', '2400', '2000', '1241970634', '0', '0', '0'),
    (22, '3', 'ECS000022', '多普达Tuch HD', '18', '40', '7198.8', '5999', '1241971076', '1', '1', '0'),
    (23, '5', 'ECS000023', '诺基亚N96', '17', '8', '4440', '3700', '1241971488', '1', '1', '0'),
    (24, '3', 'ECS000024', 'P806', '38', '100', '2400', '2000', '1241971981', '1', '1', '1'),
    (25, '13', 'ECS000025', '小灵通/固话50元充值卡', '0', '2', '57.59', '48', '1241972709', '1', '0', '1'),
    (26, '13', 'ECS000026', '小灵通/固话20元充值卡', '0', '2', '22.8', '19', '1241972789', '0', '0', '1'),
    (27, '15', 'ECS000027', '联通100元充值卡', '0', '2', '100', '95', '1241972894', '1', '1', '1'),
    (28, '15', 'ECS000028', '联通50元充值卡', '0', '0', '50', '45', '1241972976', '0', '0', '1'),
    (29, '14', 'ECS000029', '移动100元充值卡', '0', '0', '0', '90', '1241973022', '1', '0', '1'),
    (30, '14', 'ECS000030', '移动20元充值卡', '1', '9', '21', '18', '1241973114', '1', '0', '1'),
    (31, '3', 'ECS000031', '摩托罗拉E8', '5', '1', '1604.39', '1337', '1242110412', '0', '0', '0'),
    (32, '3', 'ECS000032', '诺基亚N85', '11', '4', '3612', '3010', '1242110760', '0', '1', '1')
    ;
    

    \color{rgba(254, 67, 101, .8)}{连接数据库查询数据:}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
        $sql = "select * from goods";
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));//接收查询到的数据,如果出错返回错误信息
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
        echo '<pre>';//pre标签:格式化输出
        print_r($list);
        echo '</pre>';
    

    \color{rgba(254, 67, 101, .8)}{返回值是一个数组}

    image.png

    \color{rgba(254, 67, 101, .8)}{也可以这样输出}

        $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
        $sql = "select * from goods";//查询所有行所有列
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));//接收查询到的数据,如果出错返回错误信息
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
        //mysqli_fetch_all从结果集中取得所有行作为关联数组
    
        // 此时$list是一个二维数组,索引数组嵌套关联数组,索引是一共有多少项的数据
        //而其中嵌套的是每一项的具体列,相当于每一行是数组的一项
        //而其中嵌套的是每一行的具体内容,所以下面要用foreach循环取值
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
            //将数组$list的项分别赋给$goods,此时$goods会变成一堆不带索引的数据
            //类型是字符串,不再是一个数组
            echo '<tr>';
            foreach($goods as $item){//再将每一个$goods的值赋给$item,并输出
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
    

    \color{rgba(254, 67, 101, .8)}{在浏览器中显示:}

    image.png

    \color{rgba(254, 67, 101, .8)}{之前这样的查法是查询所有,不实用,下面的条件查询才是常用的方法}


    \color{rgba(254, 67, 101, .8)}{where查询:比较运算}
    \color{rgba(254, 67, 101, .8)}{查询售价大于2000的商品}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
        // $sql = "select * from goods"; 查询所有行所有列
        $sql = "select * from goods where shop_price > 2000";//之前查询所有的范围太广,现在查询售价大于2000的
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));//接收查询到的数据,如果出错返回错误信息
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
        //mysqli_fetch_all从结果集中取得所有行作为关联数组
    
        // 此时$list是一个二维数组,索引数组嵌套关联数组,索引是一共有多少项的数据
        //而其中嵌套的是每一项的具体列,相当于每一行是数组的一项
        //而其中嵌套的是每一行的具体内容,所以下面要用foreach循环取值
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
            //将数组$list的项分别赋给$goods,此时$goods会变成一堆不带索引的数据
            //类型是字符串,不再是一个数组
            echo '<tr>';
            foreach($goods as $item){//再将每一个$goods的值赋给$item,并输出
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
       
    
    image.png

    \color{rgba(254, 67, 101, .8)}{where查询:比较运算in}
    \color{rgba(254, 67, 101, .8)}{查询分类在3,4,11里的商品}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
    
        //查询分类cat_id在3, 4,11里的商品
        //这里不能用and,没有商品既在3里也在4里也在11里
        // $sql = "select * from goods where cat_id=3 or cat_id=4 or cat_id=11";
        //上面的写法太麻烦,每一项都要写一遍,下面用  in  的写法更简练
    //括号里的数顺序没有要求,谁在前谁在后都可以,这是一个集合
        $sql = "select * from goods where cat_id in(3, 4, 11)";
        
    
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));//接收查询到的数据,如果出错返回错误信息
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
        //mysqli_fetch_all从结果集中取得所有行作为关联数组
    
        // 此时$list是一个二维数组,索引数组嵌套关联数组,索引是一共有多少项的数据
        //而其中嵌套的是每一项的具体列,相当于每一行是数组的一项
        //而其中嵌套的是每一行的具体内容,所以下面要用foreach循环取值
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
            //将数组$list的项分别赋给$goods,此时$goods会变成一堆不带索引的数据
            //类型是字符串,不再是一个数组
            echo '<tr>';
            foreach($goods as $item){//再将每一个$goods的值赋给$item,并输出
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
    
    image.png

    \color{rgba(254, 67, 101, .8)}{where查询:逻辑运算}
    \color{rgba(254, 67, 101, .8)}{sql查询是从右往左的,所以越小的条件越往右放,减少查询范围}
    \color{rgba(254, 67, 101, .8)}{查询价格在2000 - 3000 之间的商品}
    \color{rgba(254, 67, 101, .8)}{between是带等号的,包含边界值,且较大的值在后}

    between a and b
    等价于[a, b ]且 b>a
    等价于>=a and <=b

    not between a and b
    等价于 a<= or >=b

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
        $sql = "select * from goods where shop_price between 2000 and 3000";
    //查询售价在2000 - 3000之间的
    //not between 2000 and 3000 就是查询价格不在2000 - 3000之间的
    //等价于:where shop_price>=2000 and shop_price<=3000;
    
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));//接收查询到的数据,如果出错返回错误信息
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
        //mysqli_fetch_all从结果集中取得所有行作为关联数组
    
        // 此时$list是一个二维数组,索引数组嵌套关联数组,索引是一共有多少项的数据
        //而其中嵌套的是每一项的具体列,相当于每一行是数组的一项
        //而其中嵌套的是每一行的具体内容,所以下面要用foreach循环取值
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
            //将数组$list的项分别赋给$goods,此时$goods会变成一堆不带索引的数据
            //类型是字符串,不再是一个数组
            echo '<tr>';
            foreach($goods as $item){//再将每一个$goods的值赋给$item,并输出
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
    

    \color{rgba(254, 67, 101, .8)}{模糊查询(关键字模糊查询):like、not like}
    \color{rgba(254, 67, 101, .8)}{用\%通配0个或多个字符 like '关键字'}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());
    //连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
    
        //查询包含三星的商品
        //goods_id, cat_id, goods_name, shop_price是会显示的项,goods_name是要查询的项
        //如果明确知道关键字前后有几个字符,或者确认要查有几个字符的项,用下划线 _
        //一条下划线表示一个字符,少一个多一个都不行
        //like '三星____' 表示查询关键字为三星,前面没有字符,后面有四个字符的项
        $sql = "select goods_id, cat_id, goods_name,
     shop_price from goods where goods_name like '%三星%'";
        
    
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));
    //接收查询到的数据,如果出错返回错误信息
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
        //mysqli_fetch_all从结果集中取得所有行作为关联数组
    
        // 此时$list是一个二维数组,索引数组嵌套关联数组,索引是一共有多少项的数据
        //而其中嵌套的是每一项的具体列,相当于每一行是数组的一项
        //而其中嵌套的是每一行的具体内容,所以下面要用foreach循环取值
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
            //将数组$list的项分别赋给$goods,此时$goods会变成一堆不带索引的数据
            //类型是字符串,不再是一个数组
            echo '<tr>';
            foreach($goods as $item){//再将每一个$goods的值赋给$item,并输出
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
       
    
    image.png

    \color{rgba(254, 67, 101, .8)}{1.where 条件查询}
    \color{rgba(254, 67, 101, .8)}{2.group by分组查询}
    \color{rgba(254, 67, 101, .8)}{3.having筛选}
    \color{rgba(254, 67, 101, .8)}{4.order by排序}
    \color{rgba(254, 67, 101, .8)}{5.limit限制结果条数}


    \color{rgba(254, 67, 101, .8)}{1.where 条件查询}

    比较运算符:
        等于      =
        不等于     != 或者 <>
        小于      <
        小于等于        <=
        大于(等于)      >(=)
        大于等于        >=
        是否在某集合内 in  (等于in(a,b,...,n)中的任意一个值)   not in
             
        在某个范围内  between...and   (取值在between a and b 之间  [a,  b]
           取值相当于>=a    b<=    并且必须b>=a)
        不在某个范围内 not between ... and(用的比较少)
    
    逻辑运算符:
        逻辑非     NOT 或 !
        逻辑或     OR 或 ||
        逻辑与     AND 或 &&
     模糊查询:
        用部分关键字进行查询:
        像       like       
        用法:列 like '关键词'
        not like(查询不包含他的数据)一般不用,查询范围太广了
        
        like中有通配符的概念:
        通配任意字符  %   (like(%诺基亚%))
        %代表匹配关键字前后的内容(0或多个字符,如果明确的知道前或后没有关键字了,就不用写%了)
        通配单个字符  _   (like(三星__))
            几条下划线对应几个字符,多一个少一个都不行,因为过于确定,所以用得少,一般用%的时候多一些
    
    

    \color{rgba(254, 67, 101, .8)}{2.group by 分组查询 }

    group by 列1, 列2...

    运用在统计场合
        五个统计函数:
    总数count(*)   求总数 跟列没有关系  计算一共有多少行例如一共有多少件商品
    最大值max(列)  取某一列具体项的最大值,例如商品价格这一栏中的,最高价是多少
    最小值min(列)  
    平均值avg(列)  
    总和max(列)
    max是求具体项中数据的和,而count是统计有多少项
        (这些统计函数可以单独存在,并不是非要在group by里使用)
            求最大:   max   select max(goods_price) from goods;
                            select * from goods where goods_price =  select max(goods_price) from goods
                            select cat_id,max(goods_price) from goods group by cat_id;
            求最小:  min()
            求总和:  sum    select sum(goods_number) from goods;
            求平均:  avg    select avg(goods_price) from goods;
            求总数:  count  select count(*) from goods;
        可以给列或者计算结果取别名:as    (select cat_id sum(goods_number * goods_price) as ht from goods group by cat_id;)
    
    

    \color{rgba(254, 67, 101, .8)}{分组查询代码:}

    \color{rgba(254, 67, 101, .8)}{count查询结果:}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
    
        //查询一共有多少商品
        $sql = "select count(*) from goods";//返回值 31 
        
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));//接收查询到的数据,如果出错返回错误信息
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
        //mysqli_fetch_all从结果集中取得所有行作为关联数组
    
        // 此时$list是一个二维数组,索引数组嵌套关联数组,索引是一共有多少项的数据
        //而其中嵌套的是每一项的具体列,相当于每一行是数组的一项
        //而其中嵌套的是每一行的具体内容,所以下面要用foreach循环取值
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
            //将数组$list的项分别赋给$goods,此时$goods会变成一堆不带索引的数据
            //类型是字符串,不再是一个数组
            echo '<tr>';
            foreach($goods as $item){//再将每一个$goods的值赋给$item,并输出
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
    
    image.png

    \color{rgba(254, 67, 101, .8)}{用别名输出:as 别名}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
    
        $sql = "select count(*) as total, max(shop_price),min(shop_price) from goods";
        //count(*) as total,就是给count(*)取一个别名,as后面就是取得别名
      //显示在浏览器中的话,更能看出来是什么意思
      //没有别名就会直接显示 count(*)就不知道这个计算出来的总和具体代表什么
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
        print_r($list);
    
    image.png image.png

    \color{rgba(254, 67, 101, .8)}{别名可以用as}
    \color{rgba(254, 67, 101, .8)}{也可以用空格分开:}
    \color{rgba(254, 67, 101, .8)}{别名可以是中文:}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
    
        $sql = "select count(*) as '商品总数', max(shop_price) '最高价',min(shop_price) '最低价' from goods";
        
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
        print_r($list);
    
    image.png image.png

    \color{rgba(254, 67, 101, .8)}{分组统计:}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
    
        //按cat_id(商品分类)进行分组,并且显示这个分类里一共有多少件商品、最高价、最低价
        //select后面的字段只能出现要分组的列的字段,如此例只能出现cat_id,否则会报错
        //后面的是字段就只能是统计函数
        $sql = "select cat_id, count(*), max(shop_price), min(shop_price) from goods group by cat_id";
        
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
           
            echo '<tr>';
            foreach($goods as $item){
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
    
    image.png

    \color{rgba(254, 67, 101, .8)}{3.having 筛选 }
    \color{rgba(254, 67, 101, .8)}{从临时提出来的项中筛选一部分}

    having也可以和where一样做比较运算、逻辑运算和模糊查询
    他们的不同点在于:having的条件里出现的内容必须是前面查询条件设定好的项
    就是select后面列出来的项
    如果是where的话,就跟前面的项无关
    
    算出挂科超过两科(包括两科)学生的平均分
    
    create table stu (name varchar(10),class varchar(10),score tinyint);
     
    insert stu
    (name,class,score)
    values
    ("zhangsan","shuxue",50),
    ("zhangsan","dili",40),
    ("zhangsan","shuxue",90),
    ("lisi","yuwen",55),
    ("lisi","zhengzhi",45),
    ("wangwu","zhengzhi",30);
     
    select name,avg(score) from stu group by name;
     
    select name,sum(score<60) from stu group by name;
     
    select name,sum(score<60) as gk,avg(score) as pj from stu group by name having gk>=2;
    

    \color{rgba(254, 67, 101, .8)}{查询数据库没有的项}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
    
        //输出商品的名称、售价、打折价,并输出省了多少钱market_price-shop_price(只能做简单四则运算 + - + /)
        //这个售价减去打折价其实数据表里是没有这一项的,但是可以在这里通过提取出来的数据进行运算,并显示在浏览器中
        $sql = "select goods_name, market_price,shop_price, market_price-shop_price '节省' from goods";
        
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
    print_r($list);
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
           
            echo '<tr>';
            foreach($goods as $item){
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
    

    \color{rgba(254, 67, 101, .8)}{折扣后的价格索引太长,可以给他取一个别名,否则不好取这个值}

    image.png

    \color{rgba(254, 67, 101, .8)}{重命名显示}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
    
        //输出商品的名称、售价、打折价,并输出省了多少钱market_price-shop_price(只能做简单四则运算 + - + /)
        //这个售价减去打折价其实数据表里是没有这一项的,但是可以在这里通过提取出来的数据进行运算,并显示在浏览器中
        $sql = "select goods_name '商品价格', market_price '售价',shop_price '折后价', market_price-shop_price '节省' from goods";
        
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
    print_r($list);
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
           
            echo '<tr>';
            foreach($goods as $item){
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
    
    image.png image.png

    \color{rgba(254, 67, 101, .8)}{如果要查询节省价格超过200的商品,是不能用'节省'这个别名的}
    \color{rgba(254, 67, 101, .8)}{因为数据库中没有这一项,还是只能用market\_price - shop\_price}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
    
        //输出商品的名称、售价、打折价,并输出省了多少钱market_price-shop_price(只能做简单四则运算 + - + /)
        //这个售价减去打折价其实数据表里是没有这一项的,但是可以在这里通过提取出来的数据进行运算,并显示在浏览器中
        $sql = "select goods_name, market_price,shop_price, market_price-shop_price '节省' from goods where market_price-shop_price > 200";
        
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
           
            echo '<tr>';
            foreach($goods as $item){
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
       
    
    image.png

    \color{rgba(254, 67, 101, .8)}{用命令行查的话,要提前设置 set names GB2312,否则乱码}

    image.png

    \color{rgba(254, 67, 101, .8)}{要用别名查询数据库没有的项就要用having}
    \color{rgba(254, 67, 101, .8)}{having的条件里出现的内容必须是前面查询条件select之后出现过的}

    例如:
    $sql = "select goods_name, market_price,shop_price, market_price-shop_price '节省' from goods having goods_id> 20";
    这样就查不出结果来,会报错:
    Unknown column 'goods_id' in 'having clause',显示是未知的列

    但是,用where:
    $sql = "select goods_name, market_price,shop_price, market_price-shop_price '节省' from goods where goods_id> 20";
    两者除了where和having不一样之外,其他完全相同

    having 的条件必须是select后面出现的项
    而where与前面出现的项无关,只要是数据库有的项都可以

    select之后的查询条件会建立一张临时表,having就是作用于这一张表
    而where是作用于数据库原表

    \color{rgba(254, 67, 101, .8)}{having和where的写法一模一样}

    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());//连接数据库,如果出错返回错误信息
        mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码,如果出错返回错误信息
    
        
    //这里前面别名是中文要用引号引起来,但是having后面不用引号,否则查不出结果
    //这里如果用where就不能用别名‘节省’,只能用market_price-shop_price
    //having用来查聚合后(就是经过加工后的,数据库没有的临时项)
        $sql = "select goods_name, market_price,shop_price, 
    market_price-shop_price '节省' from goods having 节省 > 200";
        
        $result = mysqli_query($link, $sql) or die(mysqli_error($link));
        $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
    
        echo '<table width="100%" border="1">';
        foreach($list as $goods){
           
            echo '<tr>';
            foreach($goods as $item){
                echo "<td>{$item}</td>";
            }
            echo '</tr>';
        }
        echo '</table>';
    
    image.png

    \color{rgba(254, 67, 101, .8)}{}
    \color{rgba(254, 67, 101, .8)}{}



    \color{rgba(254, 67, 101, .8)}{4.order by 排序}

    order by  列1, 列2,...[排序方式 升序(缺省(没写就默认升序 用asc代替)) 降序 用desc代替]      
    默认升序(显示声明用 asc)用 desc 可以设置为降序排列
    
    升序排列:
        $sql = "select goods_id, goods_name, shop_price from goods order by shop_price asc";//这个asc是默认升序,所以写不写效果都是升序
    
    降序排列:
        $sql = "select goods_id, goods_name, shop_price from goods order by shop_price desc";
    
    从低到高效果截图在下面
     
     
    mysql> select * from stu order by name desc;
    +----------+----------+-------+
    | name     | class    | score |
    +----------+----------+-------+
    | zhangsan | shuxue   |    50 |
    | zhangsan | dili     |    40 |
    | zhangsan | shuxue   |    90 |
    | wangwu   | zhengzhi |    30 |
    | lisi     | yuwen    |    55 |
    | lisi     | zhengzhi |    45 |
    +----------+----------+-------+
    6 rows in set (0.00 sec)
     
     
        select * from stu order by name,score desc; 
     
     
    mysql> select * from stu order by name asc,score desc;
    +----------+----------+-------+
    | name     | class    | score |
    +----------+----------+-------+
    | lisi     | yuwen    |    55 |
    | lisi     | zhengzhi |    45 |
    | wangwu   | zhengzhi |    30 |
    | zhangsan | shuxue   |    90 |
    | zhangsan | shuxue   |    50 |
    | zhangsan | dili     |    40 |
    +----------+----------+-------+
    6 rows in set (0.00 sec)
    

    \color{rgba(3, 101, 100, .8)}{从低到高:升序排列}

    image.png

    \color{rgba(3, 101, 100, .8)}{从高到低:降序排列}

    image.png

    \color{rgba(254, 67, 101, .8)}{5.limit 限制结果条数}

    limit[offset,]N    limit [起始位置,]查询数量 (offset 可缺省,不写的话默认从0开始)
    offset:偏移量
    N:取出的条目
    offset缺省,即(limit 0,3)等于(limit 3)
    select * from stu order by name,score desc limit 2,2;
     
    select * from stu order by score ;
    

    \color{rgba(3, 101, 100, .8)}{查询前三位的商品:}

    $sql = "select goods_id, goods_name, shop_price from goods limit 0,3";
    
    image.png

    \color{rgba(3, 101, 100, .8)}{可以查出来,但是这样写提出来的id 1,4,3是原本数据库的id,提取出来之后不会自动排序}
    \color{rgba(3, 101, 100, .8)}{存进去是什么样,提出来就是什么样}

    \color{rgba(254, 67, 101, .8)}{下面这样写就会按照价格降序排列出来:}

    $sql = "select goods_id, goods_name, shop_price from goods order by shop_price desc limit 0,3";//先降序排列,再提出三条结果
    
    image.png

    \color{rgba(254, 67, 101, .8)}{以上5种子句可以结合在一条语句中使用}
    \color{rgba(254, 67, 101, .8)}{如果出现多个子句的组合,就要按顺序写}
    \color{rgba(254, 67, 101, .8)}{不按顺序写会报错}


    <?php
    //header("Content-type:text/html;charset=utf-8");
    
    /* select 的五种子句 */
    
    
    
    //最简单的数据库查询步骤:
    
    //1.连接数据库,如果出错放回具体的错误信息
    $link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());
    
    //2.设置编码
    mysqli_set_charset($link, 'utf8')or die(mysqli_connect_error($link));
    
    /* 
    
        DQL(database query language 数据库查询语言):
            select 列1,列2,... from 表 [where 查询条件 附加条件]
            
            where语句
                where 条件表达式(比较运算, 逻辑运算)
                    比较运算:> < >= <=   !=/<>(两个都是不等于)
     */
    
    
    
    
    
    //3.查询数据库
    $sql = "select * from goods";//查询所有行、所有列  *通配符,代表所有列 表goods后面没条件,表示查询所有的数据
    //这种查询方式在项目中几乎不用,因为查询范围太广
    
    //4.执行代码
    $result = mysqli_query($link, $sql) or die(mysqli_error($link));
    
    //5.将查询结果转成数组
    $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
    
    //6.输出结果
    //将结果输出为一个表格
    echo '<table width="100%" border="1">';
    foreach($link as $v){
        echo '<tr>';//<tr><td>{$v['goods_id']}</td></tr>前面是这样写的,但是不一定就是查这个,所以这里不这样写了
            foreach($goods as $item){//前面是一堆的td写一大行,这里用foreach一个一个的输出更好
                echo "<td>{$item}</td>";
            }
        echo '</tr>';
    }
    echo '</table>';
    ?>
    
    

    相关文章

      网友评论

          本文标题:PHP -- 数据库4 -- select的五种字句

          本文链接:https://www.haomeiwen.com/subject/qzpbjctx.html