准备数据

emp 员工表

--员工表DDL
CREATE TABLE `emp` (
  `EMPNO` int(11) NOT NULL COMMENT '员工号',
  `ENAME` varchar(12) DEFAULT NULL COMMENT '员工姓名',
  `JOB` varchar(10) DEFAULT NULL COMMENT '职位',
  `MGR` int(11) DEFAULT NULL COMMENT '经理',
  `HIREDATE` varchar(11) DEFAULT NULL COMMENT '入职日期',
  `SAL` double DEFAULT NULL COMMENT '薪水',
  `COMM` double DEFAULT NULL COMMENT '奖金',
  `DEPTNO` int(11) DEFAULT NULL COMMENT '部门号',
  PRIMARY KEY (`EMPNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表';

开始查询

SELECT

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
      [PARTITION partition_list]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
    [HAVING where_condition]
    [WINDOW window_name AS (window_spec)
        [, window_name AS (window_spec)] ...]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR {UPDATE | SHARE} [OF tbl_name [, tbl_name] ...] [NOWAIT | SKIP LOCKED] 
      | LOCK IN SHARE MODE]]

查询所有员工信息

--查询所有的员工信息
--方式一:*
select * from emp;
--方式二:列名
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp;

都得到如下结果:

/*
SQL> SQL优化的原则:
SQL> 1。尽量使用列名
SQL> 
*/
--对不同的表需要对*做查询转换,而直接使用列名时不需要,所以性能更高

查询员工信息(字段)

--查询员工信息:员工号 姓名 月薪 年薪 奖金 年收入
select empno,ename,sal,sal*12,comm,sal*12+comm from emp;

得到如下结果: 请注意观察年收入一列,数据是否合理? -->很明显年收入有很多空值(不难发现,奖金为空的记录所对应的年收入也为空 -->实际生活中就算没有奖金,年收入也不是空 由此引出SQL中的空值问题:

SQL> /*
SQL> SQL中的null
SQL> 1、包含null的表达式都为null
SQL> 2、null永远!=null
SQL> */

其中第一条上面的年收入问题即可体现,而第二条可以看以下例子:

--查询奖金为null的员工
select * from emp where comm=null;

执行上述SQL后查询结果为空。 解决方法 问题一:计算年收入时使用滤空函数 IFNULL(expr1,expr2)

--mysql为:IFNULL(expr1,expr2)
--oracle为:--nvl(a,b)   nvl2
If expr1 is not NULL, IFNULL() returns expr1; otherwise it returns expr2.
--优化查询员工信息:员工号 姓名 月薪 年薪 奖金 年收入
select empno,ename,sal,sal*12,comm,sal*12+IFNULL(comm,0) from emp;

问题二:使用IS NULLIS NOT NULL

--优化查询奖金为null的员工
select * from emp where comm is null;

别名

select empno as "员工号",ename "姓名",sal "月    薪",sal*12 as '12',comm 奖金,sal*12+IFNULL(comm,0) '*' from emp;
--如需要使用特殊字符作为别名,则必须用引号将别名引起来

distinct 去掉重复记录

SQL> select job from emp;

JOB                                                                                                                     
---------                                                                                                               
CLERK                                                                                                                   
SALESMAN                                                                                                                
SALESMAN                                                                                                                
MANAGER                                                                                                                 
SALESMAN                                                                                                                
MANAGER                                                                                                                 
MANAGER                                                                                                                 
ANALYST                                                                                                                 
PRESIDENT                                                                                                               
SALESMAN                                                                                                                
CLERK                                                                                                                                                 CLERK                                                                                                                   
ANALYST                                                                                                                 
CLERK                                                                                                                   

SQL> select distinct job from emp;

JOB                                                                                                                     
---------                                                                                                               
CLERK                                                                                                                   
SALESMAN                                                                                                                
PRESIDENT                                                                                                               
MANAGER                                                                                                                 
ANALYST  
SQL> select distinct deptno,job from emp;

    DEPTNO JOB                                                                                                          
---------- ---------                                                                                                    
        20 CLERK                                                                                                        
        30 SALESMAN                                                                                                     
        20 MANAGER                                                                                                      
        30 CLERK                                                                                                        
        10 PRESIDENT                                                                                                    
        30 MANAGER                                                                                                      
        10 CLERK                                                                                                        
        10 MANAGER                                                                                                      
        20 ANALYST  

--distinct作用于后面所有的列

concat 连接字符

--mysql为:concat函数
select concat('Hello','  World');
Hello  World

--oracle为:连接符 ||
--查询员工信息:***的薪水是****
select ename||'的薪水是'||sal 信息 from emp;

信息                                                                                                                    
----------------------------------------------------------                                                              
SMITH的薪水是800                                                                                                        
ALLEN的薪水是1600                                                                                                       
WARD的薪水是1250                                                                                                        
JONES的薪水是2975                                                                                                       
MARTIN的薪水是1250                                                                                                      
BLAKE的薪水是2850                                                                                                       
CLARK的薪水是2450                                                                                                       
SCOTT的薪水是3000                                                                                                       
KING的薪水是5000                                                                                                        
TURNER的薪水是1500                                                                                                      
ADAMS的薪水是1100                                                                                                       
JAMES的薪水是950                                                                                                        
FORD的薪水是3000                                                                                                        
MILLER的薪水是1300

--dual表:伪表 --伪列

--mysql
select concat('Hello','  World') from dual;
--oracle
select 'Hello'||'  World' 字符串 from dual;
最后修改于 2019-05-08 23:45:15
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