【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;
你要坚强,坚强的足以认识自己的弱点;你要勇敢,勇敢的足以面对自己的恐惧;你要堂堂正正。在遇到挫折时能够昂首而不背躬屈膝;你要能够面对掌声,在胜利时能够谦逊而不趾高气扬。真正的伟大直率真诚,真正的贤人虚怀若谷,真正的强者温文尔雅。——萨利·布什(林肯的继母教育林肯)
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号