mysql查询语句

mysql查询语句

网址:http://edu.cnzz.cn/s/201510/2306da.shtml

查询的五种子句

​ where(条件查询)、having(筛选)、group by(分组)、order by(排序)、limit(限制结果数)

主要的查询语句的关键词以及顺序
from 目标表
join … on … 对 join后的关联表进行过滤,然后再进行笛卡尔积操作
where 对笛卡尔积后的临时表进行过滤
group by 根据某个列对记录进行聚合
having 对聚合后的结果进行过滤
select 选择对应的列
distinct 对记录进行去重
order by 对记录按照某个条件进行排序
limit 对排序后的结果进行分页

1、where常用运算符:

比较运算符

​ > , < ,= , != (< >),>= , <=

​ in(v1,v2…vn)

​ between v1 and v2 在v1至v2之间(包含v1,v2)

逻辑运算符

​ not ( ! ) 逻辑非

​ or ( || ) 逻辑或

​ and ( && ) 逻辑与

​ where price>=3000 and price <= 5000 or price >=500 and price <=1000 #取500-1000或者3000-5000的值

​ where price not between 3000 and 5000 # 不在3000与5000之间的值

模糊查询

​ like 像

​ 通配符:

​ % 任意字符

​ _ 单个字符

​ where goods_name like ‘诺基亚%’

​ where goods_name like ‘诺基亚N__’

​ 注意:AND和OR关键字可以连接条件表达式。这些条件表达式中可以使用“=”、“>”等操作符,也可以使用IN、BETWEEN AND和LIKE等关键字,而且,LIKE关键字匹配字符串时可以使用“%”和“_”等通配符。

2、group by 分组

​ 一般情况下group需与统计函数(聚合函数)一起使用才有意义

​ 如:select goods_id,goods_name,cat_id,max(shop_price) from goods group by cat_id;

​ 这里取出来的结果中的good_name是错误的!因为shop_price使用了max函数,那么它是取最大的,而语句中使用了group by 分组,那么goods_name并没有使用聚合函数,它只是cat_id下的第一个商品,并不会因为shop_price改变而改变

​ mysql中的五种统计函数:

​ (1)max:求最大值

​ select max(goods_price) from goods

​ 这里会取出最大的价格的值,只有值

​ #查询每个栏目下价格最高的

​ select cat_id,max(goods_price) from goos group by cat_id;

​ #查出价格最高的商品编号

​ select goods_id,max(goods_price) from goods group by goods_id

​ (2)min:求最小值

​ (3)sum:求总数和

​ #求商品库存总和

​ select sum(goods_number) from goods;

​ (4)avg:求平均值

​ #求每个栏目的商品平均价格

​ select cat_id,avg(goods_price) from goods group by cat_id;

​ (5)count:求总行数

​ #求每个栏目下商品种类

​ select cat_id,count(*) from goods group by cat_id;

​ ###要把每个字段名当成变量来理解,它可以进行运算###

​ 例:查询本店每个商品价格比市场价低多少;

​ select goods_id,goods_name,goods_price-market_price from goods;

​ 查询每个栏目下面积压的货款

​ select cat_id,sum(goods_price*goods_number) from goods group by cat_id;

###可以用as来给计算结果取个别名###

​ select cat_id,sum(goods_price * goods_number) as hk from goods group by cat_id

​ 不仅列名可以取别名,表单也可以取别名

3、having 与where 的异同点

​ having与where类似,可以筛选数据,where后的表达式怎么写,having后就怎么写

​ where针对表中的列发挥作用,查询数据

​ having对查询结果中的列发挥作用,筛选数据

​ #查询本店商品价格比市场价低多少钱,输出低200元以上的商品

​ select goods_id,good_name,market_price - shop_price as s from goods having s>200 ;

​ //这里不能用where因为s是查询结果,而where只能对表中的字段名筛选

​ 如果用where的话则是:

​ select goods_id,goods_name from goods where market_price - shop_price > 200;

​ #同时使用where与having

​ select cat_id,goods_name,market_price - shop_price as s from goods where cat_id = 3 having s > 200;

​ #查询积压货款超过2万元的栏目,以及该栏目积压的货款

