设为首页 收藏本站
查看: 1330|回复: 0

[经验分享] SQL查询语句详解

[复制链接]

尚未签到

发表于 2018-10-23 12:45:40 | 显示全部楼层 |阅读模式
  SQL查询语句
  学习数据库最核心的功能就是掌握增、删、查、改等命令的使用,其中查询语句最为复杂也最为重要。本文将重点介绍查询语句相关命令的使用。
  查询语句的类型
  查询语句类型分为四种:简单查询、多表查询、子查询、联合查询(union)
  一、简单查询(单表查询)
  查询语句的语法格式为:
  mysql> select [distinct|sql_cache|sql_no_cache] {col_name|*} from tb_name [where子句] |group  by子句|having 子句|order by子句|limit子句;
  其中[DISTINC]表示重复的字段值只显示一次
  sql_cache:表示缓存查询结果
  sql_no_cache:表示不缓存查询结果
  *:表示该表中所有的字段,这是一个通配符,当然这里也可以指定想要显示的字段
  from字句后面可以接多个表以及其他select语句。
  from语句后面还可以创建表别名,例如:from  student as  s
  where子句
  格式为:where  qualification:用来筛选匹配的条件的行,实现数据过滤。
  where子句后面可以接如下命令:
  布尔关系表达式,表达式操作符有:>=、、 select * from students;
  +-------+---------------+-----+--------+---------+-----------+

  | StuID | Name          | Age | Gender |>  +-------+---------------+-----+--------+---------+-----------+
  |     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
  |     2 | Shi Potian    |  22 | M      |       1 |         7 |
  |     3 | Xie Yanke     |  53 | M      |       2 |        16 |
  |     4 | Ding Dian     |  32 | M      |       4 |         4 |
  |     5 | Yu Yutong     |  26 | M      |       3 |         1 |
  |     6 | Shi Qing      |  46 | M      |       5 |      NULL |
  |     7 | Xi Ren        |  19 | F      |       3 |      NULL |
  |     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
  |     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
  |    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
  |    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
  |    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
  |    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
  |    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
  |    15 | Duan Yu       |  19 | M      |       4 |      NULL |
  |    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
  |    17 | Lin Chong     |  25 | M      |       4 |      NULL |
  |    18 | Hua Rong      |  23 | M      |       7 |      NULL |
  |    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
  |    20 | Diao Chan     |  19 | F      |       7 |      NULL |
  |    21 | Huang Yueying |  22 | F      |       6 |      NULL |
  |    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
  |    23 | Ma Chao       |  23 | M      |       4 |      NULL |
  |    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
  |    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
  +-------+---------------+-----+--------+---------+-----------+
  25 rows in set (0.01 sec)
  例:题1:以ClassID分组,显示每班的同学的人数;
  由于有2个学生没有班级,因此,需要借助where子句将班级为NULL的2行数据去掉,去掉之后然后再进行分组。

  mysql> select>  +---------+-------------+

  |>  +---------+-------------+
  |       1 |           4 |
  |       2 |           3 |
  |       3 |           4 |
  |       4 |           4 |
  |       5 |           1 |
  |       6 |           4 |
  |       7 |           3 |
  +---------+-------------+
  7 rows in set (0.02 sec)
  例题2:以Gender分组,显示其年龄之和;
  mysql> select gender,sum(age) from students group by gender;
  +--------+----------+
  | gender | sum(age) |
  +--------+----------+
  | F      |      190 |
  | M      |      495 |
  +--------+----------+
  2 rows in set (0.00 sec)
  例题3:以Gender分组,显示各组中年龄大于20的学员的年龄之和;
  首选需要使用where子句将年龄大于20岁的学生筛选出来,然后在进行分组聚合。
  mysql> select gender,sum(age) from students where age > 20 group by gender;
  +--------+----------+
  | gender | sum(age) |
  +--------+----------+
  | F      |       22 |
  | M      |      476 |
  +--------+----------+
  2 rows in set (0.00 sec)
  having子句
  having子句用法和where大致相同,唯一的区别是where子句用于第一次查询;having子句用于二次查询。having子句通常用于对分组后的数据进行过滤。
  例题4:以ClassID分组,显示其平均年龄大于25的班级;
  首先仍然需要借助where子句将classID为null的数据去掉,然后在根据classID进行分组,分组完成之后,在使用having子句进行过滤。

  mysql> select>  +---------+----------+

  |>  +---------+----------+
  |       2 |  36.0000 |
  |       5 |  46.0000 |
  +---------+----------+
  2 rows in set (0.01 sec)
  order by子句
  格式为:order by col_name [ASC|DESC]
  col_name表示以哪个字段进行排序
  [ASC|DESC]:ASC表示以升序的方式来进行排序,DESC表示以降序的方式来排序。默认以升序的方式来进行排序。
  例题5:将表中年龄大于25岁的学生筛选出来,并根据age进行降序排序。
  mysql> select name,age from students where age >25 order by age DESC;
  +--------------+-----+
  | name         | age |
  +--------------+-----+
  | Sun Dasheng  | 100 |
  | Xie Yanke    |  53 |
  | Shi Qing     |  46 |
  | Tian Boguang |  33 |
  | Ding Dian    |  32 |
  | Xu Xian      |  27 |
  | Yu Yutong    |  26 |
  +--------------+-----+
  7 rows in set (0.00 sec)
  LIMIT子句
  格式为:LIMIT [offset,] count
  LIMIT在语句的最后,起到限制条目的作用
  offset:表示偏移量。即忽略前面的条目,从offset+1开始算起
  count:表示共取出多少行
  如果offset没写,则相当于LIMIT 0,count
  sql语句的执行顺序
  start→FROM语句→WHERE子句→GROUP BY子句→HAVING子句→ORDER BY子句→SELECT语句→LIMIT子句→end
  如果有上述中的某些语句才执行,没有的话就不需要执行。
  二、多表查询
  多表查询就是在多张表中查询,并将查询的结果显示出来。在由于需要在多张表中查询,因此,需要将多张表连接起来。这里的连接方式有如下几种:
  交叉连接:就是使用笛卡尔乘积方式将多张表连接起来。一般配合WHERE子句一起使用
  自然连接:也成为了等值连接或内连接,将相同字段且取值相同的行连接起来
  外连接:包括左外连接和右外连接
  左外连接:以左表为准,去右表找匹配数据,右表没有数据匹配时,用null补齐
  格式为:  tb1_name LEFT JOIN tb2_name ON...(ON后面为连接条件,通常为等值连接)
  右外连接:以右表为准,去左表找匹配数据,左表没有数据匹配时,用null补齐
  格式为: tb1_name RIGHT JOIN tb2_name ON...(ON后面为连接条件,通常为等值连接)自连接:把一张表通过设定别名的方式生成2个别名表,通过某种条件连接起来。
  三、子查询
  在比较操作中如果使用子查询,该子查询只能返回一个单值。
  如果子查询返回的结果有多个值或者是一个集合,可以使用IN关键字来代替操作符
  子查询分为如下三种:
  where型子查询:把内层查询结果作为外层查询的比较条件
  from型子查询:把内层的查询结果当做临时表,供外层sql再次查询
  exists子查询:把外层的查询结果拿到内层,看内层的查询是否成立
  说明:MySQL不擅长于子查询:应该避免使用子查询;
  四、联合(union)查询
  将两个查询和多个查询的结果合并在一起,因此,这多个查询语句的结果显示的字段要相同,最好数据类型也相同。
  五、视图view
  视图是由查询结果形成的一张虚拟表。它存储的是查询语句,而不是存储的查询结果。因此,当表的某些字段或属性改变时,视图也可能会发生改变。
  视图的创建语法
  mysql> CREATE VIEW  视图名 AS SELECT语句
  删除视图的语法
  mysql> DROP  VIEW 视图名
  视图的作用
  1.可以简化查询
  2.可以进行权限控制,把表的权限封闭,但是开放相应的视图权限,视图里只开放部分数据。
  3.大数据分表时可以用到
  视图的改变
  1.视图增删也会改变表的
  2.视图并不是总能增删改的
  3、当视图的数据与表的数据一一对应,可以修改
  4、对于视图insert还应注意,视图必须包含表中没有默认值的列


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625480-1-1.html 上篇帖子: mysql服务器变量的管理及其SQL模型浅谈 下篇帖子: 对mybastis 的理解1--xml中的动态sql设计
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表