SQL查询操作一

Select语句 

  

 1. 基本查询:

        I. 语法:select 列名 from 表名

        II. 详解:

        select:指定查询的列。

        from:指定要查询的表。

        III. 用例:

        1 ). 查询部分列:

        //查询员工表中所有员工编号、名字、邮箱。

    select employee_id , first_name , email

    from employees


        2). 查询所有列:

        //查询员工表中所有员工的所有信息。

    select *

    from employees;

注意:生产环境中,建议使用列名(效率高)。

    3). 对列中数据的运算:+ - * / (%:通配符)

    //查询编号、名字、年薪

    select employee_id , first_name , salary * 12

    from employees;


    4). 列的别名:列 as "别名"

    //查询编号、名字、年薪

    select employee_id as "编号" , first_name as "名字" , salary * 12 as "年薪"

    from employees;

 

    5). 拼接字符串:字符串1 || 字符串2

    //查询编号和“姓名”(first_name || last_name)

    select employee_id , first_name || '.' || last_name as "姓名"

    from employees

注意:SQL中字符或字符串是使用 ' (单引号)表示,查询结果中的字符串拼接使用 || 和 '字符串',"本文"应用在别名。

 

    6). 查询结果去重:(单列中,重复结果只保留一个)

    //查询所有经理的ID

    select distinct manager_id

    from employees;

 

    2. 排序:对查询后的数据进行排序。

        I. 语法:select ... from ... order by 排序列

        II. 详解:order by 排序列 [asc] [desc] 默认升序

        III. 用例:

    1). 依据单列排序:

    //查询员工的编号,名字,薪资。按照工资高低进行升序排序。

    select employee_id , first_name , salary

    from employees

    order by salary desc

 

    2). 依据多列排序:

    //查询员工的编号,名字,薪资。按照工资高低进行升序排序(薪资相同时,按照编号进行升序排序)。

    select employee_id , first_name , salary

    from employees

    order by salary asc , employee_id asc

 

    3. 条件查询:筛选符合条件的结果。

            I. 语法:select ... from ... where 布尔表达式

            II. 详解:where 布尔表达式 //可执行条件筛选

            III. 用例:

        1). 等值判断(=):

        / /查询薪资是11000的员工信息(编号、名字、薪资)

        select employee_id , first_name , salary

        from employees

        where salary = 11000;

注意:与Java不同,SQL中的"="代表表达式左右的两值相等

 

         2). 多条件查询(and、or、not):

        //查询薪资是11000并且提成是0.30的员工信息(编号、名字、薪资)

    select *

    from employees

    where salary = 11000 or commission_pct = 0.30

 

        3). 不等值判断:(>、<、>=、<=、!=、<>)

        //查询员工的薪资在6000~10000之间的员工信息(编号,名字,薪资)

    select *

    from employees

    where salary >= 6000 and salary <= 10000;

 

    //查询员工的薪资不是24000员工信息

        select *

        from employees

        where salary <> 24000;

        4). 区间判断(between and):

        //查询员工的薪资在6000~10000之间的员工信息(编号,名字,薪资)

        select *

        from employees

        where salary between 6000 and 10000;

 

        5). null值判断:DBNull(is null、is not null)

    //查询没有提成的员工信息(编号,名字,薪资 , 提成)

    select *

    from employees

    where commission_pct is not null


        6). 枚举判断(in(v1,v2,v3,...)):

    //查询部门编号为70、80、90的员工信息(编号,名字,薪资 , 部门编号)

    select *

    from employees

    where department_id in(70,80,90);

 

        7). 模糊查询:(%:任意长度的任意字符; _:长度为1的任意字符)

    //查询名字以"L"开头的员工信息(编号,名字,薪资 , 部门编号)

    select *

    from employees

    where first_name like 'L%'

 

    //查询名字以"L"开头并且长度为4的员工信息(编号,名字,薪资 , 部门编号)

    select *

    from employees

    where first_name like 'L___'

 

4. 时间查询:

    I. 语法:select 系统时间 from 表名[虚表]

    II. 详解:

        sysdate:当前系统时间(年、月、日、时、分、秒、星期、上下午),常见格式。

        systimestamp:当前系统时间(年、月、日、时、分、秒、毫秒),默认格式

        dual表:虚表(一行一列),保证查询语句完整性。

        III. 用例:

        //查询当前系统时间

    select sysdate

    from dual;

 

    select systimestamp

    from dual;

 

