1 2 3 4

简单查询

1数据库介绍

数据库分类

  1. 关系型数据库:oracle, mysql, db2, sql server, sqllite等
  2. 非关系型数据库:redis, hbase等

了解

DBMS:
database management system数据库管理系统

RDBMS:
relational database management system关系型数据库管理系统

2sqlplus简单使用

登录

C:\Users\inmeditation>sqlplus

SQL*Plus: Release 11.2.0.1.0 Production on 星期日 11月 10 19:00:28 2019

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

请输入用户名:  scott
输入口令:

连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>

查看当前登录用户

SQL> show user;
USER 为 "SCOTT"

查看,设置搜索后结果行的长度

SQL> show linesize
linesize 80
SQL> set linesize 500;
SQL> show linesize;
linesize 500

查看,设置搜索后结页面的长度

SQL> show pagesize;
pagesize 14
SQL> set pagesize 100;
SQL> show pagesize;
pagesize 100

注意,行长和页长再次登录会恢复默认值

查看表结构

SQL> desc emp;
 名称                 是否为空?         类型
 ------             --------            --------------------------
 EMPNO                                NOT NULL NUMBER(4)
 ENAME                                 VARCHAR2(10)
 JOB                                      VARCHAR2(9)
 MGR                                     NUMBER(4)
 HIREDATE                               DATE
 SAL                                       NUMBER(7,2)
 COMM                                   NUMBER(7,2)
 DEPTNO                                 NUMBER(2)

更改当前用户的密码

SQL> alter user scott identified by scottpw;
用户已更改。

通过交互方式更改当前用户密码

SQL> passw
更改 SCOTT 的口令
旧口令:
新口令:
重新键入新口令:
口令已更改

切换到超级用户

SQL> conn sys as sysdba
输入口令:
已连接。
SQL> conn system/sys
已连接。

超级用户下解锁scott用户

SQL> alter user scott account unlock;
用户已更改。

超级用户下更改scott账户的密码

SQL> alter user scott identified by scott;
用户已更改。

退出当前数据库账号

SQL> disc
从 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开
SQL>

退出数据库

SQL> exit
C:\Users\inmeditation>
SQL> quit
从 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options 断开

C:\Users\inmeditation>

3简单查询

1 表的概念:

  • Excel中的表格就是表。竖着叫一列.横着是一行
  • 表中也是一样,其中每列叫做列或者字段,每行叫做记录
查询表中所有信息
SQL> select * from emp;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7777 S_HH%GGH             CLERK                    7902                                              20
      7369 SMITH                CLERK                    7902 17-12月-80            800                    20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         30
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                    20
查询单个列信息:姓名,入职时间,部门
SQL> select ename,hiredate,deptno from emp;

ENAME                HIREDATE           DEPTNO
-------------------- -------------- ----------
S_HH%GGH                                    20
SMITH                17-12月-80             20
ALLEN                20-2月 -81             30
WARD                 22-2月 -81             30
JONES                02-4月 -81             20

2 特殊的列:rowid和rownum

rowid
  • 数据库中唯一的一个无规律字符串, rowid能唯一的确定一条数据.
  • 每条数据都有一个rowid,唯一且不为空.
rownum:伪列,用于过滤数据

可以写作rownum<5, rownum<=6,rownum=1
但用rownum=2或者rownum>3,这种写法是不能运行的
则这个数字必须是小于等于1的整数,否则无法查出数据.

SQL> select ename,rowid,rownum from emp;

ENAME                ROWID                  ROWNUM
-------------------- ------------------ ----------
S_HH%GGH             AAAR3sAAEAAAACWAAA          1
SMITH                AAAR3sAAEAAAACXAAA          2
ALLEN                AAAR3sAAEAAAACXAAB          3
WARD                 AAAR3sAAEAAAACXAAC          4
JONES                AAAR3sAAEAAAACXAAD          5
MARTIN               AAAR3sAAEAAAACXAAE          6
BLAKE                AAAR3sAAEAAAACXAAF          7

3 别名

表别名

就是给表另取一个名字,这个名字可以代替表名

SQL> select p.empno,p.ename from emp p;

     EMPNO ENAME
---------- --------------------
      7777 S_HH%GGH
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
列别名

