zoukankan      html  css  js  c++  java
  • 常用sql语句

    DQL(数据查询语句)

    1.简单查询
    格式: select 字段名1,字段名2... from 表名;

    mysql> desc emp;
    +----------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +----------+-------------+------+-----+---------+-------+
    | EMPNO | int | NO | PRI | NULL | |
    | ENAME | varchar(10) | YES | | NULL | |
    | JOB | varchar(9) | YES | | NULL | |
    | MGR | int | YES | | NULL | |
    | HIREDATE | date | YES | | NULL | |
    | SAL | double(7,2) | YES | | NULL | |
    | COMM | double(7,2) | YES | | NULL | |
    | DEPTNO | int | YES | | NULL | |
    +----------+-------------+------+-----+---------+-------+
    提示:sql语句以分号结尾;sql语句不区分大小写
    查询年薪?
    select ename,sal12 from emp; (字段可以参与数学运算)
    给查询结果的列重命名?
    select ename,sal
    12 as yearsal from emp; (as关键字重命名,as关键字可省略)
    select ename,sal*12 as '年薪' from emp; (sql语句中的字符串使用单引号)
    查询全部字段?
    select * from emp; (程序中不建议使用,效率低)

    2.条件查询
    格式:select 字段名 from 表明 where 条件; (执行顺序: from ——> where ——> select)
    常用条件:

    查询工资等于5000的员工?
    select ename from emp where sal = 5000;
    +-------+
    | ename |
    +-------+
    | KING |
    +-------+

    =
    <>=
    <
    >
    >=
    and and优先级高于or,可使用小括号提高优先级
    or
    not 非,常跟is或in
    between ...and... 等同于 >= and <= ,除了可以用于数字也用于字母,数字是包含关系,字母是左闭右开
    is null null 不是一个值,表示为空,因此不能用等号衡量。反义为is not null
    in 等同于or,eg:in (’manage‘,’sal‘)。反义为not in
    like 模糊查询,可以用来匹配%或下划线 。%代表任意多个字符,_代表任意一个字符
    +------+-----------+
    id name
    +------+-----------+
    1 feefee
    2 xiao_ming
    3 tt
    +------+-----------+
    查询带有下划线的名字?
    select name from t_user where name like '%_%'; (斜杠转义)

    3.排序
    order by 关键字,默认为升序,asc也可表示升序,desc降序
    select ename,sal from emp order by sal;
    select ename,sal from emp order by sal desc; 降序查询
    select ename,sal from emp order by sal desc, ename; 多个字段同时排序,用逗号隔开,靠前的字段主导作用越大,只有前面的字段无法完成排序的时候才会启用后面的字段。
    select ename,sal from emp order by 2;order by后面可跟字段的顺序,表示根据第二列排序,不建议使用,该方法不够健壮,字段位置发生变化时就失效了
    select
    *
    from
    tablename
    where
    条件
    order by
    ......;(执行顺序;from ,where,select,order by)

    4.分组函数
    count 计数
    sum 求和
    avg 平均值
    max 最大值
    min 最小值
    注意:所有分组函数都是针对某一组数据操作的,也叫多行处理函数。
    特点:分组函数自动忽略null,不需要额外添加判断null的条件
    记住:NULL参与表达式运算时,所得结果一定为NULL。
    ifnull() 空处理函数?
    ifnull(可能是null的数据,如为null则当作什么处理):属于单行处理函数
    select ifnull(comm,0) from emp;
    +----------------+
    | ifnull(comm,0) |
    +----------------+
    | 0.00 |
    | 300.00 |
    | 500.00 |
    | 0.00 |
    | 1400.00 |
    | 0.00 |
    | 0.00 |
    | 0.00 |
    | 0.00 |
    | 0.00 |
    | 0.00 |
    | 0.00 |
    | 0.00 |
    | 0.00 |
    +----------------+
    记住:SQL语法规则,分组函数不能直接使用在where子句中。因为group by在where之后才会执行
    count(*) :和字段没关系,统计总记录体条数
    count(字段):统计该字段中不为NULL的数据总数量

    分组函数也可以组合起来使用:
    select avg(sal),count(sal),max(sal) from emp;

    单行处理函数和分组函数(即多行处理函数)区别?
    单行处理单数一行一行处理数据,处理多少行则返回多少行数据
    多行处理函数,处理多行数据输出一行结果

    案例:找出工资高于平均工资的员工
    select ename,sal from emp where sal > (select avg(sal) from emp);
    嵌套子查询

    5.group by和having
    group by:按照某个字段或某些字段分组
    having:是对分组之后的数据再次进行分组过滤,是group by的搭档

    案例:找出每个工作岗位的最高薪资。
    select job,max(sal) from emp group by job;
    执行顺序:form, group by,select max
    分组函数一般都会个group by一起使用,因此叫做分组函数的原因。并且任何一个分组函数都是在group by后面执行。没有group by时整张表数据自成一组。
    当一条语句有group by时,select后只能跟参与分组的字段和分组函数。

    select ename,job,max(sal) from emp group by job;
    ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'bjpowernode.emp.ENAME' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    select xx 5
    from tablename 1
    where xx 2
    group by xx 3
    having xx 4
    order by xx 6

    多字段分组查询(可将多个字段看成一个字段):
    group by 字段1,字段2
    select deptno,job,max(sal) from emp group by deptno,job;

    找出每个部门的最高薪资,要求显示薪资大于2900的数据?
    select max(sal) from emp group by deptno having max(sal) > 2900; (效率低)
    select max(sal) from emp where sal >2900 group by deptno;(推荐)
    尽量先使用where,实在不行再使用having

    找出每个部分的平均薪资,要求显示薪资大于2000的数据?
    select avg(sal) from emp group by deptno having avg(sal) > 2000;

    关于查询结果去重:关键字distinct
    select distinct job from emp;
    distinct只能出现在所有字段的最前面。后面的字段联合起来去重

  • 相关阅读:
    php没有输出报错信息的解决
    web服务器集群(多台web服务器)后session如何同步和共享
    Linux环境PHP7安装
    Linux下将Mysql和Apache加入到系统服务
    2017年PHP程序员未来路在何方——韩天峰
    完整的TCP连接详解
    PHP常用优化
    socket_listen里面第二个参数backlog的用处
    JavaScript中的值类型和引用类型
    查询mysql字段名和字段注释
  • 原文地址:https://www.cnblogs.com/tingshu/p/14826644.html
Copyright © 2011-2022 走看看