​ select cat_id,sum(shop_price * goods_number) as t from goods group by cat_id having s > 20000

​ #查询两门及两门以上科目不及格的学生的平均分

​ 思路:

​ #先计算所有学生的平均分

​ select name,avg(score) as pj from stu group by name;

​ #查出所有学生的挂科情况

​ select name,score<60 from stu;

​ #这里score<60是判断语句,所以结果为真或假,mysql中真为1假为0

​ #查出两门及两门以上不及格的学生

​ select name,sum(score<60) as gk from stu group by name having gk > 1;

​ #综合结果

​ select name,sum(score<60) as gk,avg(score) as pj from stu group by name having gk >1;

良好的理解模型:

​ 1、where后面的表达式,把表达式放在每一行中,看是否成立

​ 2、字段(列),理解为变量,可以进行运算(算术运算和逻辑运算)

​ 3、 取出结果可以理解成一张临时表

4. 代码

  1. 在shell中连接数据库的命令

    格式: mysql -h主机地址 -u用户名 -p用户密码 数据库

    首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>。
    例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
    mysql -h110.110.110.110 -uroot -pabcd123

    mysql -hxx.com -uxx -pxx  xx
    
  2. 选择数据库

    use hydra;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hBjnfSsw-1576563842631)(C:\Users\71480\AppData\Local\Temp\1557488076194.png)]

  3. 显示数据库列表

    show databases;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAzh5gpl-1576563842634)(C:\Users\71480\AppData\Local\Temp\1557487349395.png)]

  4. 查看当前数据库中的表

    show tables;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rqqG1Sc1-1576563842634)(C:\Users\71480\AppData\Local\Temp\1557486921799.png)]

  5. 查看表的属性

    describe或者desc

    desc api_order; 
    describe api_order;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1VMXhJ3m-1576563842635)(C:\Users\71480\AppData\Local\Temp\1557486984820.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iFVcighN-1576563842636)(C:\Users\71480\AppData\Local\Temp\1557487470716.png)]

  6. 查看当前数据库的属性

    status;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E40v9U8g-1576563842636)(C:\Users\71480\AppData\Local\Temp\1557487107384.png)]

  7. 查询单个数值

    select id, product, phone  from api_order where product > 3 limit 10;
    
  8. 查询多个数值

    select id, product, phone from api_order where product in (0,3) limit 100;
    
  9. 查询单个字符

select id, product, phone from api_order where phone = '13333777031';
  1. 模糊查询单个字符

    select user_id, name, province, city from users_profile where name like '%牛%' limit 10 ;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PcSyUHBq-1576563842637)([外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YaCzsW9T-1576563843711)(C:%5CUsers%5C71480%5CAppData%5CLocal%5CTemp%5C1557227422047.png)]])

  2. 查询多个字符

    select id, product, phone from api_order where phone in ('13333777031','15827827777');
    
  3. 查询日期型数据

    select id, created_time, finish_repay_time from api_order where created_time > '2018-10-01' limit 10;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1BwiAum8-1576563842637)(C:\Users\71480\AppData\Local\Temp\1557227742259.png)]

  4. 查询非空数据

    select user_id, name, city  from users_profile where city <>'' limit 10;
    
  5. 查询前N条数据

    select id, created_time, finish_repay_time from api_order  order by created_time  limit 10 ;
    
  6. 查询后N条数据

    select id, created_time, finish_repay_time from api_order  order by created_time desc  limit 10 ;
    select id, user_id, created_time, finish_repay_time from api_order  order by user_id desc  limit 10 ;
    
  7. 查询第中间某几行的数据

从第10行开始取接下来的3行数据

