第四章 数据基本查询

本文主要讲解了SQL语言中用于基础数据查询的操作,包括SELECT语句的使用,如何选择特定列、过滤行、排序结果以及聚合函数的应用。通过实例解析,帮助读者掌握数据查询的基本技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据表的查询原理:
                从源表中根据需要查询的列和条件逐行对数据进行判断并将满足条件的行重新放入一张新表中,这张新表就是我们看到的查询结果表格。
                查询的结果称为结果表,查询的结果集是数据库中的虚拟表,将数据文件的内容以表格的方式进行呈现的结果。

1、查询语法
    select    *    from    表名
*    是SQL中的通配符,用来匹配表中的所有数据列。
  1. select * from users

   select    列名,列名    from    表名    where    条件
  1. --查询users所有的人的姓名
  2. select userName from users
  3. --查询user表中所有人的姓名和他的邮箱
  4. select userName,email from users
  5. --查询没有填写邮箱的用户姓名,年龄和生日
  6. select userName,age,birthday from users where email is null

2、指定列名查询
       select    列    as    显示列名    from    表名
     或者select    列    显示列名    from    表名
第二种相对于第一种少个as,但第一种比较直观,所以尽量使用前者。
  1. --查询员工的姓名和对应的薪水
  2. select first_name||last_name as empName,salary from emp
  3. select first_name||last_name empName,salary from emp

3、为表起别名
           select    *    from    表名 新表名
注意:这里没有as,不同于为列起别名
  1. --为表起别名
  2. select * from users u

4、常量列的查询
源表中没有的列作为常量进行查询, 如下num列下 都是10
  1. --常量列的查询
  2. select first_name||last_name as empName,salary,sysdate as oprate_time,10 as num from emp

5、排序查询
           select    列名    from    表名    where    条件    order    by   列  
升序排列  asc (默认值)
降序排列  desc
  1. --查询员工的姓名和薪资,并按照由低到高的方式进行呈现
  2. --asc表示升序,默认排序就是升序的方式,desc表示降序
  3. select first_name||last_name as empName,salary from emp order by salary asc
  4. --由高到底显示工资
  5. select rownum,first_name,salary from emp order by salary desc
       1)order by 通常对列进行排序,同时也可以对表达式的结果进行排序呢
  1. select * from emp order by salary+500
       2)也可以对数字、日期、字母进行排序
  1. select * from emp order by first_name

       3)可以对多个列进行排序,
多个列的排列原则,优先排序第一个列,当第一个列的值存在重复的情况,才会对第二个列进行排序,并且每个排序列需要单独设置排序策略
  1. --要求入职时间升序排列,薪资降序排列
  2. select * from emp order by hire_date asc,salary desc

6、rowid 和 rownum
rowid
  1. select rowid from emp
结果如下:
 
rownum
    rownum在结果集生成后由Oracle自动分配,且必须从1开始,所有基于rownum的查询也必须从1开始。
  1. --每页5条数据,查询第一页的数据
  2. select first_name||last_name,salary from emp where rownum between 1 and 5




Oracle 函数
    函数是PL/SQL对SQL的补充
     Oracle函数只在Oracle中使用

日期转换格式
    YYYY                    完整年份
    MM                        月份
    DD                        天数
    HH24                    24制小时
    MI                          分钟
    SS                        秒
    YEAR                    年份拼写
    RR                        数值年份的最后两位
    MON                    月份字母的缩写
    DAY                      星期

数值转换格式
     9                任意数值
     0                以0显示
     L                本地系统货币符号
     .                  小数点
     ,                 千位符
     $                以$显示

0 和 9 的区别:0对不足位数的数字进行补位,9不会补位。
例子:
  1. --将数值按照指定的格式转换
  2. select to_char('1234.4567','99999.99') from dual
  3. --格式化字符0将进行对不足位数的数字进行补位
  4. select to_char('1234.4567','000000.000') from dual
  5. select to_char(123456.789,'$9,999,999.99') from dual
  6. --查询所有员工的姓名和薪资,薪资使用财务方式来呈现
  7. select first_name||last_name as empName,to_char(salary,'$99,999,999.99') as salary from emp

