SQL(Structured Query Language):结构化查询语言

SQL分类:
    数据操纵语言DML(Data Manipulation Language)
        SELECT   INSERT   UPDATE    DELETE
    数据定义语言DDL(Data definition language)
        CREATE   ALTER   DROP   RENAME    TRUNCATE
    数据控制语言DCL (Data Control Language)
        GRANT   REVOKE

select关键字
--select[列1,列2,...列N]from 表
--oracle中,列名和表名默认不区分大小写,数据是区分大小写的
作用:检索“列”

注意:1.select后面的列可以起别名(查询的显示结果)
        1) 列名后面一个空格后添加别名(别名中不许有“空格”)
        例:select ename,sal*12 "年薪" from emp;
        2) 列名后面一个空格后使用双引号添加别名
        例:select ename,sal*12 "ysal" from emp;
        3) 列名后面一个空格后使用as关键字,在as后面添加别名
        例:select ename,sal*12 as "ysal" from emp;
    2.distinct用于对显示结果的去重
        1) distinct必须放在select后面
        2) 如果查询有多列,必须满足多列值都相同时,方可去重。
        --例子:查询公司有哪些职位
select job from emp;
select distinct job from emp;

--错误的SQL:select ename,distinct job from emp;
from关键字

作用:检索“表”

注意:检索的表后可以添加别名(别名不需要被双引号引起)
--给表取别名
select ename,sal,e.deptno from emp e,dept d;

where关键字

作用:过滤“行”记录(record)
--例:查询大于2000的员工信息
select * from emp where sal <= 5000;
用法:
    1.=,!=,<>,<,>,<=,>=,any,some,all
    例子:查询员工信息:条件:薪水大于1500,薪水还要大于2000
    select * from emp where sal != any(1000,1500,2000);
    some和any用法一样,all表示所有
    2. is null,is not null
    例子:
select * from emp where comm is not null;
select * from emp where comm is null;
    3.between x and y
    例子:查询员工薪水在2000-3000的员工信息
    select * from emp where sal between 2000 and 3000;
    4.and(都满足) 、 or(满足其一) 、 not
    例子:
select * from emp where sal >= 2000 and sal <=3000;
select * from emp where sal >= 1000 or sal >=2000;
    5.in(list),not in(list)
    例子:
    --查询职务为MANAGER和ANALYST的员工信息
select * from emp where job in('MANAGER','ANALYST');
--查询工资不为3000和5000的员工信息
select * from emp where sal not in(3000,5000);
    6.exists(子查询)、not exists(子查询)
    例子:
select * from emp where exists(select* from dept where deptno !=50);
select * from emp where not exists(select * from dept where deptno = 20);
    7.like模糊查询
        “%”:匹配零个或若干个字符
        “_”:匹配一个字符
        在模糊查询中,如果查询的数据中有“%”,“_”时,可以使用escape自定义转义字符
    例子:
--查询:员工姓名中含有"M"的员工信息
select * from emp where ename like '%A%';
--查询:员工姓名中第二个字母是"M"的员工信息
select * from emp where ename like '_M%';
--查询:员工姓名中第三个字母是"O"的员工信息
select * from emp where ename like '__O%';
--查询:员工姓名中倒数第二个字母为"E"的员工信息
select * from emp where ename like '%E_';
--查询:员工姓名中含有“%”的员工信息
insert into emp(empno,ename) values(9527,'huan%an');
select * from emp where ename like '%\%%' escape '\';

order by关键字

作用:用于对查询结果进行排序
select * from emp where deptno = 20 order by sal;
用法:
    1.利用asc 、desc对排序列进行升序或降序
    2.order by后可以添加多个列(逗号分隔),当一个列的值相同时,在按第二列进行排序,依次类推
    --1.如何决定升序还是降序?