5. 单行函数:

        I. 语法:select 单行函数(列名) from 表名

        II. 详解:

        to_char( 日期 , '日期格式' ):将日期通过指定格式进行字符串转换。

        to_date( 字符串 , '日期格式' ):将字符串通过指定格式进行日期转换。

 

        III. 用例:

        1). 日期转字符串:

        //将当前系统时间转换成(yyyy-mm-dd hh:mi:ss day)格式。

    select to_char(sysdate , 'yyyy-mm-dd hh:mi:ss day')

    from dual;

 

        2). 字符串转日期:

        //将和日期兼容的字符串按照(yyyy-mm-dd hh24:mi:ss:ff day)转换成日期。

    select to_date('19950101','yyyy-mm-dd')

    from dual;

 

        3). 查询2008.08.08是星期几?

        --1.获得代表这个时间的日期对象

      

  select to_date('2008/8/8','yyyy/mm/dd') from dual;--日期

 

        --2.获得该对象的"星期"组成部分

    

    select to_char( to_date('2008/8/8','yyyy/mm/dd') , 'yyyy-mm-dd day')

        from dual;

        4). mod(被除数 , 除数):模运算,求余数

    select mod(5,3) //余2

    from dual;

 

    select mod(salary,10000)

    from employees;

//为107行数据的salary列,进行取余的调用,结果为107行

 

6. 聚合函数(组函数):对表中数据进行统计,并返回统计后的结果(往往都是一行数据)。

        I. 语法:select 聚合函数(列名) from 表名

        II. 详解:

        sum():求和

        avg():平均数

        max():最大值

        min():最小值

        count():总行数、计数器

        III. 用例:

        //统计所有员工每月的工资总和

    select sum(salary)

    from employees

 

        //统计所有员工每月的平均工资

    select avg(salary)

    from employees

 

        //查看所有员工最高月薪

    select max(salary)

    from employees

 

        //查看所有员工最低月薪

    select max(salary)

    from employees

 

        //统计员工总人数

     select count(*)

    from employees;

 

        //统计有提成的员工人数

    select count(commission_pct)

    from employees

 

        //查询所有工号、名字、薪资、提成、月收入

    select employee_id , first_name , salary , commission_pct , salary + salary * commission_pct

    from employees //Error

    注意:当null参与运算时,结果为null。

 

    select nvl(commission_pct , 0) from employees  //commission_pct != null ?  commission_pct : 0

 

    select employee_id , first_name , salary , commission_pct , salary + salary * nvl(commission_pct , 0)

    from employees //Correct


7. 分组查询:

        I. 语法:select ... from ... where ... group by 分组依据

        II. 详解:分组依据(列) //此列具有几个不同值,及分为几组

        III. 用例:

        //查询各个部门的总人数

    select department_id , count(employee_id)

    from employees

    group by department_id -- 部门编号相同的多条数据,进行一次统计,返回一行数据。(有多少个不同部门,就有多少组,就要统计多少次)

 

        //查询各个部门的平均工资

    select department_id , avg(salary)

    from employees

    group by department_id

        //查询各个部门、各个岗位的人数

    select department_id , job_id , count(*)

    from employees

    group by department_id , job_id

 

        //查询各个部门id、总人数、first_name  --无解

    注意:分组查询中,select显示的列只能是分组依据、聚合函数的结果,不能出现其他列。

 

8. 分组过滤:

        I. 语法:select ... from ... where ... group by ... having 过滤规则

        II. 详解:过滤规则(分组后的数据进行筛选)

        III. 用例:

        //统计60、70、90号部门的最高工资

    select department_id , max(salary)

    from employees

    where department_id in(60,70,90)  //先将符合条件的9个人筛选出来,再进行分组

    group by department_id //Error

 

    select department_id , max(salary)

    from employees

    group by department_id

    having department_id in(60,70,90) //Correct 先分组,再筛选


        //查询平均工资超过7000的部门编号和人数(可附加:平均工资,并且不显示没有部门编号的)

    select department_id , avg(salary) , count(*)

    from employees

    group by department_id

    having avg(salary) > 7000

注意:where可判断表中存在的列(未分组前数据),having可判断表中不存在的列(聚合函数统计出来的列)。

猜你喜欢

转载自blog.csdn.net/sugar_map/article/details/79763681