zoukankan      html  css  js  c++  java
  • MySql-单表查询

    单表查询

    完整的查询语句语法

    # []为可选项
    select [distinct] *|字段名|四则运算|聚合函数 from 表名
    [where 条件]
    [group by 字段]
    [having 条件]
    [order by 排序]
    [limit m,n] 控制从哪里开始显示以及显示几条
    

    以上是书写顺序,必须按照这个顺序来书写sql语句。书写顺序并不代表是执行顺序

    简单查询

    1.distinct 是可选项,用于去除重复记录

    2.as 是用来取别名,取别名as可以省略

    3.可以对字段的数据进行四则运算

    4.concat ()字符串连接,concat_ws()可以指定连接符连接字符串

    # 准备数据
    create table stu(id int primary key auto_increment,name char(10), math float, english float);
    insert into stu(name,math,english) values('赵云',90,30),("小乔",90,60),("小乔",90,60),('大乔',10,70),('李清照',100,100),('铁拐李',20,55),('小李子',20,55),('李四',59,98),('李',88,32),('狄仁杰',null,null);
    
    # 1.查看所有的数据
    select * from stu;
    
    # 2.查看英语成绩
    select name,english from stu;
    
    # 3.查询所有人的数学数据,并去除姓名相同的数据
    select distinct name,math from stu;
    
    # 4.统计每个人的总分
    select name,math+english as 总分 from stu;
    
    # 5.为每个人的英语加10分显示
    select name,english+10 from stu;
    
    # 6.字符串连接
    select name 姓名,concat('英语:',english),concat_ws(':','数学',math) from stu;
    

    where关键字

    支持的表达式

    # 1.查询英语分数在90-100之间的同学
    select * from stu where english between 90 and 100;
    
    # 2.查询数学分数为89,90,91的同学
    select * from stu where math in (89,90,91);
    
    # 3.查询所有姓李的学生成绩
    select * from stu where name like '李%';
    
    # 4.查询所有姓名带有李的学生成绩
    select * from stu where name like '%李%';
    
    # 5.查询数学分>80并且英语分>80的同学
    select * from stu where math>80 and english>80;
    
    # 6.查询数学分<60或者英语分<60的同学
    select * from stu where math<60 or english<60;
    
    # 7.查询数学分为空的同学
    select * from stu where math is null;
    

    group by 分组查询

    需要一个字段作为分组依据,把一个整体分割为不同的部分

    1.count():计数,为null时不会计入

    2.sum():求和

    3.avg():求平均数,为null时不计入分母

    4.max():求最大值

    5.min():求最小值

    以上聚合函数可以写在字段的位置,或者是分组的后面

    注意:mysql5.6默认分组后可以查看每个分组的第一条记录的字段,可以添加ONLY_FULL_GROUP_BY到sql_mode中避免这个问题

    # 准备数据
    create table emp(id int primary key auto_increment,name char(10),sex char, dept char(10),job char(10),salary double);
    insert into emp(name,sex,dept,job,salary) values("刘备","男","市场","总监",5800),("张飞","男","市场","员工",3000),("关羽","男","市场","员工",4000),("孙权","男","行政","总监",6000),("周瑜","男","行政","员工",5000),("小乔","女","行政","员工",4000),("曹操","男","财务","总监",10000),("司马懿","男","财务","员工",6000);
    
    # 1.查询每个部门有几个人
    select dept,count(*) 人数 from emp group by dept;
    
    # 2.查询每个部门的平均工资
    select dept,avg(salary) 平均工资 from emp group by dept;
    
    # 3.查询每个岗位的平均工资
    select job,avg(salary) 平均工资 from emp group by job;
    
    # 4.查询每个部门每个岗位的平均工资
    select dept,job,avg(salary) 平均工资 from emp group by dept, job;
    
    # 5.查询工资最高的人的姓名
    select name,max(salary) from emp;
    	# 默认显示第一行的name,因为name有很多行,而max(salary)只有一行,两列的行数不匹配
    	# 不应该这么写,逻辑错误	
    select name from emp where salary = max(salary);
    	# 报错。where后面不能使用聚合函数
    
    # 6.查询平均工资大于5000的部门
    mysql> select dept from emp where avg(salary) > 50
    ERROR 1111 (HY000): Invalid use of group function
    	# 错误写法,where后面不能使用聚合函数
    
    ## having 用于对分组后的数据进行筛选,与where不同的是:having使用在分组之后;having后面可以写聚合函数
    select dept from emp group by dept having avg(salary)>5000;  # 正确写法
    
    # 7.查询部门人数少于3的部门名称,人员名称,人员个数
    select dept,group_concat(name),count(*) from emp group by dept having count(*) < 3;
    
    # 8.查询岗位平均薪资高于6000的岗位名称和平均薪资
    select dept,avg(salary) from emp group by dept having avg(salary) > 6000;
    

    order by 排序

    select * from emp order by salary;  # 按薪资升序排序
    select * from emp order by salary asc;  # 按薪资升序排序
    
    select * from emp order by salary desc;  # 按薪资降序排序
    
    select * from emp order by salary,id desc;  # 先按薪资升序排序,工资相同的按id降序排序
    

    limit 限制显示的记录数

    limit [start,] count;

    start 开始记录的位置,从0开始数,不指定时则从第一条开始显示

    count 要显示的记录条数

    select * from emp limit 3;  # 查看前三条记录
    
    select * from emp order by salary desc limit 1;  # 查看工资最高的人的信息
    
    select * from emp limit 2,4  # 从第3条记录开始查找4条记录
    
    limit 可用于分页,分页原理:
    先查询总数据条数 设为a
    确定每页数量b
    总页数为c = a / b 如果除不尽则需要加1  例如 10 / 3 正确页数为4
    查询语句的起始位置为s = 当前页数d 减去1 乘以每页数量
    即  s =  (d - 1) * b
    语句为:select*from table_name limit s,b
    
    

    下一篇:https://www.cnblogs.com/863652104kai/p/11253608.html

  • 相关阅读:
    南阳1071
    hdu5110 dp
    hdu1199 线段树
    hdu5107 线段树
    hdu5106 数位dp
    hdu 5103 状态压缩dp
    C Strange Sorting
    hdu5102 枚举每条边的长度
    uva672
    uva473
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11192389.html
Copyright © 2011-2022 走看看