select * from emp where deptno = 20 order by sal asc;--升序
select * from emp where deptno = 20 order by sal desc;--降序
--2.如果排序的列值相同时,如何处理?
select * from emp where deptno =  20 order by sal desc,ename asc;
--先按薪水降序,再按名字字典顺序升序排列

--计算字段 (列):不在于表中,通过+、-、*、/操作和列进行计算得到的列
--获取员工年薪
select (ename || '年薪为:' || sal * 12) info from emp;

--集合:每次查询结果可以看作一个集合
select * from emp where deptno = 20;
select * from emp where sal > 2000;
集合操作:
    1.union   并集
    例:
select * from emp where deptno = 20
union
select * from emp where sal > 2000;
    2.union all   全集
select * from emp where deptno = 20
union all
select * from emp where sal>2000
--union 和 union all 的区别在于:
union all 会重复显示两个集合相同的部分
    3.intersect   交集
select * from emp where deptno = 20
intersect
select * from emp where sal>2000;
    4.minus    差集
--返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。
--注意两条sql语句的顺序

注意:
    1.保证两个sql查询的列数是个数一致的
    2.保证两个sql查询的列的数据类型是一致的
    3.保证两个sql查询的列是相同的,否则查询的结果是无意义的

函数

单行函数:对单个数值进行操作,并返回一个值。
--dual是一个虚表,为了满足sql句式而设置这么一个表
要求:我讲完函数,你练习。
分类:
1.字符函数
    1)concat(a,b) 拼接a,b两个字符串数据
    例:select concat(concat(ename,'的职位是'),job) from emp;
    2)initcap(x) 将每个单词x首字母大写
    例:select initcap('reece zang')from dual;
    3)lower() / upper()  将字符串小写/将字符串大写
    例:
  select lower('REECE')from dual;
  select upper('reece') from dual;

4)length() 获取字符串的长度
    例:select ename,length(ename) from emp;

5)lpad(a,b,c) /rpad() 将a字符串左边填充至b长度,用c字符填充
    例:
  select lpad(ename,10) from emp;
  select rpad(ename,10,'*')from emp;

--注意:第二个参数要设定合理的值,否则会导致数据显示不完整
select lpad(ename,5) from emp;--只能显示从左数五个字符
 
    6)ltrim(a,b)  / rtrim()  去除a字符串左边的b字符,如果b不传参,默认去除空格
  例:
  select ltrim('a    abcd','a') from dual;
  select rtrim('   abcdef    aaaa','a f')from dual;

7)replace(a,b,c)   将a中的b字符串替换为c
    例:select replace('he love you','he','I')test from dual;

8)substr(a,b,c) 将a的字符串,从b位置开始截取,截c个长度
    例:select substr('123444567',3,4) from dual;

9)trim( a from b) 将b左右两边的a字符去除掉
    例:select trim('a'from'a  ba a') from dual;

2.数字函数
    abs() 求取绝对值
    例:    select abs(-5)from dual;

ceil() 向上取整
    例:select ceil(3.1) from dual;
 
    floor() 向下取整
    例:select floor(2.7)from dual;
 
    round() 四舍五入
    例:select round(4.6)from dual;

power(x,y)  x的y次幂
    例:select power(2,10)from dual;

3.日期函数
    sysdate 返回系统当前日期,注意没有括号
    select sysdate from dual;
 
    add_months(d1,d2) 在d1日期上,增加d2个月份
  select hiredate,add_months(hiredate,12) from emp;
  select add_months(sysdate,6)from dual;

months_between(d1,d2) 返回d1和d2之间的相隔月份
    如果d1>d2,则返回正数,如果d1<d2,则返回负数
    select months_between(sysdate,hiredate)from emp;
 
    last_day(d) 返回d日期所在月份最后一天的日期
    select hiredate,last_day(hiredate) from emp;

next_day(d,X) 返回下一个星期X的日期
    select sysdate,next_day(hiredate,'星期五')from emp;