常用的Oracle函数
        1、字符函数
        2、日期函数
        3、数值函数
        4、转换函数


7、转换函数
        1)to_char    用于将字符格式化,或者日期转换成字符串
                获取日期中指定单位
  1. --获取日期中的指定单位
  2. select to_char(sysdate,'mm') from dual
  1. --查询部门编号为80-100的员工的姓名,入职的年份,以及薪水
  2. select first_name||last_name as empName,to_char(hire_date,'yyyy') as hire_year,salary from emp where department_id between 80 and 100
  3. --将这个月入职的员工薪资全部提高100
  4. update emp set salary=salary+100 where to_char(sysdate,'mm')=to_char(hire_date,'mm')

        2)to_date    将字符串转换成date类型
  1. select to_date('20160710','yyyymmdd') from dual

        3)to_number   将字符转换成number类型
  1. select to_number('2016') from dual
  1. select * from emp order by to_number(to_char(hire_date,'yyyy'))


8、字符串函数
        1)upper    转换成大写
  1. --将字母转换成大写
  2. select upper('niit') from dual

        2)lower    转换成小写
  1. --将字母转换成小写
  2. select lower('NIIT') from dual

  1. --查询名字中首字母是t(不区分大小)的用户名字和入职时间
  2. select first_name||last_name as empName,hire_date from emp where upper(first_name) like 'T%'
  3. select first_name||last_name as empName,hire_date from emp where lower(first_name) like 't%'

        3)initcap    首字母大写
  1. --首字母大写
  2. select initcap(userName) from users

        4)concat    字符串连接
  1. --拼接字符串
  2. select concat(first_name,last_name) from emp
  3. select first_name||last_name from emp

        5)length    获取字符数
  1. --获取字符串的长度
  2. select length('helloniit') from dual
  3. --查询users表中姓名长度超过4位的用户信息
  4. select * from users where length(userName)>4

        6)lpad        左填充
        7)rpad        右填充
  1. --左右填充数据
  2. --第一个参数表示源字符串,第二个参数表示填充的长度,第三个参数表示填充的字符
  3. select lpad('niit',6,'*') from dual
  4. select rpad('niit',10,'#') from dual

        8)ltrim        去除左空格
  1. --去除左空格
  2. select length(ltrim(' niit')) from dual

        9)rtrim        去除右空格
  1. --去除右空格
  2. select length(rtrim('niit ')) from dual

  1. --去除左右空格
  2. select ltrim(rtrim(' niit ')) from dual

        10)instr        获取查询字符串的索引
                第一个参数表示源字符串,第二个参数表示要搜索的字符,第三个参数可以不写,默认从1开始,表示起始的检索位置
                索引从1开始,如果检索不到数据则返回0
  1. select instr('hello niit','l',5) from dual
  1. --查询使用niit邮箱的用户
  2. select * from users where instr(email,'@niit.com') != 0


        11)substr    截取字符串
                如果只传一个索引 表示从该索引截取到最后
                如果传2个数值参数,第二个数值参数表示截取的长度
  1. --截取字符串
  2. select substr('hello niit123',2,5) from dual;
  1. --查询编号为1020用户的邮箱用户名和邮箱名
  2. select substr(email,1,instr(email,'@')-1),substr(email,instr(email,'@')+1) from users where userId=1020
  3. --要求查询用户的姓名和电话号码,要求电话号码进行加密呈现(只显示电话号码的前三位和后三位,其余部分用*屏蔽)
  4. select substr(tel,1,3)||lpad(substr(tel,length(tel)-2),length(tel)-3,'*') from users

        12)replace    替换字符串
                       第一个参数表示源字符串,第二个参数表示被替换的字符,第三个参数表示替换的新字符
  1. --替换字符串内容
  2. select replace('niit','i','a') from dual

