zoukankan      html  css  js  c++  java
  • 【Oracle】曾经的Oracle学习笔记(1-3) 数据库常见用语,常见命令,创建测试表

    一、数据库的登录

    二、数据库常用语

    三、测试表的创建,测试数据初始化

    四、常见命令介绍

    五、测试

    user:jeffrey
    sn:jeffrey


    user:system
    sn:jeffrey

    浏览器中输入:
    http://127.0.0.1:8080/apex
    管理员登陆
    user:sys
    sn:jeffrey

    打开服务列表:
    win+r打开运行框,输入services.msc
    OracleServiceXE服务一定要是打开的,要不然oracle根本登录不了。
    OracleXETNSLintener服务是在我们使用JDBC的时候需要打开的一个服务。

    创建数据库用户:
    user:briup
    sn:briup

    -------------------------
    打开服务列表:
    运行框中输入services.msc

    ----------------------------------------------
    登录oracle的几种方法
    sqlplus user/sn 直接用user身份登录
    sqlplus 然后根据提示输入用户名,密码


    用dba的身份登录到oracle数据库
    命令行中输入:
    sqlplus "/as sysdba"

    注:如果命令不识别,那么就需要配置一下环境变量path,把sqlplus.exe文件所在目录的路径配置在path中

    show user


    在dos中创建用户:
    create user 用户名 identified by 密码;
    create user briup identified by briup;

    给用户授权
    grant connect,resource to briup;

    给账户解锁
    alter user briup account unlock;


    conn user; 切换到用户user

    conn jeffrey as sysdba; //从jeffrey用户切换到sysdba的身份登录
    grant create table,create view to jeffrey;//给jeffrey授权创建view的权限
    conn jeffrey/jeffrey; //切换到以jeffrey的身份登录,用户名/密码

    如果发现用户被锁定了那么就给账户解锁
    alter user briup set account unlock;


    查看当前登录用户
    show user

    在sqlplus中清屏:
    $cls (Windows平台下面)
    !clear (Unix平台下面)

    $cls 清屏
    exit 退出
    ----------------------------------
    sql语句的基本格式:

    select ...
    from ..
    where ...
    group by ...
    having ...
    order by ..


    -------------------------------
    oracle中的Object:
    Table View Sequence Index Synonym

    ---------------------------------------------------------
    sql 第四代编程语言
    特点:只关心做什么,不关心怎么做

    sqlplus: 是一个工具,可以把sql语句拿到oracle中切执行,并且显示执行结果。

    PL/SQL:可以在sql的基础加入逻辑控制单元
    ---------------------------------------------------、

    使用sql语言在oracle中可以做哪些事情:


    数据库操纵语言
    Data manipulation language (DML)
    INSERT, UPDATE, DELETE


    数据库定义语言
    Data definition language (DDL)
    CREATE, ALTER, DROP, RENAME, TRUNCATE


    数据库控制语言
    Data control language (DCL)
    GRANT, REVOKE

    数据库查询:
    SELECT

    数据库事务:
    COMMIT, ROLLBACK, SAVEPOINT

    ------------------------------------------------------------
    登录数据库:

    sqlplus
    直接回车输入然后根据提示输入用户名和密码


    sqlplus 用户名
    然后根据提示输入密码


    sqlplus 用户名/密码
    然后回车就可以了

    ---------------------------------------------------------------

    查看当前用户下面有哪些表可以操作

    select table_name
    from user_tables;

    注:sql语句中的字母大小写是不敏感

    SELECT TABLE_NAME
    FROM USER_TABLES;
    这个和上面的小写的sql语句结果是一样的

    但是oracle中的字符串就会大小写敏感
    'Hello' 和 'hello' 是不同的


    查看某张表(例如,s_emp表)中的列名和列的属性
    desc s_emp;

    在sql语句最后要加上分号;
    要不然这个sql语句不会被执行。

    --------------------------
    sql语句的基本格式:

    select ...
    from ..
    where ...
    group by ...
    having ...
    order by ..
    ---------------------------
    s_region 地区表
    s_dept 部门表
    s_emp 员工表

    改变语言环境,以保证接下来插入日期能被识别
    alter session set nls_language=english;

    注:在建表插入数据之前,先把当前会话(session)的语言环境设置为英文,因为在下面的插入数据的操作中需要插入英文格式的日期数据.
    alter session set nls_language=english;

    ************************************************
    建表命令

    第一张表 s_region

    建表语言:

    CREATE TABLE s_region
    (id NUMBER(7)
    CONSTRAINT s_region_id_nn NOT NULL,
    name VARCHAR2(50)
    CONSTRAINT s_region_name_nn NOT NULL,
    CONSTRAINT s_region_id_pk PRIMARY KEY (id),
    CONSTRAINT s_region_name_uk UNIQUE (name));


    第一张表中插入数据:

    INSERT INTO s_region VALUES (
    1, 'North America');
    INSERT INTO s_region VALUES (
    2, 'South America');
    INSERT INTO s_region VALUES (
    3, 'Africa / Middle East');
    INSERT INTO s_region VALUES (
    4, 'Asia');
    INSERT INTO s_region VALUES (
    5, 'Europe');
    COMMIT;


    第二张表: s_dept
    建表语句:

    CREATE TABLE s_dept
    (id NUMBER(7)
    CONSTRAINT s_dept_id_nn NOT NULL,
    name VARCHAR2(25)
    CONSTRAINT s_dept_name_nn NOT NULL,
    region_id NUMBER(7),
    CONSTRAINT s_dept_id_pk PRIMARY KEY (id),
    CONSTRAINT s_dept_name_region_id_uk UNIQUE (name, region_id));

    第二张表插入数据:

    INSERT INTO s_dept VALUES (
    10, 'Finance', 1);
    INSERT INTO s_dept VALUES (
    31, 'Sales', 1);
    INSERT INTO s_dept VALUES (
    32, 'Sales', 2);
    INSERT INTO s_dept VALUES (
    33, 'Sales', 3);
    INSERT INTO s_dept VALUES (
    34, 'Sales', 4);
    INSERT INTO s_dept VALUES (
    35, 'Sales', 5);
    INSERT INTO s_dept VALUES (
    41, 'Operations', 1);
    INSERT INTO s_dept VALUES (
    42, 'Operations', 2);
    INSERT INTO s_dept VALUES (
    43, 'Operations', 3);
    INSERT INTO s_dept VALUES (
    44, 'Operations', 4);
    INSERT INTO s_dept VALUES (
    45, 'Operations', 5);
    INSERT INTO s_dept VALUES (
    50, 'Administration', 1);
    COMMIT;


    第三张表 s_emp

    CREATE TABLE s_emp
    (id NUMBER(7)
    CONSTRAINT s_emp_id_nn NOT NULL,
    last_name VARCHAR2(25)
    CONSTRAINT s_emp_last_name_nn NOT NULL,
    first_name VARCHAR2(25),
    userid VARCHAR2(8),
    start_date DATE,
    comments VARCHAR2(255),
    manager_id NUMBER(7),
    title VARCHAR2(25),
    dept_id NUMBER(7),
    salary NUMBER(11, 2),
    commission_pct NUMBER(4, 2),
    CONSTRAINT s_emp_id_pk PRIMARY KEY (id),
    CONSTRAINT s_emp_userid_uk UNIQUE (userid),
    CONSTRAINT s_emp_commission_pct_ck
    CHECK (commission_pct IN (10, 12.5, 15, 17.5, 20)));

    第三张表插入数据:

    INSERT INTO s_emp VALUES (
    1, 'Velasquez', 'Carmen', 'cvelasqu',
    to_date('03-MAR-90 8:30', 'dd-mon-yy hh24:mi'), NULL, NULL, 'President',
    50, 2500, NULL);
    INSERT INTO s_emp VALUES (
    2, 'Ngao', 'LaDoris', 'lngao',
    '08-MAR-90', NULL, 1, 'VP, Operations',
    41, 1450, NULL);
    INSERT INTO s_emp VALUES (
    3, 'Nagayama', 'Midori', 'mnagayam',
    '17-JUN-91', NULL, 1, 'VP, Sales',
    31, 1400, NULL);
    INSERT INTO s_emp VALUES (
    4, 'Quick-To-See', 'Mark', 'mquickto',
    '07-APR-90', NULL, 1, 'VP, Finance',
    10, 1450, NULL);
    INSERT INTO s_emp VALUES (
    5, 'Ropeburn', 'Audry', 'aropebur',
    '04-MAR-90', NULL, 1, 'VP, Administration',
    50, 1550, NULL);
    INSERT INTO s_emp VALUES (
    6, 'Urguhart', 'Molly', 'murguhar',
    '18-JAN-91', NULL, 2, 'Warehouse Manager',
    41, 1200, NULL);
    INSERT INTO s_emp VALUES (
    7, 'Menchu', 'Roberta', 'rmenchu',
    '14-MAY-90', NULL, 2, 'Warehouse Manager',
    42, 1250, NULL);
    INSERT INTO s_emp VALUES (
    8, 'Biri', 'Ben', 'bbiri',
    '07-APR-90', NULL, 2, 'Warehouse Manager',
    43, 1100, NULL);
    INSERT INTO s_emp VALUES (
    9, 'Catchpole', 'Antoinette', 'acatchpo',
    '09-FEB-92', NULL, 2, 'Warehouse Manager',
    44, 1300, NULL);
    INSERT INTO s_emp VALUES (
    10, 'Havel', 'Marta', 'mhavel',
    '27-FEB-91', NULL, 2, 'Warehouse Manager',
    45, 1307, NULL);
    INSERT INTO s_emp VALUES (
    11, 'Magee', 'Colin', 'cmagee',
    '14-MAY-90', NULL, 3, 'Sales Representative',
    31, 1400, 10);
    INSERT INTO s_emp VALUES (
    12, 'Giljum', 'Henry', 'hgiljum',
    '18-JAN-92', NULL, 3, 'Sales Representative',
    32, 1490, 12.5);
    INSERT INTO s_emp VALUES (
    13, 'Sedeghi', 'Yasmin', 'ysedeghi',
    '18-FEB-91', NULL, 3, 'Sales Representative',
    33, 1515, 10);
    INSERT INTO s_emp VALUES (
    14, 'Nguyen', 'Mai', 'mnguyen',
    '22-JAN-92', NULL, 3, 'Sales Representative',
    34, 1525, 15);
    INSERT INTO s_emp VALUES (
    15, 'Dumas', 'Andre', 'adumas',
    '09-OCT-91', NULL, 3, 'Sales Representative',
    35, 1450, 17.5);
    INSERT INTO s_emp VALUES (
    16, 'Maduro', 'Elena', 'emaduro',
    '07-FEB-92', NULL, 6, 'Stock Clerk',
    41, 1400, NULL);
    INSERT INTO s_emp VALUES (
    17, 'Smith', 'George', 'gsmith',
    '08-MAR-90', NULL, 6, 'Stock Clerk',
    41, 940, NULL);
    INSERT INTO s_emp VALUES (
    18, 'Nozaki', 'Akira', 'anozaki',
    '09-FEB-91', NULL, 7, 'Stock Clerk',
    42, 1200, NULL);
    INSERT INTO s_emp VALUES (
    19, 'Patel', 'Vikram', 'vpatel',
    '06-AUG-91', NULL, 7, 'Stock Clerk',
    42, 795, NULL);
    INSERT INTO s_emp VALUES (
    20, 'Newman', 'Chad', 'cnewman',
    '21-JUL-91', NULL, 8, 'Stock Clerk',
    43, 750, NULL);
    INSERT INTO s_emp VALUES (
    21, 'Markarian', 'Alexander', 'amarkari',
    '26-MAY-91', NULL, 8, 'Stock Clerk',
    43, 850, NULL);
    INSERT INTO s_emp VALUES (
    22, 'Chang', 'Eddie', 'echang',
    '30-NOV-90', NULL, 9, 'Stock Clerk',
    44, 800, NULL);
    INSERT INTO s_emp VALUES (
    23, 'Patel', 'Radha', 'rpatel',
    '17-OCT-90', NULL, 9, 'Stock Clerk',
    34, 795, NULL);
    INSERT INTO s_emp VALUES (
    24, 'Dancs', 'Bela', 'bdancs',
    '17-MAR-91', NULL, 10, 'Stock Clerk',
    45, 860, NULL);
    INSERT INTO s_emp VALUES (
    25, 'Schwartz', 'Sylvie', 'sschwart',
    '09-MAY-91', NULL, 10, 'Stock Clerk',
    45, 1100, NULL);
    COMMIT;


    *****************************************************

    s_region地区表

    ID 地区的编号
    NAME 地区的名字


    s_dept部门表

    ID 部门编号
    NAME 部门名字
    REGION_ID 部门所在地区编号

    s_emp 员工表

    ID 员工的编号
    LAST_NAME
    FIRST_NAME
    USERID
    START_DATE 入职时间
    COMMENTS
    MANAGER_ID 这个员工的领导的id号
    TITLE 职位
    DEPT_ID 所在部门编号
    SALARY
    COMMISSION_PCT 提成率

    ----------------------------------------------------

    查找
    select last_name from s_emp;

    调整列名下面分割线的长度(非数字列)
    col last_name for a15; //调节last_name 这列的a(小横线)到15格

    查看多列数据用逗号隔开
    注:这个逗号一定要是英文输入法下面的逗号
    select column1,column2,column3...
    from 表;

    查看表中所有的列用*
    select *
    from 表;


    给查询的某一列起一个别名(显示用的,并不改变数据库中的表列名),空格隔开
    select last_name,salary sal from s_emp; //将salary列名显示为sal

    --------------------------------------------------------
    调整列名下面分割线的长度(非数字列)
    col last_name for a15;

    查看某一列上面设置的格式
    col last_name

    清空某一列上面设置的格式
    col last_name clear

    select last_name
    from s_emp;

    查看多列数据用逗号隔开
    注:这个逗号一定要是英文输入法下面的逗号
    select column1,column2,column3...
    from 表;

    例如:
    select id,last_name,dept_id,salary
    from s_emp;

    查看表中所有的列用*
    select *
    from 表;

    select *
    from s_emp;


    给查询的某一列起一个别名

    select last_name name
    from s_emp;


    select id myId,last_name MyName,salary MySalary
    from s_emp;

    DISTINCT
    distinct //作用:可以用来去除重复的数据,注:数据是否重复是按照当前显示的一行是否完全一样判定的。

    select dept_id
    from s_emp;


    select distinct dept_id
    from s_emp;


    在查询的过程中可以加入加减乘除
    Add +
    Subtract -
    Multiply *
    Divide /


    select salary
    from s_emp;


    select salary*12 salaryOfYear
    from s_emp;

    select ((salary+1000)*20-50000)/15-20000
    from s_emp;


    select last_name,first_name
    from s_emp;

    ||是可以连接俩个字符串的值或者是俩个字符串列上面的值。
    select first_name||last_name full_name
    from s_emp;

    select 'hello'||'world'
    from dual;

    dual 哑表
    注:dual是oracle中的一张表,每一个用户都可以使用。当前我们直接查询一个运算式子或者是日期的时候就可以用这张表。

    函数
    nvl(列名,替换的新值) //作用:能帮我们把某一列上面是null的值替换为另一个值

    select last_name,nvl(commission_pct,0) from s_emp;


    练习:查询一个s_emp表中所有人的工资,如果是销售人员,那么就把他的工资加上提成之后再显示(在原来基础工资的基础加入上提成)
    select last_name,salary+salary*(nvl(commission_pct,0)/100) from s_emp;

    -------------------------------------------------------------
    sql语句中的【小技巧】

    在sql*plus工具中,会有一个buffer(缓存),这个buffer中只能存放一条sql语句(不管这条sql语句多少行),buffer中会存放着我们最近一次执行过的一条sql语句。


    L或者l //大写或小写都可以list,显示buffer中存放的sql语句
    / //这一命令可以执行buffer中的sql语句
    2 //选择buffer中的第二行
    a //在buffer中的sql语句的某一行(选择的那一行)后面增加内容,a后面跟的内容
    i //在buffer中的sql语句中的某一行(选择的那一行)下面插入一行,i后面跟的内容
    del //删除某一行(选择的那一行)
    c/ma/me //将某一行(选择的那一行)中的ma替换成me
    2 新代码 //将buffer中第2行中的代码全部重写为新代码
    save LL.sql //将buffer中的额内容保存到文件LL.sql中,文件在登录sql前的路径存放。
    clear buffer //清空缓冲区
    start LL.sql //执行文件LL.sql中保存的命令。
    @LL.sql //执行文件LL.sql中保存的命令。
    edit LL.sql //修改LL.sql文件,使用系统中默认的编辑器打开
    get LL.sql //显示LL.sql文件中存储的命令。

    spool spool.sql //将接下来的操作记录在spool.sql文件中直到spool off
    spool off //记录结束
    --------------------------------------------
    将salary列中的数字显示为9,999的形式,如2391显示为2,391
    col salary for $9,999
    select salary from s_emp;

    将不足的显示为0,如4399显示为004,399
    col salary for $099,999.99
    将货币符号显示为本地的
    col salary for L099,999.99


    修改数字列显示的格式:

    将来这个数字按照这样的格式来显示
    col salary for $9,999.99
    例如:2500 ---> $2,500.00

    这个表示将来数字一定要显示成整数为6位,不够6位的前面补0
    col salary for $099,999.99
    例如:2500 ---> $002,500.00


    L表示使用本地的货币符号来表示
    col salary for L099,999.99
    例如:2500 ---> ¥002,500.00


    --------------------------------
    order by 排序

    默认是升序
    select last_name,salary
    from s_emp
    order by salary;

    加上desc后就会变为降序
    select last_name,salary
    from s_emp
    order by salary desc;

    通过日期排序
    select last_name,salary,start_date
    from s_emp
    order by start_date;

    通过字符串排序
    select last_name,salary
    from s_emp
    order by last_name;

    按要查询的第2个列进行排序
    select last_name,salary
    from s_emp
    order by 2;


    where子句: 条件查询

    select last_name
    from s_emp
    where dept_id = 41;


    = > >= < <=

    BETWEEN ... AND...

    例如:
    注:这时候也包括41和50这个俩个部门
    select last_name,dept_id
    from s_emp
    where dept_id between 41 and 5

    语言环境此时为中文,所以日期用中文格式
    select last_name,start_date
    from s_emp
    where start_date between '03-3月-90'
    and '17-6月-91';

    语言环境改为英文
    alter session set nls_language=english;
    语言环境改为简体中文
    alter session set nls_language='simplified chinese';


    IN(list)

    例如:
    查询41,42,43,44,45部门中的员工信息
    select last_name,dept_id
    from s_emp
    where dept_id in(41,42,43,44,45)

    LIKE

    一般用作模糊查询
    %代表可能有0个或者多个字符
    _代表有一个字符
    escape可以忽略某些字符
    /相当于转义符号

    查询名字的首字母是N的员工信息
    select last_name,salary
    from s_emp
    where last_name like 'N%';

    查询名字中以_g开头的员工信息
    select last_name,salary
    from s_emp
    where last_name like '/_g%' escape'/';

    IS NULL

    例如:
    select last_name,commission_pct
    from s_emp
    where commission_pct is null;

    AND
    OR

    例如:
    salary<1450
    salary>1100
    dept_id = 41

    select last_name,salary,dept_id
    from s_emp
    where dept_id=41 or salary>1100 and
    salary<1450

    注:and的优先级比or高

    NOT

    != <> ^=
    这三个都是不等于的意思


    NOT BETWEEN
    NOT IN
    NOT LIKE
    IS NOT NULL

    ANY

    例如:
    select last_name,salary
    from s_emp
    where salary > any(3000,2000,1000,500);
    相当于以下语句
    where salary>3000
    or salary>2000
    or salary>1000
    or salary>500

    ALL

    例如:
    select last_name,salary
    from s_emp
    where salary > all(3000,2000,1000,500);
    相当于以下语句
    where salary>3000
    and salary>2000
    and salary>1000
    and salary>500


    --------------------------------------
    函数
    分两类:
    单值函数

    组合函数/聚合函数/组函数


    单值函数
    ---------
    1.字符串函数

    LOWER 把一个字符串或者字符串类型的列上面的值转换成小写
    例如:
    select lower('HELLO')
    from dual;
    select lower(last_name)
    from s_emp;

    UPPER 把一个字符串或者字符串类型的列上面的值转换成大写

    INITCAP 把一个字符串或者字符串类型的列上面的值转换成首字母大写,其他字符小写
    例如:
    select initcap('hELLOWoRld')
    from dual;

    结果显示: Helloworld

    CONCAT 链接俩个字符串或者字符串列上面的值.
    例如:
    select concat('hello','world')
    from dual;
    select concat(last_name,first_name)
    from s_emp;

    SUBSTR 截取字符串
    例如:
    第一个参数:要被截取的字符串
    第二个参数:从哪个位置来说截取(下标从1,2,3....)
    第三个参数:要截取的字符串长度
    select substr('hello',1,1)
    from dual;
    select substr(last_name,1,2)
    from s_emp;

    LENGTH 返回字符串或者字符串列上面值的长度
    例如:
    select length('hello')
    from dual;

    NVL


    2.数字函数

    ROUND 四舍五入
    第一个参数:要操作的数字
    第二个参数:需要保留的位数
    正数表示保留小数点右边多少位。
    0表示保留到个位,默认这个参数值就是为0
    -1表示保留到十位,以此类推
    例如:
    select round(45.923,2)
    from dual; --->45.92

    select round(45.923,0)
    from dual; --->46

    select round(45.923)
    from dual; --->46

    select round(45.923,-1)
    from dual; --->50

    TRUNC 和ROUND的用法一样,唯一不同的就是这个TRUNC函数只会舍去值而不会进位,不管那位上是0或者是9都不会进位。

    MOD 取余
    例如:
    select mod(50,30)
    from dual; --->20


    3.日期函数

    oracle表示日期的第一种方式:
    关键字sysdate表示当前的日期时间
    sysdate的单位是天
    例如:
    select sysdate
    from dual;

    sysdate+365表示从当前时间往后推1年
    (sysdate+365)整体代表的是一个日期
    select sysdate+365
    from dual;

    sysdate+1/24表示从当前时间往后推1小时
    (sysdate+1/24)整体代表的是一个日期
    select sysdate+1/24
    from dual;
    oracle中表示日期的第二种方式:
    用一个字符串来表示一个日期,只不过这个字符串要按照oracle默认的日期格式来写。
    例如
    '14-MAY-90'
    '14-5月-90'
    注:要和session的语言环境一致

    oracle中表示日期的第三种方式:
    借助于日期转换函数来获得一个日期数据
    to_date('string','date_format')

    MONTHS_BETWEEN 俩个日期之间相差多少个人,返回的结果单位是月
    例如:
    select months_between(sysdate,sysdate+365)
    from dual; --->12

    ADD_MONTHS 在给定的一个日期点上面往后退一个1月,返回的结果是一个日期数据
    例如:
    select add_months(sysdate,1)
    from dual;

    NEXT_DAY 表示基于当前给定日期情况下,下一个星期几是多少号,返回的结果是一个日期数据
    例如:
    select next_day(sysdate,'MONDAY')
    from dual;

    中文session
    select next_day(sysdate,'星期一')
    from dual; --->01-7月 -13

    LAST_DAY 基于给定日期所在的月份,返回这个月份最后一天的日期,返回结果是一个日期数据
    例如:
    select last_day(sysdate)
    from dual;

    ROUND 对日期进行四舍五入
    例如:
    这样是错误的,因为oracle会把这个日期当做一个数字,因为数字函数里面也有round这个函数。
    select round('25-MAY-95','month')
    from dual;

    这个是正确的
    select round(to_date(...),'month')
    from dual;
    select round(sysdate-53,'month')
    from dual;
    保留到月份结论:
    不管是28天还是29、30、31,
    16号的都是进位,15都是舍去。

    select round(sysdate+82,'year')
    from dual;
    保留到年的结论:
    7月1号以后的时间才会进位

    TRUNC 和round类似,但是只会舍去不会进位。


    4.字符串、数字、日期相互转换的函数

    to_char 把日期或者数字转换为字符串
    to_char(date,'date_format')
    例如:
    select to_char(sysdate,'ddd-Month-Year HH24:mi:ss')
    from dual;

    千年虫
    yy rr

    select to_char(3500,'$0999,999')
    from dual;

    to_number 把字符串转化为数字
    例如:
    select to_number('20')
    from dual;

    to_date 把一个字符串转换为日期
    to_date('string','date_format')
    例如:
    select to_date('2013/4/10','yyyy/mm/dd')
    from dual;



    注意:单值函数之间是可以相互嵌套使用的.
    例如:
    select concat(lower('HELLO'),upper('world'))
    from dual;

    组合函数/聚合函数/组函数

    group by子句: 分组
    having子句: 条件筛选


    常用的组函数:
    avg 平均值
    count 计数
    sum 求和
    max 最大值
    min 最小值

    查询s_emp表中所有员工的工资总和
    select sum(salary)
    from s_emp;


    查询s_emp表中所有员工的平均工资
    select avg(salary)
    from s_emp;


    查询s_emp表一共有多少个员工
    select count(*)
    from s_emp;


    查询s_emp表中最大工资数是多少
    select max(salary)
    from s_emp;


    查询s_emp表中最小工资数是多少
    select min(salary)
    from s_emp;

    --------------------------------------------------------
    group by子句: 分组
    having子句: 条件筛选

    where和having的区别:
    这个俩个都可以作为条件筛选语句,但是where后面不能出现组函数,having语句后面可以出现组函数


    查询一张表的时候,如果没有分组,直接使用了组函数,那么就会默认整张表的所有数据就是一个小
    组,那么这个组函数就会直接作用到整张表上。

    如果进行了group by分组,那么会把整张分为若干个小组,然后组函数会分别作用到每一个小组上,
    最后每一个小组都会有自己的一个结果(比如说求的平均值或求的总和)。


    一般情况,组函数都会结合group by子句来使用


    查询s_emp表中每一个部门的员工的工资总和

    select dept_id,sum(salary)
    from s_emp
    group by dept_id
    order by dept_id;


    查询s_emp表中每一个部门的员工的工资总和,并且只显示出工资总和大于2000的部门

    select dept_id,sum(salary)
    from s_emp
    group by dept_id
    having sum(salary)>2000
    order by dept_id;

    这样写是错误的!!!!where 后面不能跟组函数
    select dept_id,sum(salary)
    from s_emp
    where sum(salary)>2000
    group by dept_id
    order by dept_id;


    查询每一个部门的平均工资

    select dept_id,avg(salary)
    from s_emp
    group by dept_id
    order by avg(salary);

    注:order by是可以用组函数执行结果进行排序的


    查询s_emp表中最大的工资数

    select max(salary)
    from s_emp;

  • 相关阅读:
    51nod 1122 机器人走方格 V4(矩阵乘法)
    51nod 1092 回文字符串
    51nod 1254 最大子段和 V2(递推)
    容斥原理求gcd为k的数对个数
    51nod 1115 最大M子段和 V3
    51nod 1053 最大M子段和 V2(贪心)
    洛谷P1792 [国家集训队]种树
    洛谷P1484 种树(反悔贪心,双向链表+堆)
    51 nod 1052 最大M子段和
    51 nod 1051 最大子矩阵和
  • 原文地址:https://www.cnblogs.com/jinhuazhe2013/p/5192080.html
Copyright © 2011-2022 走看看