4.转换函数
    to_char()  将数字、或日期转化为字符串
    select to_char(sal,'$9,999.00')from emp;

to_date()    将字符串转化为日期
select to_date('2019-04-16 23:16:16','yyyy-mm-dd hh24:mi:ss')from dual;

to_number()  将字符串转化为数字
    select to_number('876')from dual;

5.其他函数
    nvl(x,y) 如果x为null,则显示为y,x不为null,则返回x,x和y的类型保持一致
    select ename,nvl(comm,0)from emp;

sys_guid() 生成一个的32位随机字符串
    select sys_guid() from dual;

decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)  条件取值,类同java的switch
select ename,sal,decode(sal,800,'屌丝',2000,'白领',3000,'小资',5000,'高富帅','一般人')from emp;

case when then else end  条件取值,类同java的if-else if-else
    select ename,sal,case when sal<1000 then '屌丝'
                      when sal<2000 then '白领'
                      when sal<3000 then '小资'
                      when sal<4000 then '高富帅'
                        else '王宝强' end from emp;

【注意点】
1、以CASE开头,以END结尾
2、分支中WHEN 后跟条件,THEN为显示结果
3、ELSE 为除此之外的默认情况,类似于高级语言程序中switch case的default,可以不加
4、END 后跟别名
5、只返回第一个符合条件的值,剩下的when部分将会被自动忽略,得注意条件先后顺序

组函数
组函数又被称作聚合函数,用于对多行数据进行操作,并返回一个单一的结果

avg()求平均值,只能对数字类型进行处理,不处理空字段
例:--求20部门的平均薪水为多少?
select avg(sal) avgsal from emp where deptno = 20;

sum()求和,只能对数字类型进行处理
例:--求20部门的员工的总薪水
select sum(sal) sumsal from emp where deptno = 20;
 
count()计数,对任何类型生效,不处理空字段
例:--求20部门的员工有几个
select count(1) from emp where deptno = 20;

max() 求最大值,对任何类型生效
例:--求20部门员工工资最高的是多少
select max(sal) from emp where deptno = 20;
select max(hiredate) from emp;

min() 求最小值,对任何类型生效
例:--求20部门员工工资最低的是多少
select min(sal) from emp where deptno = 20;

group by关键字
作用:对查询结果进行分组处理
select deptno,job from emp group by deptno,job;
select deptno,avg(sal) from emp group by deptno
select deptno,count(1) from emp group by deptno;

用法:
    1.分组之后,不能将除分组字段之外的字段放在select后面
--select deptno from emp group by deptno;
--select deptno,count(1) from emp group by deptno;
    2.group by 后面可以跟多个字段,则这多个字段值都相同时,才分为一组
    --select deptno,job from emp group by deptno,job
            
    3.分组之后,可以使用组函数对每个组进行数据处理
--select deptno,avg(sal) from emp group by deptno
--select deptno,count(1) from emp group by deptno;
having 关键字
作用:用于对分组数据进行过滤
用法:
    类似于where的用法
--例:求平均薪水在2000以上的部门编号
select deptno from emp group by deptno having avg(sal)>2000;

--where 和 having关键字不冲突!
select avg(sal),deptno from emp where sal>1500
       group by deptno having avg(sal)>2500
       order by deptno desc;

-- select  from  where   group by  having  order by [asc/desc]
--where 后不能使用分组函数
--select e.deptno from emp e where avg(sal) > 1500 group by deptno;

sql顺序分为两类:

1.sql的书写顺序
select   from    where    group by   having   order by [asc/desc]

2.sql的执行顺序
from   where   group by   having    select   order by [asc/desc]