关键字:as,可以省略

SQL> select p.empno as 员工编号,p.ename 员工姓名 from emp p;

  员工编号 员工姓名
---------- --------------------
      7777 S_HH%GGH
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN

条件查询where

1 not

取反

查看工资大于2000的员工姓名

SQL> select ename,sal from emp
  2  where not sal<2000;

ENAME                       SAL
-------------------- ----------
JONES                      2975
BLAKE                      2850
CLARK                      2450
SCOTT                      3000
KING                       5000
FORD                       3000

2 like

模糊查询 | 模糊匹配字符串

占位符
  • % 表示零个或者若干个任意字符
  • _ 表示一个任意字符

查询名字不是以S开头的所有员工姓名

SQL> select ename from emp
  2  where ename not like 'S%';

ENAME
--------------------
ALLEN
WARD
JONES
MARTIN

查询名字以S开头的所有员工姓名,且名字长度为5

SQL> select ename from emp
  2  where ename like 'S____';

ENAME
--------------------
SMITH
SCOTT

占位符在使用时,应该尽量避免在字符串的前面和后面都使用%

escape定义转义字符

查询名字中带有_的员工信息

SQL> select ename from emp
  2  where ename like '%\_%'escape '\';

ENAME
--------------------
S_HH%GGH

查找emp表中ename列同时有%和_,且不挨在一起的数据;

SQL> select ename from emp
  2  where ename like '%/%%_/_%' escape '/'
  3  or ename like '%/_%_/%%' escape '/';

ENAME
--------------------
S_HH%GGH

3 is null

查询字段值是空值的数据

查看有佣金的员工姓名

SQL> select ename from emp
  2  where comm is not null;

ENAME
--------------------
ALLEN
WARD
MARTIN
TURNER

4 in

后面跟一个集合或者子查询,用来查询条件列值是否在后面集合中

查询10号和20号部门之外的员工姓名和部门

SQL> select ename,deptno from emp
  2  where deptno not in(10,20);

ENAME                    DEPTNO
-------------------- ----------
ALLEN                        30
WARD                         30
MARTIN                       30
BLAKE                        30

order by

1排序

  • asc:表示升序,默认排序方式,从小到大
  • desc:表示降序
SQL> select ename,sal from emp
  2  order by sal desc;

ENAME                       SAL
-------------------- ----------
S_HH%GGH
KING                       5000
FORD                       3000
SCOTT                      3000
JONES                      2975
BLAKE                      2850
CLARK                      2450

多列排序

如果出现两个或者两个以上的列 排序时,先按第一个列进行排序
如果第一列的值相等,那么安照下一个排序列进行排序

查询员工信息,按照部门编号升序排序,如果部门相同按照工资降序排序

SQL> select ename,sal,deptno from emp
  2  order by deptno,sal desc;

ENAME                       SAL     DEPTNO
-------------------- ---------- ----------
KING                       5000         10
CLARK                      2450         10
MILLER                     1300         10
S_HH%GGH                                20
FORD                       3000         20
SCOTT                      3000         20
JONES                      2975         20
ADAMS                      1100         20

也可以写为

SQL> select ename,sal,deptno from emp
  2  order by 3,2 desc;

ENAME                       SAL     DEPTNO
-------------------- ---------- ----------
KING                       5000         10
CLARK                      2450         10
MILLER                     1300         10
S_HH%GGH                                20
FORD                       3000         20
SCOTT                      3000         20
JONES                      2975         20
ADAMS                      1100         20

group by

按照某一列数据进行分组

语法: select 列名 from 表名 group by 列名;

select后可以跟的内容

  1. 是 group by的列,即分组列;
  2. 经过聚合函数处理过的数据.
    • SUM()--求和
    • MIN()--取最小值
    • MAX()--取最大值
    • AVG()--平均值
    • COUNT()--求数量

按照不同的组号来分组,并统计每组人数,最高工资和最低工资等信息

SQL> select deptno,count(*),sum(sal),avg(sal),max(sal),min(sal)
  2  from emp
  3  group by deptno;

    DEPTNO   COUNT(*)   SUM(SAL)   AVG(SAL)   MAX(SAL)   MIN(SAL)