select auto_id, id, user_id, created_time, finish_repay_time from api_order  order by auto_id  limit 10,3 ;
  1. 查询在某个区间内的数据

    select auto_id, id, user_id from api_order where auto_id between  10 and  30;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TfbziQVw-1576563842638)(C:\Users\71480\AppData\Local\Temp\1557228986355.png)]

    
    
  2. 对查询结果去重

    select distinct province  from users_profile;
    select distinct province  from users_profile where name="牛丽君";
    
  3. 查询空字段

    select user_id, name from users_profile where city is NULL limit 10 ;
    
  4. not 关键字

    select user_id, name, city from users_profile where city not in ('北京', '上海', '广州') limit 10 ;
    select auto_id, id, user_id from api_order where auto_id not between 5 and 10 limit 10;
    
  5. group by 对数据进行分组统计

    select province, count(province) from users_profile group by province;
    等价于
    select province, count(*) from users_profile group by province;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UVKpwyPJ-1576563842639)(C:\Users\71480\AppData\Local\Temp\1557230065320.png)]

  6. 多表查询

    select api_order.user_id, api_order.id, users_profile.name from api_order, users_profile where api_order.user_id =  users_profile.user_id limit 10;
    等价于:
    select api_order.user_id, api_order.id, users_profile.name from users_profile join api_order on api_order.user_id  = users_profile.user_id limit 10;
    
  7. having

    select province, count(*) as ct from users_profile group by province having ct > 1000;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B2cgdlLK-1576563842640)(C:\Users\71480\AppData\Local\Temp\1557231705132.png)]

    1. mysql的函数-year() | month() | day()

      select year(created_time) as year, month(created_time) as  month, day(created_time) as day ,id from api_order limit  10;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtUFlbMV-1576563842640)(C:\Users\71480\AppData\Local\Temp\1557400041637.png)]

    2. date函数

      1)adddate(date_1, interval 30 days)

    select adddate(created_time, interval 3 day), now() from api_order limit 3;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5QWKN3CX-1576563842641)(C:\Users\71480\AppData\Local\Temp\1557400481118.png)]

    ​ 2)时间格式化 date_format(,)

    select user_id, id, created_time, date_format(created_time, "%Y-%m-%d %H:%i:%S") from api_order limit 5;
    

    ​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qgTHLfc4-1576563842642)(C:\Users\71480\AppData\Local\Temp\1557486391617.png)]

    1. datediff(date_1, date_2)

      select created_time, finish_repay_time, datediff(finish_repay_time, created_time) from api_order where finish_repay_time is not null  limit 3;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gySIGy1Y-1576563842643)(C:\Users\71480\AppData\Local\Temp\1557400662105.png)]

    2. 获取用户最近一笔申请订单的信息

      select id, user_id,  max(created_time) from api_order where created_time > '2019-05-09' group by user_id;
      
    3. between … and …

      select created_time, finish_repay_time,  datediff(finish_repay_time, created_time) from api_order where finish_repay_time is not null and  created_time between '2019-05-01' and '2019-05-02' limit 5;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rerjmJtL-1576563842643)(C:\Users\71480\AppData\Local\Temp\1557401804955.png)]

    4. 查找2019-05-08号的放款订单信息

      select id, user_id,created_time, finish_repay_time from api_order where created_time between  '2019-05-08' and '2019-05-09' and  progress in (-3,3,4,5,6,7);
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TeV8qGy1-1576563842644)(C:\Users\71480\AppData\Local\Temp\1557402246004.png)]

    5. is not null 跟 !=“NULL” 的效果是一样的

      select created_time, finish_repay_time, user_id, id from api_order where created_time between "2019-05-9" and "2019-05-10" and finish_repay_time != "NULL" limit 3;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OCMINDVA-1576563842645)(C:\Users\71480\AppData\Local\Temp\1557455934184.png)]

      select created_time, finish_repay_time, user_id, id from api_order where created_time between "2019-05-9" and "2019-05-10" and finish_repay_time is not null limit 3;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q2TcxijS-1576563842645)(C:\Users\71480\AppData\Local\Temp\1557455980333.png)]

    6. group by 跟where结合使用时,where在前,group by 在后 ,即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组,最后使用having字句对分组后的结果进行筛选。

      select province, count(*) as ct from users_profile  where changed_time between '2019-05-09' and '2019-05-10' group by province having ct >= 500 ;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DfH61HZm-1576563842646)(C:\Users\71480\AppData\Local\Temp\1557457089085.png)]

    7. group by 的参数:with rollup:使用WITH ROLLUP时,将会在所有记录的最后加上一条记录,这条记录是上面所有记录的总和

      rollup使用时的注意事项:

      1)当你使用 ROLLUP时, 你不能同时使用 ORDER BY子句进行结果排序。换言之, ROLLUP 和ORDER BY 是互相排斥的。

      2)LIMIT可用来限制返回客户端的行数。LIMIT 用在 ROLLUP后面, 因此这个限制 会取消被ROLLUP添加的行

      select province, count(*) as ct from users_profile  where changed_time between '2019-05-09' and '2019-05-10' group by province with rollup having ct >= 500 ;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MPpwyXgl-1576563842646)(C:\Users\71480\AppData\Local\Temp\1557457174363.png)]

    8. group by 和order by 的结合使用

      select province, count(*) as ct from users_profile  where changed_time between '2019-05-09' and '2019-05-10' group by province  having ct >= 500 order by ct desc;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qYHW16pY-1576563842647)(C:\Users\71480\AppData\Local\Temp\1557457585588.png)]

    9. group by :按照多个字段进行分组。例如,employee表按照d_id字段和sex字段进行分组。分组过程中,先按照d_id字段进行分组,遇到d_id字段的值相等的情况时,再把d_id值相等的记录按照sex字段进行分组

      select province,city, count(*) as ct from users_profile  where changed_time between '2019-05-09' and '2019-05-10' group by province,city having ct >=50 order by ct desc;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WSMbJ0vA-1576563842650)(C:\Users\71480\AppData\Local\Temp\1557459014785.png)]

    10. on 和where的区别:

      语句1:select A.ID as AID, B.ID as BID from A left join B on A.ID = B.ID where B.ID<3

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cp1ltr4o-1576563842652)(http://img.cnzz.cn/image/?file=/201510/201510211615145926726.jpg)]

      语句2:select A.ID as AID, B.ID as BID from A left join B on A.ID = B.ID and B.ID<3

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XrJLZZP3-1576563842652)(http://img.cnzz.cn/image/?file=/201510/201510211615200459010.jpg)]

      发现两个查询存在差异。 为什么会存在差异,这和on与where查询顺序有关。 我们知道标准查询关键字执行顺序为 from->where->group by->having->order by。 left join 是在from范围类所以 先on条件筛选表,然后两表再做left join。 而对于where来说在left join结果再次筛选。

      (1)ON后面的筛选条件主要是针对的是关联表【而对于主表刷选条件不适用】。

      (2)对于主表的筛选条件应放在where后面,不应该放在ON后面

      (3)对于关联表我们要区分对待。如果是要条件查询后才连接应该把查询件 放置于ON后。 如果是想再连接完毕后才筛选就应把条件放置于where后面

      (4)对于关联表我们其实可以先做子查询再做join

      所以sql语句2select A.ID as AID, B.ID as BID from A left join B on A.ID = B.ID and B.ID<3等价于 Sql代码 select A.ID as AID, B1.ID as BID from A left join ( select B.ID from B where B.ID < 3 )B1 on A.ID = B1.ID

    11. mysql查询结果的显示:

      1)使用\G按行垂直显示结果;

      ​ 如果一行很长,需要这行显示的话,看起结果来就非常的难受。在SQL语句或者命令后使用\G而不是分号结尾,可以将每一行的值垂直输出

      select * from api_order limit 3 \G;
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xXr5VCun-1576563842653)(C:\Users\71480\AppData\Local\Temp\1557460822728.png)]

      2)将sql的查询结果保存在文件中

      ​ 在mysql命令行中,使用tee命令,可以记录语句和输出到指定文件。在debugging时会很有用。 每执行一条语句,mysql都会讲执行结果刷新到指定文件。Tee功能只在交互模式生效。

      tee output.txt; #将sql的查询结果保存到文件output.txt中
      notee;  #使用notee命令来关闭日志记录
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ft4Er3OJ-1576563842654)(C:\Users\71480\AppData\Local\Temp\1557461288450.png)]

      1. 执行mysql文件
      cat mysql_demo.sql
      source mysql_demo.sql  #在交互模式生效
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mUwZkNgP-1576563842655)(C:\Users\71480\AppData\Local\Temp\1557481897451.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TDbp8DTk-1576563842656)(C:\Users\71480\AppData\Local\Temp\1557481872563.png)]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值