SQL语句01的更多相关文章

  1. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

  2. 28_数据库_第28天(数据库、表及表数据、SQL语句)_讲义

    今日内容介绍 1.MySQL数据库 2.SQL语句 01数据库概念 A: 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来, 用户可以对数据库中的数据进行 ...

  3. SQL语句完整的执行顺序(01)

    一.sql语句的执行步骤:  1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义.  2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限.  3)视图转换,将涉 ...

  4. sql语句查询经纬度范围(转载,源链接失效)

    MySQL性能调优 – 使用更为快速的算法进行距离 最近遇到了一个问题,通过不断的尝试最终将某句原本占据近1秒的查询优化到了0.01秒,效率提高了100倍. 问题是这样的,有一张存放用户居住地点经纬度 ...

  5. MYSQL 基本SQL语句

    复制表结构 CREATE TABLE 新表 SELECT * FROM 旧表 where 1=2 复制表结构和数据CREATE TABLE 新表 SELECT * FROM 旧表 查询重复数据: se ...

  6. ORACLE百万记录SQL语句优化技巧

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. 谈谈SQL 语句的优化技术

    https://blogs.msdn.microsoft.com/apgcdsd/2011/01/10/sql-1/ 一.引言 一个凸现在很多开发者或数据库管理员面前的问题是数据库系统的性能问题.性能 ...

  8. SQL语句操作数据与一些函数使用的丰富数据库

    数据库有多重要,其实不用我说,但该怎么运用好数据库下SQL语句与其它的如“函数”等等,那就需要我们大家多多去练习并总结其中的窍门,或许你的总结没那么好,担只要你的练习足够多,就算那不是窍门,那也将是你 ...

  9. SQL语句经典大全

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name  2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

随机推荐

  1. CMAKE 教程前两章节学习

    原文 https://cmake.org/cmake-tutorial/ 以下是一个循序渐进的教程,它覆盖了CMAKE帮助改进的通常的构建系统的话题.许多话题在<掌握CMAKE>(< ...

  2. BPNN

    链接网址:http://blog.csdn.net/heyongluoyao8/article/details/48213345 BPNN 人工神经网络   我们知道,人的脑袋具有很强的学习.记忆.联 ...

  3. sublime主题选择

    Sublime Text是一个强大的令人难以置信的编辑器. 它不仅具有大量的功能,而且还有很多主题,让他看起来很漂亮. 我们以前整理过 2014年的最好的主题 ; 让我们看看最新的Sublime Te ...

  4. Web 应用简单测试方案

    测试:一定要分阶段测试,先确定入队列成功,再测试队列的执行是否成功. 功能点: 1. 翻页2. 加精3. 置顶4. 帖子浏览量(PV)5. 发帖6. 回复7. 评论 8. crontab 脚本 @20 ...

  5. iOS9 Https技术预研

    一.服务器需要做的事情: 1.要注意 App Transport Security 要求 TLS 1.2, 2.而且它要求站点使用支持forward secrecy协议的密码. 3.证书也要求是符合A ...

  6. Asp.NetCore Razor 模式 Web 应用

    Razor 页面是 ASP.NET Core MVC 的一个新功能,它可以使基于页面的编码方式更简单高效. Razor 页面是 ASP.NET Core 2.0 中的一个新选择,它是基于页面的编程模型 ...

  7. 使用zookeeper自带的zkCli.sh客户端工具实现对zk的CURD常见操作详解

    一.zookeeper自带的 zkCli.sh 客户端工具 1. 应急和测试使用到的一个工具. 还有C# dirver java dirver (驱动)   二.driver的使用方式有两种 zkCl ...

  8. ASP.NET MVC验证DateTime的问题

    今天碰到一个Bug,在IE8中,日期验证失效,输入正确的日期格式也会验证失败,提示:xxx必须是日期格式(the field xxx must be a date) 最终找到问题所在:jquery.v ...

  9. linux查看占用内存多的进程

    update一个简单的方法 ps aux | sort -k4nr | head -10 ps -e  -o "%C  : %p : %z : %a"|sort -k5 -nr|h ...

  10. WPF 按名称查找控件

    1FrameworkElement类FindName方法 使用过程 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件.FindN ...