---------- ---------- ---------- ---------- ---------- ----------
        30          6       9400 1566.66667       2850        950
        20          6      10875       2175       3000        800
        10          3       8750 2916.66667       5000       1300

多列分组

多列分组时,多个分组列的值同时相等时,才属于同一个组

SQL> select deptno,job,count(*),max(sal)
  2  from emp
  3  group by deptno,job;

    DEPTNO JOB                  COUNT(*)   MAX(SAL)
---------- ------------------ ---------- ----------
        20 CLERK                       3       1100
        30 SALESMAN                    4       1600
        20 MANAGER                     1       2975
        30 CLERK                       1        950
        10 PRESIDENT                   1       5000
        30 MANAGER                     1       2850
        10 CLERK                       1       1300
        10 MANAGER                     1       2450
        20 ANALYST                     2       3000

having

对分组后的数据进行筛选

查询各个部门的部门人数,和平均工资,要求部门的平均工资大于2000

SQL> select deptno,count(*),avg(sal)
  2  from emp
  3  group by deptno
  4  having avg(sal)>2000;

    DEPTNO   COUNT(*)   AVG(SAL)
---------- ---------- ----------
        20          6       2175
        10          3 2916.66667

having和where的区别

  • having

    • 后面跟条件表达式
    • having是对分组后的数据进行筛选
    • 后面可以跟聚合函数,它比where后执行
  • where

    • 条件表达式,它后面可以跟普通函数,不能使用聚合函数,它是分组前对数据的筛选,优先执行

补充

执行顺序:

  1. where
  2. group by
  3. having
  4. select
  5. order by

case when:

根据分支的不同返回不同的值

两种写法

1. select deptno,
case deptno 
  when 10 then '部门1' 
    when 20 then '部门2'
      when 30 then '部门3'
        else '其他部门' end
from emp;
2.select deptno, case 
  when deptno=30 then '部门3'
    when deptno=20 then '部门2'
      when deptno=10 then '部门1'
        else '其他部门' end 
from emp;
查询emp表,将职位为ANALYST,CLERK和SALESMAN的显示为工人,MANAGER和PRESIDENT显示为管理员;
SQL> select ename,case
  2  when job in('ANALYST','CLERK','SALESMAN') then '工人'
  3    when job in('MANAGER','PRESIDENT') then '管理员'
  4      else '其他人' end
  5  from emp;

ENAME                CASEWHENJOBIN('ANA
-------------------- ------------------
S_HH%GGH             工人
SMITH                工人
ALLEN                工人
WARD                 工人
JONES                管理员
MARTIN               工人
BLAKE                管理员
CLARK                管理员

另一种写法

SQL> select ename ,case
  2  when job='ANALYST' or job='CLERK' or job='SALESMAN' then '工人'
  3    when job='MANAGER' or job='PRESIDENT' then '管理员'
  4      else '其他人' end
  5  from emp;

ENAME                CASEWHENJOB='ANALY
-------------------- ------------------
S_HH%GGH             工人
SMITH                工人
ALLEN                工人
WARD                 工人
JONES                管理员
MARTIN               工人
BLAKE                管理员
CLARK                管理员
查询emp表,查询出sal<1000, sal在1000-3000,和sal大于3000的人数;
SQL> select case
  2  when sal<1000 then '小于1000'
  3    when sal>=1000 and sal<=3000 then '1000-3000'
  4      else '大于3000' end as "范围", count(1) 数量
  5  from emp
  6  where sal>=0
  7  group by case
  8  when sal<1000 then '小于1000'
  9    when sal>=1000 and sal<=3000 then '1000-3000'
 10      else '大于3000' end;

范围                       数量
-------------------- ----------
小于1000                      2
1000-3000                    11
大于3000                      1

另一种写法

SQL> select sum(case when sal<1000 then 1 else 0 end) "工资小于1000",
  2         sum(case when sal>=1000 and sal<=3000 then 1 else 0 end) "工资在1000-3000",
  3         sum(case when sal>3000 then 1 else 0 end) "工资大于3000"
  4  from emp;

工资小于1000 工资在1000-3000 工资大于3000
------------ --------------- ------------
           2              11            1
posted @ 2019-10-31 18:58  多走多看  阅读(397)  评论(2编辑  收藏  举报