9、日期函数
            1)sysdate                        获取系统时间
 
            2)extract                          获取时间单位
  
  1. --获取年月日单位
  2. select extract(year from sysdate) from dual;
  3. select extract(month from sysdate) from dual;
  4. select extract(day from sysdate) from dual;
  5. select userName,extract(year from birthday) from users

            3)months_between         计算月差
  1. --获取月份的差值,返回浮点数
  2. select months_between(sysdate,to_date('20150519','yyyymmdd')) from dual
  3. --date可以直接使用算数运算符计算,获得天数的差
  4. select sysdate-to_date('20160818','yyyymmdd') from dual

            4)add_months                 添加月份
  1. --添加月份 返回增加月份后的date类型
  2. select add_months(sysdate,5) from dual
  3. --sysdate+1是添加天数
  4. select sysdate+1 from dual

例子:
  1. --查询15年前入职的员工姓名和入职的时间
  2. select first_name||last_name as empName,hire_date from emp where months_between(sysdate,hire_date)/12>=15
  3. --查询15年前入职的员工姓名和入职的时间
  4. select first_name||last_name as empName,hire_date from emp where add_months(hire_date,15*12)<=sysdate

            5)next_day                       下一个星期数
  1. --查询最近的指定星期的日期
  2. select next_day(sysdate,'星期一') from dual


额外例子:
  1. --查询今天生日人的姓名和出生年月
  2. select userName,birthday from users where to_char(sysdate,'mm')=to_char(birthday,'mm') and to_char(sysdate,'dd')=to_char(birthday,'dd')
  3. select userName,birthday from users where to_char(sysdate,'mmdd')=to_char(birthday,'mmdd')
  4. select to_char(sysdate,'mmdd') from dual
  5. --查询最近的周一生日的人的姓名和出生年月
  6. select userName,birthday from users where to_char(next_day(sysdate,'星期一'),'mmdd')=to_char(birthday,'mmdd')
  7. --查询7天内生日的人
  8. select userName,birthday from users where to_date(to_char(birthday,'mmdd'),'mmdd') between to_date(to_char(sysdate,'mmdd'),'mmdd') and to_date(to_char(sysdate+7,'mmdd'),'mmdd')
  9. select to_char(to_date(to_char(sysdate,'mmdd'),'mmdd'),'yyyy-mm-dd hh24:mi:ss') from dual

            6)last_day                        当月的最后一天
  1. --获取这个月的最后一天
  2. select last_day(sysdate) from dual

            7)round                            对日期四舍五入
                    如果参数是year则用来判断是否是上下半年,如果是上半年则返回当前年份的1月1日,如果是下半年则返回下一年的1月1日
                   如果参数是month则用来判断是否是上下半月,如果是上个月则返回当前年月的第一天
                   如果参数是day则用来判断是否是上下礼拜,如果是前半星期,则返回当前星期的第一天(日)
  1. select round(sysdate,'day') from dual

            8)trunc                             获取特定时间的第一天
                       year获取这一年的第一天
                       month获取这个月的第一天
                       day获取这个星期的第一天     
  1. select trunc(sysdate,'year') from dual

例:
  1. --查询下个月第一天生日的人
  2. select userName,birthday from users where to_char(add_months(trunc(sysdate,'month'),1),'mmdd')=to_char(birthday,'mmdd')


10、数值函数
            1)abs                               绝对值
            2)ceil                               向上取整
            3)floor                              向下取整
            4)power                           幂次方
                    power(2,3) ------->8
            5)round                            四舍五入
                   有两个参数,第二个参数表示保留的小数位数
            6)sqrt                               平方根
            7)trunc                             整值截断
                    截断函数,根据指定的小数位直接截取数字
            8)mod                               整数取余
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值