SQL语句

作者: consolelog | 来源:发表于2021-06-22 18:14 被阅读0次

    SQL语句主要分为四类

    • DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
    • DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
    • DDL(数据定义语言):create drop alter,对表结构的增删改。
    • TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)
    • DCL(数据控制语言): grant授权、revoke撤销权限等。

    查询 (DQL)

    基础查询

    SELECT
        字段1, 字段2, 字段3, ...
    FROM
        表名;
    

    查询员工的年薪?

    -- 字段可以参与数学运算
    SELECT
        ename,
        sal * 12 
    FROM
        emp;
    
    -- 可以使用 as 关键字取别名, as 可以省略
    SELECT
        ename '姓名',
        sal * 12 AS '年薪' 
    FROM
        emp;
    

    条件查询

    SELECT
        字段1, 字段2, 字段3, ...
    FROM
        表名
    WHERE
        条件;
        
    -- 执行顺序:先from,然后where,最后select
    

    查询工资等于5000的员工姓名?

    SELECT
        ename 
    FROM
        emp 
    WHERE
        sal = 5000;
    

    查询SMITH的工资?

    SELECT
        sal 
    FROM
        emp 
    WHERE
        ename = 'SMITH';
    
    -- 字符串使用单引号括起来。
    

    找出工资在1100和3000之间的员工,包括1100和3000?

    SELECT 
        ename, sal 
    FROM
        emp 
    WHERE 
        sal >= 1100 AND sal <= 3000;
        
        
    SELECT
        ename,
        sal 
    FROM
        emp 
    WHERE
        sal BETWEEN 1100 
        AND 3000;
    --  between...and...是闭区间 [1100 ~ 3000]
    

    找出哪些人津贴为NULL?

    -- 在数据库当中NULL不是一个值,代表什么也没有,为空。
    -- 空不是一个值,不能用等号衡量。
    -- 必须使用 is null或者is not null
    
    SELECT
        ename,
        sal,
        comm 
    FROM
        emp 
    WHERE
        comm IS NULL;
        
    -- 找出哪些人津贴不为NULL?
    SELECT
        ename,
        sal,
        comm 
    FROM
        emp 
    WHERE
        comm IS NOT NULL;
    

    找出哪些人没有津贴?

    SELECT
        ename,
        sal,
        comm 
    FROM
        emp 
    WHERE
        comm IS NULL 
        OR comm = 0;
    

    找出工作岗位是MANAGER和SALESMAN的员工?

    SELECT
        ename,
        job 
    FROM
        emp 
    WHERE
        job = 'MANAGER' 
        OR job = 'SALESMAN';
        
    SELECT
        ename,
        job 
    FROM
        emp 
    WHERE
        job IN ( 'SALESMAN', 'MANAGER' );
    --  not in 不包括
    

    模糊查询like

    % 代表任意多个字, _ 代表任意1个字符

    找出名字当中含有O的?

    SELECT
        ename 
    FROM
        emp 
    WHERE
        ename LIKE '%O%';
    

    找出名字中第二个字母是A的?

    SELECT
        ename 
    FROM
        emp 
    WHERE
        ename LIKE '_A%';
    

    找出名字中最后一个字母是T的?

    SELECT
        ename 
    FROM
        emp 
    WHERE
        ename LIKE '%T';
    

    找出名字中有下划线的?

    SELECT NAME 
    FROM
        t_user 
    WHERE
        NAME LIKE '%\_%';
    

    排序

    按照工资升序,找出员工名和薪资?

    SELECT
        ename,
        sal 
    FROM
        emp 
    ORDER BY
        sal;
        
    -- 默认是升序。 asc表示升序,desc表示降序。
    SELECT
        ename,
        sal 
    FROM
        emp 
    ORDER BY
        sal DESC;
    

    找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。

    SELECT
        ename,
        job,
        sal 
    FROM
        emp 
    WHERE
        job = 'SALESMAN' 
    ORDER BY
        sal DESC;
    

    分组函数

    count 计数
    sum 求和
    avg 平均值
    max 最大值
    min 最小值

    所有的分组函数都是对“某一组”数据进行操作的。所有的分组函数都是对“某一组”数据进行操作的。

    -- 找出工资总和? 
    SELECT
    sum( sal ) 
    FROM
        emp;
        
    -- 找出最高工资? 
    SELECT
    max( sal ) 
    FROM
        emp;
        
    -- 找出最低工资?
    SELECT
    min( sal ) 
    FROM
        emp;
        
    -- 找出平均工资? 
    SELECT
    avg( sal ) 
    FROM
        emp;
        
    -- 找出总人数? 
    SELECT
    count(*) 
    FROM
        emp;
        
    SELECT
        count( ename ) 
    FROM
        emp;
    

    分组函数一共5个。
    分组函数还有另一个名字:多行处理函数。
    多行处理函数的特点:输入多行,最终输出的结果是1行。
    分组函数自动忽略NULL。

    查询补助合计?

    SELECT
        sum( comm ) 
    FROM
        emp;
    -- 等价
    SELECT
        sum( comm ) 
    FROM
        emp 
    WHERE
        comm IS NOT NULL;
    -- 不需要额外添加这个过滤条件。sum函数自动忽略NULL。
    

    找出工资高于平均工资的员工?

    SELECT
        ename,
        sal 
    FROM
        emp 
    WHERE
        sal > ( SELECT avg( sal ) FROM emp );
    
    -- where 后面不可以直接使用分组函数 因为group by是在where执行之后才会执行的
    
    

    SQL语句 执行顺序

    SELECT 5

    ..
    FROM 1

    ..
    WHERE 2

    ..
    GROUP BY 3

    ..
    HAVING 4

    ..
    ORDER BY 6

    ..

    count(*)count(具体的某个字段),他们有什么区别?

    count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
    count(comm): 表示统计comm字段中不为NULL的数据总数量。

    单行处理函数

    计算每个员工的年薪?

    SELECT 
        ename, ( sal + comm )* 12 AS yearsal 
    FROM
        emp;
    -- 以上查询语句错误 所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
    
    SELECT
        ename,(
        sal + ifnull( comm, 0 ))* 12 AS yearsal 
    FROM
        emp;
        
    -- ifnull() 空处理函数?
    -- ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。
    

    GROUP BY 和HAVING

    GROUP BY : 按照某个字段或者某些字段进行分组。
    HAVING: having是对分组之后的数据进行再次过滤。

    找出每个工作岗位的最高薪资。

    SELECT
        max( sal ),
        job 
    FROM
        emp 
    GROUP BY
        job;
    

    注意:分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。
    并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
    当一条sql语句没有group by的话,整张表的数据会自成一组。
    当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。

    每个工作岗位的平均薪资?

    SELECT
        job,
        avg( sal ) 
    FROM
        emp 
    GROUP BY
        job;
    

    找出每个部门不同工作岗位的最高薪资。

    SELECT
        deptno,
        job,
        max( sal ) 
    FROM
        emp 
    GROUP BY
        deptno,
        job;
    

    找出每个部门的最高薪资,要求显示薪资大于2900的数据。

    SELECT
        max( sal ),
        deptno 
    FROM
        emp 
    WHERE
        sal > 2900 
    GROUP BY
        deptno;
        
    -- 建议能够使用where过滤的尽量使用where。
    

    找出每个部门的平均薪资,要求显示薪资大于2000的数据。

    SELECT
        deptno,
        avg( sal ) 
    FROM
        emp 
    GROUP BY
        deptno 
    HAVING
        avg( sal ) > 2000;
    

    相关文章

      网友评论

          本文标题:SQL语句

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