zoukankan      html  css  js  c++  java
  • mysql——查询命令简单汇总

    原文:https://blog.csdn.net/weixin_42057767/article/details/82861873

     

    一、简单查询

    1.数据查询      

     SELECT colName1,colName2,colName3,.. FROM tName [约束]

        SELECT 选择查询列表    FROM 提供数据源(表、视图或者其他数据源)

        //查询所有的列,显示顺序和创建表中的顺序一致

        SELECT * FROM tName 

    =======================================
                            全列/投影查询
    =======================================
    练习
    1,查询所有员工信息
    select * from emp;
    2,查询每个员工的编号、姓名、职位
    select empno,ename,job form emp;
    3,查询所有部门信息
    select * from dept; 

     

     

    2.避免重读(去重)-DISTINCT

    SELECT DISTINCT colName FROM tName

      =======================================
                            消除重复
    =======================================
    distinct关键字可以用于一列,也可以用于多列

    练习
    1,查询所有有员工的部门编号
    select distinct deptno  from emp;
    2,查询哪些部门和职位有员工
    select distinct job,deptno from emp;
     只有当job和deptno相同,才认为是重复的数据。

     

    3.数据运算查询

            对NUMBER类型,可以使用算术操作符创建表达式 (+ - * /)
            对DATE类型,可以使用部分算术运算符创建表达式(+ -)
            运算符优先级
                1.先乘除后加减
                2.同级运算符,从左到右
                3.表达式中使用“括号”,可强行改变运算顺序
    =======================================
                            算术操作符
    =======================================
    练习
    1,查询所有员工的年薪
    select ename,sal * 12 '年薪' from emp;
    2,查询所有员工的年薪(使用别名)
    3,查询每月都有500元的餐补和200元交通补助并且年底多发一个月工资的年薪
    select ename,(sal + 500 + 200)*12+sal '年薪'from emp;
    4,演示date类型数据的运算:查询员工的雇佣日期加上10
    select DATE_ADD(hiredate,INTERVAL 10 DAY) from emp;

     

     

    4.空值查询-IS NULL

    WHERE colName IS NULL

    =======================================
                            空值判断
    =======================================
    空值:
    1、空值是指不可用、未分配的值,也就是没有值。
    2、空值不等于零或空格
    3、任意类型都可以支持空值,也就是说任何类型的字段都可以允许空值作为值的存在
    *注意:包括空值的任何算术表达式都等于空

    练习:
    查询所有员工的年终奖((月薪+奖金)*12)
    select ename,(IFNULL(comm,0)+sal)*12 '年薪' from emp ;
    函数:IFNULL(expr1,expr2)          
    如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2

    使用IS NULL(IS NOT NUll)运算符
    1,查询有奖金的员工信息
    SELECT * from emp where comm is not NULL;
    2,查询公司的老板
    select * from emp where mgr is null;   

     

     

    5.where子句  

        使用WHERE子句限定返回的记录
      

     SELECT colName1,colName2 FROM tName [WHERE 限制条件 AND/OR 限制条件2]

    =======================================

                            限定查询
    =======================================
    注意:
    1、字符串和日期要用单引号扩起来
    2、数字类型直接书写
    3、字符串是大小写不敏感的,日期值是格式敏感的
    4、字符串敏感,需要添加binary关键字

    练习
    要求查询出基本工资高于1500的所有员工信息
    select * from emp where sal >= 1500;
    1,查询名字叫SCOTT的员工所从事的工作
    select * from emp where ename = 'scott';
    严格区分大小写,binary
    select * from emp where binary ename = 'SCOTT';
    2,查询1981年入职的员工信息.
    select * from emp where hiredate between '1981-01-01' and '1981-12-31';

     

    6.比较运算符(字符串类型和日期类型需要加上单引号)

            >,<,>=,<=,=,!=(<>)
      =======================================
                            比较运算符
    =======================================
    常用算术比较运算符:
    1,=,!=,<>,>,>=,<,<=:等于和不等于
    2,BETWEEN ... AND  ...:在两值之间 (包含开始和结尾);
    3,IN(list):匹配列出的值;
    4,LIKE :匹配字符串模式;
    5,IS NULL:是否为空;

    练习:
    使用比较运算符
    1,查询1981年之后入职的员工信息
    select * from emp where hiredate > '1981-12-31';
    2,查询年薪小于3W的员工
    select * from emp where (sal * 12) < 30000;
    3,查询所有不是销售人员的员工信息
    select * from emp where not job = 'salesman';
    使用BETWEEN运算符
    1,查询工资在2000-3000之间的员工信息
    select * from emp where sal between 2000 and 3000;
    2,查询工资不在2000-3000之间的员工信息
    select * from emp where  not sal between 2000 and 3000;
    3,查询1981年入职的员工
    select * from emp where hiredate between '1981-01-01' and '1981-12-31';
            限制区分大小写,在WHERE子句后面加上BINARY(很少用)

     

     

    7.集合查询

            IN运算符,判断列的值是否在指定的集合中
          

     WHERE colName in(value1,value2...)

    1,查询工资为800或1600或3000的员工
    select * from emp where sal in(800,1600,3000);
    2,查询工资不为800或1600或3000的员工
    select * from emp where not sal in(800,1600,3000);

     

    8.模糊查詢

            使用LIKE运算符执行通配符查询,查询条件可包含文字字符或数字,  使用LIKE运算符LIKE运算符必须使用通配符才有意义:
            通配符:用来实现匹配部分值的特殊字符
            匹配单个字符:_;             ->  1个
            匹配任意多个字符:%;      ->  0个、1个、多个
    =======================================
                            like运算符
    =======================================
    1.查询出所有雇员姓名是以A开头的全部雇员信息。
    select * from emp where ename like 'A%';
    2.查询出雇员姓名第二个字母是M的全部雇员信息。
    select * from emp where ename like '_M%';
    3.查询出雇员姓名任意位置上包含字母A的全部雇员信息。
    select * from emp where ename like '%a%';

     

    9.逻辑运算符    

     

    AND                      组合条件都是TRUE,返回TRUE
    OR 一个条件为TRUE,返回TRUE
    NOT     如果跟上的条件为TRUE,返回FALSE

            优先级    比较运算符>NOT>AND>OR
        范围查询-BETWEEN minvalue AND maxvalue[闭区间范围]
            使用between运算符显示某一值域范围内的记录,这个操作符最常见的使用在数字类型和日期类型数据的范围上,但对于字符类型和日期类型同样可用
            select * from tName where colName between minvalue and maxvalue

    =======================================
                            逻辑运算符
    =======================================
    AND:如果组合的条件都是true,返回true.  
    OR:如果组合的条件 之一是true,返回true.
    NOT:如果下面的条件是false,返回true.

    优先级规则:    比较运算符 > NOT > AND > OR

    SQL的执行顺序是from-->where-->select-->ORDER BY

    练习:
    1,查询姓名中有e或者a的员工姓名
    select * from emp where ename like '%e%' or ename like '%a%';
    2,查询工资在1500~3000之间的全部员工信息
    select * from emp where sal between 1500 and 3000;
    3,查询出职位是办事员(CLERK)或者是销售人员(SALESMAN)的全部信息,并且工资在1000以上.
    select * from emp where (job = 'CLERK'or job ='SALESMAN') and sal >= 1000;

     

     

    10.结果排序

        排序语法和规则
            使用ORDER BY 子句将查询记录进行排序
            ASC:升序,缺省
            DESC:降序
            ORDER BY 子句在SELECT子句的最后
        
        按单列排序

      SELECT * FROM tName ORDER BY colName [DESCASC]    
    

        按多列排序(先后)

    SELECT * FROM tName ORDER BY colName1 [DESCASC],colName2 [DESCASC]

        列的别名排序(别名使用单引号之后不能排序)

     
    1. SELECT colName AS cn FROM tName ORDER BY cn [DESCASC]

    2. SELECT colName AS 'c n' FROM tName ORDER BY 'c n' [DESCASC] FALSE

    =======================================
                            结果排序
    =======================================
    使用ORDER BY 子句将记录排序
    ASC: 升序,缺省
    DESC: 降序

    ORDER BY 子句出现在SELECT语句的最后
    ORDER BY 可以使用别名

    练习:
    1,查询所有员工信息,按照工资排序
    select * from emp order by sal ASC;
    2,查询所有员工信息,按照年薪降序排序;
    select ename,sal * 12 '年薪' from emp ORDER BY (sal * 12) DESC;
    3,查询所有员工信息,按照部门和年薪降序排序;
    select ename,deptno,sal * 12 '年薪' from emp ORDER BY deptno desc,sal * 12 ASC;
     

     

    11.列別名

            1.改变列的标题头       
            2.用于表示计算结果的含义
            3.作为列的表名
            4.如果别名中使用特殊字符,或者强制大小写敏感,或者有空格的时候,都需要加单引号(不建议使用列的别名使用单引号,因为一旦使用,该列不能排序)
            5.as可以省略(不建议省略)
            SELECT colName as newName FROM tName

     

     

     

    MySQL查询函数

        函数的分类:
        1,单行函数:将每条数据进行独立的计算,然后每条数据得到一条结果。
        2,多行函数:多条数据同时计算,最终得到一条结果数据。也成为聚集函数、分组函数, 主要用于完成一些统计功能。

     

     

     

    二、聚合函数(组函数、多行函数)

     聚合函数作用于一组数据,并且对一组数据返回一个值

        统计结果记录数:COUNT
        统计计算最大值:MAX
        统计计算最小值:MIN
        统计计算求和:   SUM
        统计计算平均值:AVG

     
    1. SELECT AVG(colName1) FROM tName

    2. SELECT COUNT(*)COUNT(id) FROM tName

    =======================================
                多行函数--->常用的统计函数
    =======================================
    分组函数在计算时省略列中的空值
    不能在where语句中使用分组函数

    查询所有员工每个月支付的平均工资及总工资
    select AVG(sal),sum(sal) from emp;
    查询月薪在2000以上的员工总人数.
    select COUNT(*) from emp where sal > 2000;
    查询员工最高工资和最低工资差距
    select MAX(sal),MIN(sal) from emp;

     

     

     

    三、单行函数

    1.字符函数

    =======================================
                单行函数--->字符函数
    =======================================

        (1).字符串大小写转换

        LOWER(str):返回字符串str变为小写字母的字符

     

        UPPER(str):返回字符串str变为大写字母的字符
        --------------------------------------------------------
        把HelloWorld转换为全大写,全小写.
        select LOWER('HelloWorld');
        select UPPER('HelloWorld');

        (2).字符串拼接

        CONCAT(str1,str2,...):

     

        1,返回结果为连接参数产生的字符串。
        2,如有任何一个参数为NULL ,则返回值为 NULL
        3,允许有一个或多个参数
        -------------------------------------------------------
        1,查询所有员工的全名
        select CONCAT('查询出',ename,'的全名') from emp;
        2,查询得到输出结果:某某's'的月薪是:xx
        select CONCAT(ename,'的月薪是',sal) from emp;

        (3).查看字符串长度

        CHAR_LENGTH:字符串长度;

     

        LENGTH:字符串长度(单位为字节);

        对比试验:
        SELECT CHAR_LENGTH('龙哥17岁') FROM DUAL;
        SELECT LENGTH('龙哥17岁') FROM DUAL;
     

        (4).字符串填补

        LPAD(str,len,padstr)

     

        1,返回字符串str, 其左边由字符串padstr 填补到len字符长度。
        2,假如str 的长度大于len, 则返回值被缩短至len 字符。
        SELECT LPAD('ABC',7,'X'),LPAD('ABC',5,'X'),LPAD('ABC',3,'X'),LPAD('ABC',1,'X') FROM DUAL;
        返回的结果是XXXXABC             XXABC             ABC                A

        RPAD(str,len,padstr)

     

        1,返回字符串str, 其右边被字符串padstr填补至len 字符长度。
        2,假如字符串str 的长度大于 len,则返回值被缩短到与len 字符相同长度。
     

        (5).字符串去空格

        LTRIM(str):左边空格被trim掉;
        RTRIM(str):右边空格被trim掉;

        TRIM(str)=LTRIM+RTRIM
        TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str):高级用法,从str中按照指定方式截取remstr;
        TRIM(remstr FROM] str):相当于TRIM(BOTH remstr FROM str);

        SELECT LTRIM(' A B C '),RTRIM(' A B C '),TRIM(' A B C ') FROM DUAL;
        返回的结果是   A B C_          _A B C           A B C

        

         (6).字符串替换

        REPLACE(str,from_str,to_str):

     

        1,在str中把from_str全部替换为to_str;
        2,大小写敏感;

        SELECT REPLACE('ABCDaBCABA','A','X') FROM DUAL;
                                    XBCDaBCXBX

       

        (7).字符串截取

        SUBSTRING(str,pos):

     

        从字符串str返回一个子字符串,起始于位置pos
        SELECT SUBSTRING('asdfghijkl', 3);         [0,3)       dfghijkl

       

        SUBSTRING(str,pos,len):

        从字符串str返回一个长度同len字符相同的子字符串,起始于位置pos
        SELECT SUBSTRING('asdfghjkl', 3, 2);                df

        如果pos是负数,从字符串尾部开始计算;
        SELECT SUBSTRING('ABCDEF',-3),SUBSTRING('ABCDEF',-3,3) FROM DUAL;

                                        def                                                def

     

     

    2.数字函数

    =======================================
                单行函数--->数字函数
    =======================================

        (1).取绝对值

            ABS(x):返回一个数字的绝对值;

            SELECT ABS(-17),ABS(17) FROM DUAL;

            17       17

        (2).取模 

            MOD(N,M):返回N 被 M除后的余数;
            SELECT MOD(10,5),MOD(10,3) FROM DUAL;
            0         1

        (3).取天花板

            CEIL(x):返回不小于X 的最小整数值;

            SELECT CEIL(0.5),CEIL(-1.5),CEIL(1.5) FROM DUAL;
                              1         -1        2

        (4).取地板

            FLOOR(x):返回不大于X的最大整数值;
            SELECT FLOOR(0.5),FLOOR(-1.5),FLOOR(1.5) FROM DUAL;
                                    0              -2         1

        (5).四舍五入

            ROUND(X) /ROUND(X,D):

            1,返回参数X, 其值接近于最近似的整数。  
            2,在有两个参数的情况下,返回X ,其值保留到小数点后D位,而第D位的保留方式为四舍五入。
            3,若要接保留X值小数点左边的D 位,可将 D 设为负值。
            select ROUND(1.5);
            select ROUND(1.49);
            SELECT ROUND(3.1465926,2);            3.15
            SELECT ROUND(321.1415926,-2);
            TRUNCATE(X,D)

            (6).截去函数

            1,返回被舍去至小数点后D位的数字X。

                select TRUNCATE(3.1415926,2);
            2,若D 的值为 0, 则结果不带有小数点或不带有小数部分。可以将D设为负数,若要截去(归零) X小数点左起  第D位开始后面所有低位的值.
                select TRUNCATE(3.1415926,0);
                select TRUNCATE(312.1415926,-1);

     

    3.日期函数

    =======================================
                单行函数--->日期函数
    =======================================
    获取当前系统时间
    select NOW();

    DATE_ADD(date,INTERVAL expr type)/DATE_SUB(date,INTERVAL expr type)向日期添加指定的时间间隔
    1,执行日期运算;
    2,date 是一个 DATETIME 或DATE值,用来指定起始时间;
    3,expr 是一个字符串表达式,用来指定从起始日期添加或减去的时间间隔值;
    4,type 为关键词,它指示了表达式被解释的方式

    SELECT DATE_ADD('2016-10-13',INTERVAL 22 DAY) FROM DUAL;        2016-11-4
    SELECT DATE_ADD(NOW(),INTERVAL 100 DAY) FROM DUAL;

    使用方法参考MYSQL 5.5中文参考手册547页;
    --------------------------------------------------------------------------
    type 参数可以是下列值:
    Type 值
    MICROSECOND
    SECOND
    MINUTE
    HOUR
    DAY
    WEEK
    MONTH
    QUARTER
    YEAR
    SECOND_MICROSECOND
    MINUTE_MICROSECOND
    MINUTE_SECOND
    HOUR_MICROSECOND
    HOUR_SECOND
    HOUR_MINUTE
    DAY_MICROSECOND
    DAY_SECOND
    DAY_MINUTE
    DAY_HOUR
    YEAR_MONTH

    SELECT CURRENT_DATE(),CURRENT_TIME() FROM DUAL;

    DATEDIFF(expr,expr2):返回起始时间expr和结束时间expr2之间的天数

    SELECT DATEDIFF('2016-05-08','2016-11-04')'天数' FROM DUAL;

    DAY(date):获取日期中的天数(DAYOFMONTH)
    select DAY(NOW());
    HOUR(time)
    返回time 对应的小时数。对于日时值的返回值范围是从 0 到 23
    select HOUR(NOW());
    MINUTE(time)
    返回 time 对应的分钟数,范围是从 0 到 59
    select MINUTE(NOW());
    MONTH(date)
    返回date 对应的月份,范围时从 1 到 12。
    select MONTH(NOW());
    YEAR(date)
    返回date 对应的年份,范围是从1000到9999。
    select YEAR(NOW());
    LAST_DAY(date)
    获取一个日期或日期时间值,返回该月最后一天对应的值
    select LAST_DAY(NOW());
    UNIX_TIMESTAMP(date):它会将参数值以'1970-01-01 00:00:00' GMT后的秒数的形式返回
    FROM_UNIXTIME(unix_timestamp) , FROM_UNIXTIME(unix_timestamp,format):返回'YYYY-MM-DD HH:MM:SS'或指定format的日期

    SELECT UNIX_TIMESTAMP(NOW()) FROM DUAL;

    SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())) FROM DUAL;

     

     

    4.转换

    =======================================
                单行函数--->转换函数
    =======================================
    FORMAT(X,D)
    将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后D 位, 并将结果以字符串的形式返
    回。若D 为 0, 则返回结果不带有小数点,或不含小数部分。
    SELECT FORMAT(123456.789,2) FROM DUAL;

    格式:DATE_FORMAT(date,format):把日期转换为字符串.

    SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') FROM DUAL;

    STR_TO_DATE(str,format):把字符串转换为日期。
    SELECT STR_TO_DATE('2015/11/29','%Y/%m/%d') FROM DUAL;


    单行函数可被嵌入到任何层在嵌套的时候,最内层的函数最先被执行,执行的结果被传递到它的外层函数,作为参数使用,然后依次从内向外执行,直到所有的函数执行完。


     

    三、分页查询

        MySQL的分页设计:
        假分页(逻辑分页,内存分页):
            一次性查询出所有的数据存放在内存中,每次翻页的时候,都从内存中取出
            指定的条数
            特点:翻页比较快,如果数据量过大,可能造成内存溢出,不推荐
        
        真分页(物理分页,数据库分页)(推荐):
            每次翻页都从数据库中截取指定的条数
            假设每页十条数据,第一页0~9,第二页重新查询10~19条数据
            特点:翻页比较慢,不会造成内存溢出

        设计:
            int pageSize=3:表示每页最多显示3条数据
            第一页:SELECT * FROM tName LIMIT 0,3
            第二页:                                                3,3
            第三页:                                                   6,3    

            分页查询结果集的SQL

     
    1. SELECT * FROM tName LIMIT ?,?;

    2. 第一个?:(currentPage-1)*pageSize

    3. 第二个?:pageSize

  • 相关阅读:
    分享一些曾经设计的ASP.NET自定义服务端控件(附源程序下载)
    使用SuperSocket实现TLV自定义协议网络通信的Demo
    让Silverlight支持GB2312中文编码
    在Sqlite中通过Replace来实现插入和更新
    在VS2010项目中引用Lib静态库(以Openssl为例)
    金融系统中PBOC/EMV的TLV的算法实现(含C++/C#)
    在Windows下C++实现UNIX中的GZ格式的解压缩(附工具)
    Opensuse网络配置备忘
    项目管理理论与实践系列文章索引
    让Windows远程访问Opensuse桌面的解决办法
  • 原文地址:https://www.cnblogs.com/heymonkey/p/11812302.html
Copyright © 2011-2022 走看看