select * FROM (
SELECT ID,SUBSTRING_INDEX(test_value,"ORDER",1) AS NO, test_value FROM test
)t ORDER BY t.NO DESC
结果并不是我们想要的:
原因,之前讲过,字符串类型对应mysql排序,它是这样排的:
所以我们需要做转换成数字再排 。
第三步转换排序
第一种方案 ,使用 CAST函数 转换类型
-
unsigned
表示无符号,不能表示小数
-
signed
表示有符号,可以表示小数
SELECT * FROM (
SELECT ID,SUBSTRING_INDEX(test_value,"ORDER",1) AS NO, test_value FROM test
)t ORDER BY CAST(t.NO AS SIGNED)
结果OK的:
第二种方案 排序的字符串字段值后拼接 0 ,触发转换成数字
SELECT * FROM (
SELECT ID,SUBSTRING_INDEX(test_value,"ORDER",1) AS NO, test_value FROM test
)t ORDER BY t.NO+0
结果是OK的:
第三种方案 CONVERT 函数 转换类型
-
unsigned
表示无符号,不能表示小数
-
signed
表示有符号,可以表示小数
SELECT * FROM (
SELECT ID,SUBSTRING_INDEX(test_value,"ORDER",1) AS NO, test_value FROM test
)t ORDER BY CONVERT(t.NO,SIGNED)
结果是OK的:
好,该篇到这。
第一章 Oracle入门
一、
数据库
概述
数据库
(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。
常见的数据模型
1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS(Information Manage-mentSystem)是其典型代表。
2. 网状结构模型:按照网状数据结构建立的
数据库
系统称为网状
数据库
系统,其典型代表是DBTG(Data Base Task Group)。
3. 关系结构模型:关系式数据结构把一些复杂的数据结构归结为简单的二元关系(即二维表格形式)。常见的有Oracle、ms
sql
、
mysql
等
二、 主流
数据库
数据库
名 公司 特点 工作环境
ms
sql
微软 只能能运行在windows平台,体积比较庞大,占用许多系统资源, 但使用很方便,支持命令和图形化管理,收费。 中型企业
Mysql
甲骨文 是个开源的
数据库
server,可运行在多种平台, 特点是响应速度特别快,主要面向中小企业 中小型企业
Postgre
SQL
号称“世界上最先进的开源
数据库
“,可以运行在多种平台下,是tb级
数据库
,而且性能也很好 中大型企业
oracle 甲骨文 获得最高认证级别的ISO标准安全认证,性能最高, 保持开放平台下的TPC-D和TPC-C的世界记录。但价格不菲 大型企业
db2 IBM DB2在企业级的应用最为广泛, 在全球的500家最大的企业中,几乎85%以上用DB2
数据库
服务器。收费 大型企业
Access 微软 Access是一种桌面
数据库
,只适合数据量少的应用,在处理少量 数据和单机访问的
数据库
时是很好的,效率也很高 小型企业
三、 Oracle
数据库
概述
ORACLE
数据库
系统是美国ORACLE公司(甲骨文)提供的以分布式
数据库
为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的
数据库
之一。
拉里•埃里森
就业前景
从就业与择业的角度来讲,计算机相关专业的大学生从事oracle方面的技术是职业发展中的最佳选择。
其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。
其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),Oracle技术能够帮助提高就业的深度。
其三、职业方向多:Oracle
数据库
管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等方向。
四、 如何学习
认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学
五、 体系结构
oracle的体系很庞大,要学习它,首先要了解oracle的框架。oracle的框架主要由物理结构、逻辑结构、内存分配、后台进程、oracle例程、系统改变号 (System Change Number)组成
物理结构
物理结构
包含
三种数据文件:
1) 控制文件
2) 数据文件
3) 在线重做日志文件
逻辑结构
功能:
数据库
如何使用物理空间
组成:表空间、段、区、块的组成层次
六、 oracle安装、卸载和启动
硬件要求
物理内存:1GB
可用物理内存:50M
交换空间大小:3.25GB
硬盘空间:10GB
1. 安装程序成功下载,将会得到如下2个文件:
解压文件将得到database文件夹,文件组织如下:
点击setup.exe执行安装程序,开始安装。
2. 点击安装程序将会出现如下安装界面,步骤 1/9:配置安全更新
填写电子邮件地址(可以不填),去掉复选框,点击下一步
3. 步骤2/9:选择安装选项
勾选第一个,安装和配置
数据库
,点击下一步
4. 步骤3/8:选择系统类
勾选第一个:桌面类,点击下一步
5. 步骤4/8:配置
数据库
安装
选择安装路径,选择
数据库
版本(企业版),选择字符集(默认值)
填写全局
数据库
名,管理口令
6. 步骤5/8:先决条件检查
如果你的电脑满足要求但仍然显示检查失败,这时候直接忽略,勾选全部忽略
7. 步骤6/8:概要信息
核对将要安装数据的详细信息,并保存响应文件,以备以后查看。然后点击完成
数据库
安装
8. 步骤7/8:安装产品
产品安装过程中将会出现以上2个界面
9. 步骤8/8:完成安装
卸载Oracle
1. 在运行services.msc打开服务,停止Oracle的所有服务。
2. oracle11G自带一个卸载批处理\app\Administrator\product\11.2.0\dbhome_1\deinstall\deinstall.bat
3. 运行该批处理程序将自动完成oracle卸载工作,最后手动删除\app文件夹(可能需要重启才能删除)
4. 运行regedit命令,打开注册表窗口。删除注册表中与Oracle相关的内容,具体如下:
删除HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE目录。
删除HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services中所有以oracle或OraWeb为开头的键。
删除HKEY_LOCAL_MACHINE/SYSETM/CurrentControlSet/Services/Eventlog/application中所有以oracle开头的键。
删除HKEY_CLASSES_ROOT目录下所有以Ora、Oracle、Orcl或EnumOra为前缀的键。
删除HKEY_CURRENT_USER/SOFTWARE/Microsoft/windows/CurrentVersion/Explorer/MenuOrder/Start Menu/Programs中所有以oracle 开头的键。
删除HKDY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI中除Microsoft ODBC for Oracle注册表键以外的所有含有Oracle的键。
删除环境变量中的PATHT CLASSPATH中
包含
Oracle的值。
删除“开始”/“程序”中所有Oracle的组和图标。
删除所有与Oracle相关的目录,包括:
C:\Program file\Oracle目录。
ORACLE_BASE目录。
C:\Documents and Settings\系统用户名、LocalSettings\Temp目录下的临时文件。
七、 oracle中的
数据库
八、 常用的工具
Sql
Plus
Sql
Developer
Oracle Enterprise Manager
第二章 用户和权限
一、 用户介绍
ORACLE用户是学习ORACLE
数据库
中的基础知识,下面就介绍下类系统常用的默认ORACLE用户:
1. sys用户:超级用户,完全是个SYSDBA(管理
数据库
的人)。拥有dba,sysdba,sysoper等角色或权限。是oracle权限最高的用户,登录时不能用normal。
2. system用户:超级用户,默认是SYSOPT(操作
数据库
的人),不过它也能以SYSDBA的权限登陆。拥有普通dba角色权限。
3. scott用户:是个演示用户,是让你学习Oracle用的。
二、 常用命令
学习oracle,首先我们必须要掌握常用的基本命令,oracle中的命令比较多,常用的命令如下:
1. 登录命令(
sql
plus)
说明:用于登录到oracle
数据库
用法:
sql
plus 用户名/密码 [as sysdba/sysoper]
注意:当用特权用户登录时,必须带上sysdba或sysoper
普通用户登录
sys用户登录
操作系统的身份登录
2. 连接命令(conn)
说明:用于连接到oracle
数据库
,也可实现用户的切换
用法:conn 用户名/密码 [as sysdba/sysoper]
注意:当用特权用户连接时,必须带上sysdba或sysoper
3. 断开连接(disc)
说明:断开与当前
数据库
的连接
用法:disc
4. 显示用户名(show user)
说明:显示当前用户名
用法:show user
5. 退出(exit)
说明:断开与当前
数据库
的连接并会退出
用法:exit
6. 编辑脚本(edit/ed)
说明:编辑
指定
或缓冲区的
sql
脚本
用法:edit [文件名]
7. 运行脚本 (start/@)
说明:运行
指定
的
sql
脚本
用法:start/@ 文件名
8. 印刷屏幕 (spool)
说明:将
sql
*plus屏幕中的内容输出到
指定
的文件
用法:开始印刷->spool 文件名 结束印刷->spool off
9. 显示宽度 (linesize)
说明:设置显示行的宽度,默认是80个字符
用法:set linesize 120
10. 显示页数 (pagesize)
说明:设置每页显示的行数,默认是14页
用法:set pagesize 20
三、 用户管理
1. 创建用户
说明:Oracle中需要创建用户一定是要具有dba(
数据库
管理员)权限的用户才能创建,而且创建的新用户不具备任何权限,连登录都不可以。
用法:create user 新用户名 identified by 密码
2. 修改密码
说明:修改用户密码一般有两种方式,一种是通过命令password修改,另一种是通过语句alter user实现,如果要修改他人的密码,必须要具有相关的权限才可以
方式一 password [用户名]
方式二 alert user 用户名 identified by 新密码
修改当前用户(方式一)
修改当前用户(方式二)
修改其他用户(方式一)
修改其他用户(方式二)
3. 用户禁用与启用
说明:Oracle中想要禁用或启用一个账户也同样是使用alter user 命令来完成,只是语法和修改密码有所不同。
禁用 alert user 用户名 account lock
启用 alert user 用户名 account unlock
4. 删除用户
说明:Oracle中要删除一个用户,必须要具有dba的权限。而且不能删除当前用户,如果删除的用户有数据对象,那么必须加上关键字cascade。
用法:drop user 用户名 [cascade]
四、 用户权限与角色
1. 权限
Oracle中权限主要分为两种,系统权限和实体权限。
系统权限:系统规定用户使用
数据库
的权限。(系统权限是对用户而言)。
DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建
数据库
结构。
RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建
数据库
结构。
CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建
数据库
结构。
对于普通用户:授予connect, resource权限。
对于DBA管理用户:授予connect,resource, dba权限。
授予系统权限
说明:要实现授予系统权限只能由DBA用户授出。
用法:grant 系统权限1[,系统权限2]… to 用户名1[,用户名2]….
系统权限回收:
说明:系统权限只能由DBA用户回收
用法:revoke 系统权限 from 用户名
实体权限:某种权限用户对其它用户的表或视图的存取权限。(是针对表或视图而言的)。主要包括select, update, insert, alter, index, delete, all其中all包括所有权限。
授予实体权限
用法:grant 实体权限1[,实体权限2]… on 表名 to用户名1[,用户名2]….
实体权限回收
用法:revoke 实体权限 on 表名from 用户名
查询
用户拥有哪里权限:
SQL
> select * from role_tab_privs;//
查询
授予角色的对象权限
SQL
> select * from role_role_privs;//
查询
授予另一角色的角色
SQL
> select * from DBA_tab_privs;//
查询
直接授予用户的对象权限
SQL
> select * from dba_role_privs;//
查询
授予用户的角色
SQL
> select * from dba_sys_privs;//
查询
授予用户的系统权限
SQL
> select * from role_sys_privs;//
查询
授予角色的系统权限
SQL
> Select * from session_privs;//
查询
当前用户所拥有的权限
2. 角色
角色。角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限。
系统预定义角色
预定义角色是在
数据库
安装后,系统自动创建的一些常用的角色。下面我们就简单介绍些系统角色:
CONNECT, RESOURCE, DBA这些预定义角色主要是为了向后兼容。其主要是用于
数据库
管理。oracle建议用户自己设计
数据库
管理和安全的权限规划,而不要简单的使用这些预定角色。将来的版本中这些角色可能不会作为预定义角色。
DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE,SELECT_CATALOG_ROLE这些角色主要用于访问数据字典视图和包。
EXP_FULL_DATABASE, IMP_FULL_DATABASE这两个角色用于数据导入导出工具的使用。
自定义角色
Oracle建议我们自定义自己的角色,使我们更加灵活方便去管理用户
创建角色
SQL
> create role admin;
授权给角色
SQL
> grant connect,resource to admin;
撤销角色的权限
SQL
> revoke connect from admin;
删除角色
SQL
> drop role admin;
第三章
Sql
查询
与函数
一、
SQL
概述
SQL
(Structured Query Language)结构化
查询
语言,是一种
数据库
查询
和程序设计语言,用于存取数据以及
查询
、更新和管理关系
数据库
系统。同时也是
数据库
脚本文件的扩展名。
SQL
语言主要
包含
5个部分
数据定义语言Data Definition Language(DDL),用来建立
数据库
、数据对象和定义其列。例如:CREATE、DROP、ALTER等语句。
数据操作语言Data Manipulation Language(DML),用来插入、修改、删除、
查询
,可以修改
数据库
中的数据。例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句
数据
查询
语言 (Data Query Language, DQL) 是
SQL
语言中,负责进行数据
查询
而不会对数据本身进行修改的语句,这是最基本的
SQL
语句。例如:SELECT(
查询
)
数据控制语言Data Controlling Language(DCL),用来控制
数据库
组件的存取允许、存取权限等。例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。
事务控制语言(Transactional Control Language,TCL),用于维护数据的一致性,包括COMMIT(提交事务)、ROLLBACK(回滚事务)和SAVEPOINT(设置保存点)3条语句
二、 Oracle的数据类型
类型 参数 描述
字符类型 char 1~2000字节 固定长度
字符串
,长度不够的用空格补充
varchar2 1~4000字节 可变长度
字符串
,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但
查询
效率没有char类型高
数值类型 Number(m,n) m(1~38)
n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数,其中,M表示精度,代表数字的总位数;N表示小数点右边数字的位数
日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒
二进制数据类型 row 1~2000字节 可变长二进制数据,在具体定义
字段
的时候必须指明最大长度n
long raw 1~2GB 可变长二进制数据
LOB数据类型 clob 1~4GB 只能存储字符数据
nclob 1~4GB 保存本地语言字符集数据
blob 1~4GB 以二进制信息保存数据
三、 DDL语言
1. Create table命令
用于创建表。在创建表时,经常会创建该表的主键、外键、唯一约束、Check约束等
语法结构
create table 表名(
[
字段
名] [类型] [约束]
………..
CONSTRAINT fk_column
FOREIGN KEY(column1,column2,…..column_n)
REFERENCES tablename(column1,column2,…..column_n)
例子:
create table student(
stuNo char(32) primary key,--主键约束
stuName varchar2(20) not null,--非空约束
cardId char(20) unique,--唯一约束
sex char(2) check(sex='男' or sex='女'),--检查约束
address varchar2(100) default '地址不详'--默认约束
create table mark(
mid int primary key,--主键约束
stuNo char(32) not null,
courseName varchar2(20) not null,--非空约束
score number(3) not null check(score>=0 and scoreselect * from em--
查询
所有数据
SQL
>select ename,job from em--
查询
指定
的
字段
数据
SQL
> select * from emp where sal>1000--加条件
2. 聚合函数
聚合函数对一组值执行计算并返回单一的值。聚合函数忽略空值。聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用。不能在 WHERE 子句中使用组函数。
AVG(expression): 返回集合中各值的平均值
--
查询
所有人都的平均工资
select avg(sal) from emp
COUNT(expression): 以 Int32 形式返回集合中的项数
--
查询
工资低于2000的人数
select count(*) from emp where sal2000
5. 连接
查询
连接
查询
是关系
数据库
中最主要的
查询
,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表
查询
。
内连接
内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
等值连接:
select * from emp inner join dept on emp.deptno=dept.deptno
select * from emp,dept where emp.deptno=dept.deptno
不等值连接:
select * from emp inner join dept on emp.deptno!=dept.deptno
外连接
外连接分为三种:左外连接,右外连接,全外连接。对应
SQL
:LEFT/RIGHT/FULL OUTER JOIN。通常我们省略outer 这个关键字。写成:LEFT/RIGHT/FULL JOIN。
左外连接(left join): 是以左表的记录为基础的
select * from emp left join dept on emp.deptno=dept.deptno
右外连接(right join): 和left join的结果刚好相反,是以右表(BL)为基础的
select * from emp right join dept on emp.deptno=dept.deptno
全外连接(full join): 左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充
select * from emp full join dept on emp.deptno=dept.deptno
交叉连接
交叉连接即笛卡儿乘积,是指两个关系中所有元组的任意组合。一般情况下,交叉
查询
是没有实际意义的。
select * from cross full join dept
6. 常用
查询
like模糊
查询
--
查询
姓名首字母为S开始的员工信息
select * from emp where ename like 'S%'
--
查询
姓名第三个字母为A的员工信息
select * from emp where ename like '__A%'
is null/is not null
查询
--
查询
没有奖金的雇员信息
select * from emp where comm is null
--
查询
有奖金的雇员信息
select * from emp where comm is not null
in
查询
--
查询
雇员编号为7566、7499、7844的雇员信息
select * from emp where empno in(7566,7499,7844)
exists/not exists
查询
(效率高于in)
--
查询
有上级领导的雇员信息
select * from emp e where exists
(select * from emp where empno=e.mgr)
--
查询
没有上级领导的雇员信息
select * from emp e where not exists
(select * from emp where empno=e.mgr)
all
查询
--
查询
比部门编号为20的所有雇员工资都高的雇员信息
select * from emp where sal > all(select sal from emp where deptno=20)
union合并不重复
select * from emp where comm is not null
union
select * from emp where sal>3000
union all合并重复
select * from emp where comm is not null
union all
select * from emp where sal>3000
7. 子
查询
当一个
查询
是另一个
查询
的条件时,称之为子
查询
。子
查询
是一个 SELECT 语句,它嵌套在一个 SELECT、SELECT...INTO 语句、INSERT...INTO 语句、DELETE 语句、或 UPDATE 语句或嵌套在另一子
查询
中。
在CREATE TABLE语句中使用子
查询
--创建表并拷贝数据
create table temp(id,name,sal) as select empno,ename,sal from emp
在INSERT语句中使用子
查询
--当前表拷贝
insert into temp(id,name,sal) select * from temp
--从其他表
指定
字段
拷贝
insert into temp(id,name,sal) select empno,ename,sal from emp
在DELETE语句中使用子
查询
--删除SALES部门中的所有雇员
delete from emp where deptno in
(select deptno from dept where dname='SALES')
在UPDATE语句中使用子
查询
--修改scott用户的工资和smith的工资一致
update emp set sal=(select sal from emp where ename='SMITH') where ename='SCOTT'
--修改black用户的工作,工资,奖金和scott一致
update emp set(job,sal,comm)=(select job,sal,comm from emp where ename='SCOTT') where ename='BLAKE'
在SELECT语句中使用子
查询
--
查询
和ALLEN同一部门的员工信息
select * from emp where deptno in
(select deptno from emp where ename='ALLEN')
--
查询
工资大于部门平均工资的雇员信息
select * from emp e
(select avg(sal) asal,deptno from emp group by deptno) t
where e.deptno=t.deptno and e.sal>t.asal
六、 TCL语言
1. COMMIT
commit --提交事务
2. ROLLBACK
rollback to p1 --回滚到
指定
的保存点
rollback --回滚所有的保存点
3. SAVEPOINT
savepoint p1 --设置保存点
4. 只读事务
只读事务是指只允许执行
查询
的操作,而不允许执行任何其它dml操作的事务,它的作用是确保用户只能取得某时间点的数据。
set transaction read only
七、 oracle函数
1.
字符串
函数
字符串
函数是oracle中比较常用的,下面我们就介绍些常用的
字符串
函数:
concat:
字符串
连接函数,也可以使用’||’
--将职位和雇员名称显示在一列中
select concat(ename,concat('(',concat(job,')'))) from emp
select ename || '(' || job || ')' from emp
length:返回
字符串
的长度
--
查询
雇员名字长度为5个字符的信息
select * from emp where length(ename)=5
lower:将
字符串
转换成小写
--以小写方式显示雇员名
select lower(ename) from emp
upper:将
字符串
转换成大写
--以大写方式显示雇员名
select upper (ename) from emp
substr:截取
字符串
--只显示雇员名的前3个字母
select substr(ename,0,3) from emp
replace:替换
字符串
--将雇员的金额显示为*号
select ename,replace(sal,sal,’*’) from emp
instr:查找
字符串
--查找雇员名含有’LA’字符的信息
select * from emp where instr(ename,’LA’)>0
2. 日期函数
sysdate:返回当前session所在时区的默认时间
--获取当前系统时间
select sysdate from dual
add_months:返回
指定
日期月份+n之后的值,n可以为任何整数
--
查询
当前系统月份+2的时间
select add_months(sysdate,2) from dual
--
查询
当前系统月份-2的时间
select add_months(sysdate,-2) from dual
last_day:返回
指定
时间所在月的最后一天
--获取当前系统月份的最后一天
select last_day(sysdate) from dual
months_between:返回月份差,结果可正可负,当然也有可能为0
--获取入职日期距离当前时间多少天
select months_between(sysdate, hiredate) from emp
trunc:为
指定
元素而截去的日期值
--获取当前系统年,其他默认
select trunc(sysdate,'yy') from dual
--
查询
81年2月份入职的雇员
select * from emp
where trunc(hiredate,'mm')=trunc(to_date('1981-02','yyyy-mm'),'mm')
3. 转换函数
to_char:将任意类型转换成
字符串
--日期转换
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual
--数字转换
select to_char(-100.789999999999,'L99G999D999') from dual
数字格式控制符
符号 描述
9 代表一位数字,如果当前位有数字,显示数字,否则不显示(小数部分仍然会强制显示)
0 强制显示该位,如果当前位有数字,显示数字,否则显示0
$ 增加美元符号显示
L 增加本地货币符号显示
. 小数点符号显示
, 千分位符号显示
to_date:将
字符串
转换成日期对象
--字符转换成日期
select to_date('2011-11-11 11:11:11', 'yyyy-mm-dd hh24:mi:ss') from dual
to_number:将字符转换成数字对象
--字符转换成数字对象
select to_number('209.976')*5 from dual
select to_number('209.976', '9G999D999')*5 from dual
4. 数学函数
abs:返回数字的绝对值
select abs(-1999) from dual
ceil:返回大于或等于n的最小的整数值
select ceil(2.48) from dual
floor:返回小于等于n的最大整数值
select floor(2.48) from dual
round:四舍五入
select round(2.48) from dual
select round(2.485,2) from dual
bin_to_num:二进制转换成十进制
select bin_to_num(1,0,0,1,0) from dual
第四章 锁
一、 概述
锁是实现
数据库
并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在
数据库
中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。
根据保护的对象不同,Oracle
数据库
锁可以分为以下几大类:
DML锁(data locks,数据锁),用于保护数据的完整性
DDL锁(dictionary locks,字典锁),用于保护
数据库
对象的结构,如表、索引等的结构定义
内部锁和闩(internal locks and latches),保护
数据库
的内部结构
二、 DML锁
DML锁的目的在于保证并发情况下的数据完整性,在Oracle
数据库
中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
1. 行级锁
当事务执行
数据库
插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁
--不允许其他用户对雇员表的部门编号为20的数据进行修改
select * from emp where deptno=20 for update
--不允许其他用户对雇员表的所有数据进行修改
select * from emp for update
--如果已经被锁定,就不用等待
select * from emp for update nowait
--如果已经被锁定,更新的时候等待5秒
select * from emp for update wait 5
2. 锁模式
0(none)
1(null)
2(rs):行共享
3(rx):行排他
4(s):共享
5(srx):共享行排他
6(x):排他
数字越大,锁级别越高
3. 表级锁
当事务获得行锁后,此事务也将自动获得该行的表锁(行排他),以防止其它事务进行DDL语句影响记录行的更新
行共享锁(RS锁):允许用户进行任何操作,禁止排他锁
lock table emp in row share mode
行排他锁(RX锁):允许用户进行任何操作,禁止共享锁
lock table emp in row exclusive mode
共享锁(R锁):其他用户只能看,不能修改
lock table emp in share mode
排他锁(X锁):其他用户只能看,不能修改,不能加其他锁
lock table emp in exclusive mode
共享行排他(SRX锁):比行排他和共享锁级别高,不能添加共享锁
lock table emp in share row exclusive mode
4. 锁兼容性
S X RS RX SRX N/A
S Y N Y N N Y
X N N N N N Y
RS Y N Y Y Y Y
RX N N Y Y N Y
SRX N N Y N N Y
N/Y Y Y Y Y Y Y
5. 死锁
当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。
1) 用户A修改A表,事务不提交
2) 用户B修改B表,事务不提交
3) 用户A修改B表,阻塞
4) 用户B修改A表,阻塞
Oracle系统能自动发现死锁,并会自动选择工作量最少的事务进行撤销和释放所有锁
6. 悲观锁和乐观锁
数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁
悲观锁:就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。
乐观锁:就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做。
三、 DDL锁
1. 排它DDL锁
创建、修改、删除一个
数据库
对象的DDL语句获得操作对象的排它锁。
2. 共享DDL锁
需在
数据库
对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁
3. 分析锁
分析锁是一种独特的DDL锁类型,ORACLE使用它追踪共享池对象及它所引用
数据库
对象之间的依赖关系
四、 内部锁和闩
这是ORACLE中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,ORACLE首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。
第五章
数据库
对象
一、 概述
ORACLE
数据库
主要有如下
数据库
对象:
tablespace and datafile(表空间和数据文件)
table(表)
constraints(约束)
index(索引)
view(试图)
sequence(序列)
synonyms(同义词)
DB-link(
数据库
链路)
二、 表空间和数据文件
表空间是
数据库
的逻辑组成部分,从物理上讲,
数据库
数据是存放在数据文件中,从逻辑上讲
数据库
则是存放在表空间中,表空间是由一个或多个数据文件组成。
表空间
某一时刻只能属于一个
数据库
由一个或多个数据文件组成
可进一步划分为逻辑存储
表空间主要分为两种
System表空间
随
数据库
创建
包含
数据字典
包含
system还原段
非system表空间
用于分开存储段
易于空间管理
控制分配给用户的空间量
数据文件
只能属于一个表空间和一个
数据库
是方案对象数据的资料档案库
创建表空间
CREATE TABLESPACE tablespacename
[DATAFILE clause]
[MINIMUM EXTENT integer[k|m]]
[BLOCKSIZE integer[k]]
[LOGGING|NOLOGGING]
[DEFAULT storage_clause]
[ONLINE|OFFLINE]
[PERMANENT|TEMPORARY]
[extent_management_clause]
[segment_management_clause]
--创建本地管理表空间
create tablespace firstSpance
datafile 'e:/firstspance.dbf'size 100M
extent management local uniform size 256k
--修改文件大小
alter database datafile 'e:/firstspance.dbf' resize 110m
--删除表空间
drop tablespace firstSpance INCLUDING CONTENTS and datafiles
--使用
数据库
表空间
--创建用户
指定
表空间
create user guest identified by 123456
default tablespace firstSpance
--表中
指定
表空间
create table account(
accountid number(4),
accountName varchar2(20)
)tablespace firstSpance
--表空间脱机
alter tablespace firstSpance offline
--表空间联机
alter tablespace firstSpance online
--表空间只读,不能进行dml操作
alter tablespace firstSpance read only
三、 同义词
Oracle
数据库
中提供了同义词管理的功能。同义词是
数据库
方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。Oracle同义词有两种类型,分别是公用Oracle同义词与私有Oracle同义词。
公有同义词
CREATE [OR REPLACE] PUBLIC SYNONYM sys_name FOR [SCHEMA.] object_name
创建(需拥有CREATE PUBLIC SYNONYM权限才可以创建)
--创建同义词
create public synonym syn_emp for scott.emp
--访问同义词
select * from syn_emp
drop public synonym syn_emp
私有同义词
CREATE [OR REPLACE] SYNONYM sys_name FOR [SCHEMA.] object_name
--创建同义词
create synonym syn_pri_emp for emp
--访问同义词
select * from syn_ pri _emp
drop public synonym syn_emp
四、 表分区
当表中的数据量不断增大,
查询
数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样
查询
数据时,不至于每次都扫描整张表。
优点:
改善
查询
性能:对分区对象的
查询
可以仅搜索自己关心的分区,提高检索速度。
增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
使用场合
表的大小超过2GB
表中
包含
历史数据,新的数据被增加都新的分区中
常见分区方法:
范围 --- 8
Hash --- 8i
列表 --- 9i
组合 --- 8i
1. 范围分区
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时
指定
的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。
特点:
最早、最经典的分区算法
Range分区通过对分区
字段
值的范围进行分区
Range分区特别适合于按时间周期进行数据的存储。日、周、月、年等。
数据管理能力强(数据迁移、数据备份、数据交换)
范围分区的数据可能不均匀
范围分区与记录值相关,实施难度和可维护性相对较差
按值划分
CREATE TABLE book (
bookid NUMBER(5),
bookname VARCHAR2(30),
price NUMBER(8)
)PARTITION BY RANGE (price)--分区
字段
PARTITION P1 VALUES LESS THAN (4) TABLESPACE system,
PARTITION P2 VALUES LESS THAN (8) TABLESPACE system,
PARTITION P3 VALUES LESS THAN (maxvalue) TABLESPACE system,
--MAXVALUE代表了一个不确定的值,这个值高于其它分区中的任何分区键的值
按日期划分
CREATE TABLE student (
stuno NUMBER(5),
stuname VARCHAR2(30),
birthday date
)PARTITION BY RANGE (birthday)--分区
字段
PARTITION P1990 VALUES LESS THAN (to_date('1990-01-01','yyyy-mm-dd')) TABLESPACE system,
PARTITION P1991 VALUES LESS THAN (to_date('1991-01-01','yyyy-mm-dd')) TABLESPACE system
2. Hash分区(散列分区)
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。散列分区为通过
指定
分区编号来均匀分布数据的一种分区类型。如果你要使用hash分区,只需
指定
分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。
基于分区
字段
的HASH值,自动将记录插入到
指定
分区。
分区数一般是2的幂
易于实施
总体性能最佳
适合于静态数据
HASH分区适合于数据的均匀存储
数据管理能力弱
HASH分区对数据值无法控制
CREATE TABLE classes (
clsno NUMBER(5),
clsname VARCHAR2(30)
)PARTITION BY HASH(clsno)--分区
字段
PARTITION ph1 tablespace system,
PARTITION ph2 tablespace system
3. List分区(列表分区)
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。
List分区通过对分区
字段
的离散值进行分区
List分区是不
排序
的,而且分区之间也没有关联
List分区适合于对数据离散值进行控制
List分区只支持单个
字段
List分区具有与range分区相似的优缺点
数据管理能力强
各分区的数据可能不均匀
CREATE TABLE users (
userid NUMBER(5),
username VARCHAR2(30),
province char(5)
)PARTITION BY list(province)--分区
字段
PARTITION pl1 values('广东') tablespace system,
PARTITION pl2 values('江西') tablespace system,
PARTITION pl3 values('广西') tablespace system,
PARTITION pl4 values('湖南') tablespace system
4. 组合分区
常见的组合分区主要有范围散列分区和范围列表分区
既适合于历史数据,又适合于数据均匀分布
与范围分区一样提供高可用性和管理性
实现粒度更细的操作
组合范围列表分区
这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。
CREATE TABLE student (
stuno NUMBER(5),
stuname VARCHAR2(30),
birthday date,
province char(5)
)PARTITION BY RANGE (birthday) --主分区
字段
subpartition BY LIST(province)--子分区字符
PARTITION P1990 VALUES LESS THAN(to_date('1990-01-01','yyyy-mm-dd')) TABLESPACE system
SUBPARTITION pl1 values('广东') tablespace system,
SUBPARTITION pl2 values('江西') tablespace system,
SUBPARTITION pl3 values('广西') tablespace system,
SUBPARTITION pl4 values('湖南') tablespace system
PARTITION P1991 VALUES LESS THAN(to_date('1991-01-01','yyyy-mm-dd')) TABLESPACE system
SUBPARTITION p21 values('广东') tablespace system,
SUBPARTITION p22 values('江西') tablespace system,
SUBPARTITION p23 values('广西') tablespace system,
SUBPARTITION p24 values('湖南') tablespace system
组合范围散列分区
这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。
CREATE TABLE student (
stuno NUMBER(5),
stuname VARCHAR2(30),
birthday date
)PARTITION BY RANGE(birthday) --主分区
字段
SUBPARTITION BY HASH(stuno)--子分区字符
PARTITION P1990 VALUES LESS THAN(to_date('1990-01-01','yyyy-mm-dd')) TABLESPACE system
SUBPARTITION ph12 tablespace system,
SUBPARTITION ph13 tablespace system
PARTITION P1991 VALUES LESS THAN(to_date('1991-01-01','yyyy-mm-dd')) TABLESPACE system
SUBPARTITION ph21 tablespace system,
SUBPARTITION ph22 tablespace system
5. 表分区常用操作
添加分区
--添加主分区
alter table book add partition p4 values less than(maxvalue) tablespace system
--添加子分区
ALTER TABLE student MODIFY PARTITION P1990
ADD SUBPARTITION pl5 values('福建')
删除分区
--删除主分区
ALTER TABLE student DROP PARTITION P1990
--删除子分区
ALTER TABLE student DROP SUBPARTITION p15
重命名表分区
ALTER TABLE student RENAME PARTITION P21 TO P2
显示
数据库
所有分区表的信息
select * from DBA_PART_TABLES
显示当前用户所有分区表的信息
select * from USER_PART_TABLES
查询
指定
表分区数据
select * from users partition(pl2)--主分区
select * from users subpartition(phl2)--子分区
删除分区表一个分区的数据
alter table book truncate partition p11
第六章 视图
一、 概述
视图是基于一个表或多个表或视图的逻辑表,本身不
包含
数据,通过它可以对表里面的数据进行
查询
和修改。视图基于的表称为基表。视图是存储在数据字典里的一条select语句。 通过创建视图可以提取数据的逻辑上的集合或组合。
为什么使用视图
控制数据访问
简化
查询
数据独立性
避免重复访问相同的数据
使用修改基表的最大好处是安全性,即保证那些能被任意人修改的列的安全性
Oracle中视图分类
关系视图
内嵌视图
对象视图
物化视图
二、 关系视图
关系视图是作为
数据库
对象存在的,创建之后也可以通过工具或数据字典来查看视图的相关信息。关系视图是4种视图中最简单,同时也最常用的视图。
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
1. OR REPLACE:若所创建的试图已经存在,ORACLE自动重建该视图
2. FORCE:不管基表是否存在ORACLE都会自动创建该视图
3. NOFORCE:只有基表都存在ORACLE才会创建该视图
4. Alias:为视图产生的列定义的别名
5. subquery:一条完整的SELECT语句,可以在该语句中定义别名
6. WITH CHECK OPTION:插入或修改的数据行必须满足视图定义的约束
7. WITH READ ONLY:该视图上不能进行任何DML操作
create or replace view view_Account_dept
select * from emp where deptno=10
--只读视图
create or replace view view_Account_dept
select * from emp where deptno=10 order by sal
with read only
--约束视图
create or replace view view_Account_dept
select * from emp where deptno=10
with check option
查询
视图
select * from emp where view_Account_dept
修改视图
通过OR REPLACE 重新创建同名视图即可
删除视图
DROP VIEW VIEW_NAME语句删除视图
视图上的DML 操作原则
1. 简单视图可以执行DML操作;
2. 在视图
包含
GROUP函数,GROUP BY子句,DISTINCT关键字时不能执行delete语句
3. 在视图
包含
GROUP函数,GROUP BY子句,DISTINCT关键字,ROWNUM为例,列定义为表达式时不能执行update语句
4. 在视图
包含
GROUP函数,GROUP BY子句,DISTINCT关键字,ROWNUM为例,列定义为表达式,表中非空的列子视图定义中未包括时不能执行insert语句
5. 可以使用WITH READ ONLY来屏蔽DML操作
三、 内嵌视图
内嵌视图是在from语句中的可以把表改成一个子
查询
。内嵌视图不属于任何用户,也不是对象,内嵌视图是子
查询
的一种。
Select * from
(select * from emp where deptno=10)
where sal>2000
四、 对象视图
对象类型在
数据库
编程中有许多好处,但有时,应用程序已经开发完成。为了迎合对象类型而重建数据表是不现实的。对象视图正是解决这一问题的优秀策略。
五、 物化视图
常用于
数据库
的容灾,不是传统意义上虚拟视图,是实体化视图,和表一样可以存储数据、
查询
数据。主备
数据库
数据同步通过物化视图实现,主备
数据库
通过data link连接,在主备
数据库
物化视图进行数据复制。当主
数据库
垮掉时,备
数据库
接管,实现容灾。
create materialized view materialized_view_name
build [immediate|deferred] --1.创建方式
refresh [complete|fast|force|never] --2.物化视图刷新方式
on [commit|demand] --3.刷新触发方式
start with (start_date) --4.开始时间
next (interval_date) --5.间隔时间
with [primary key|rowid] --默认 primary key
ENABLE QUERY REWRITE --7.是否启用
查询
重写
as --8.关键字
select statement; --9.基表选取数据的select语句
1. 创建方式
immediate(默认):立即
deferred:延迟,至第一次refresh时,才生效
2. 物化视图刷新方式
force(默认):如果可以快速刷新,就执行快速刷新,否则,执行完全刷新
complete:完全刷新,即刷新时更新全部数据,包括视图中已经生成的原有数据
fast:快速刷新,只刷新增量部分。前提是,需要在基表上创建物化视图日志。该日志记录基表数据变化情况,所以才能实现增量刷新
never:从不刷新
3. 刷新触发方式
on commit:基表有commit动作时,刷新视图,不能跨库执行(因为不知道别的库的提交动作)
on demand,在需要时刷新,根据后面设定的起始时间和时间间隔进行刷新,或者手动调用dbms_mview包中的过程刷新时再执行刷新。
4. 开始时间和间隔时间
4和5即开始刷新时间和下次刷新的时间间隔。如:start with sysdate next sysdate+1/1440表示马上开始,刷新间隔为1分钟。(与 on commit选项冲突)
5. 创建模式
primary key(默认):基于基表的主键创建
rowed:不能对基表执行分组函数、多表连结等需要把多个rowid合成一行的操作
6. 是否启用
查询
重写
如果设置了初始化参数query_rewrite_enabled=true则默认就会启用
查询
重写。但是,
数据库
默认该参数为false。并且,不是什么时候都应该启用
查询
重写。所以,该参数应该设置为false,而在创建特定物化视图时,根据需要开启该功能。
7. 注意
如果选择使用了上面第4,5选项,则不支持
查询
重写功能(原因很简单,所谓重写,就是将对基表的
查询
定位到了物化视图上,而4、5选项会造成物化视图上部分数据延迟,所以,不能重写)。
--创建增量刷新的物化视图时应先创建存储的日志空间
--在scott.emp表中创建物化视图日志
create materialized view log on emp
tablespace users with rowid;
--开始创建物化视图
--方式一
create materialized view mv_emp
tablespace users --
指定
表空间
build immediate --创建视图时即生成数据
refresh fast --基于增量刷新
on commit --数据DML操作提交就刷新
with rowid --基于ROWID刷新
as select * from emp
--方式二
create materialized view mv_emp2
tablespace users --
指定
表空间
refresh fast --基于增量刷新
start with sysdate --创建视图时即生成数据
next sysdate+1/1440 /*每隔一分钟刷新一次*/
with rowid --基于ROWID刷新
as select * from emp
--删除物化视图日志
drop materialized view mv_emp
第七章 索引
一、 概述
索引是建立在表上的可选对象,设计索引的目的是为了提高
查询
的速度。但同时索引也会增加系统的负担,进行影响系统的性能。
索引一旦建立后,当在表上进行DML操作时,Oracle会自动维护索引,并决定何时使用索引。
索引的使用对用户是透明的,用户不需要在执行
SQL
语句时
指定
使用哪个索引及如何使用索引,也就是说,无论表上是否创建有索引,
SQL
语句的用法不变。用户在进行操作时,不需要考虑索引的存在,索引只与系统性能相关。
索引的原理
当在一个没有创建索引的表中
查询
符合某个条件的记录时,DBMS会顺序地逐条读取每个记录与
查询
条件进行匹配,这种方式称为全表扫描。全表扫描方式需要遍历整个表,效率很低。
索引的类型
Oracle支持多种类型的索引,可以按列的多少、索引值是否唯一和索引数据的组织形式对索引进行分类,以满足各种表和
查询
条件的要求。
单列索引和复合索引
B树索引
位图索引
函数索引
创建索引
CREATE [UNIQUE] | [BITMAP] INDEX index_name
ON table_name([column1 [ASC|DESC],column2
[ASC|DESC],…] | [express])
[TABLESPACE tablespace_name]
[PCTFREE n1]
[STORAGE (INITIAL n2)]
[NOLOGGING]
[NOLINE]
[NOSORT]
UNIQUE:表示唯一索引,默认情况下,不使用该选项。
BITMAP:表示创建位图索引,默认情况下,不使用该选项。
PCTFREE:
指定
索引在数据块中的空闲空间。对于经常插入数据的表,应该为表中索引
指定
一个较大的空闲空间。
NOLOGGING:表示在创建索引的过程中不产生任何重做日志信息。默认情况下,不使用该选项。
ONLINE:表示在创建或重建索引时,允许对表进行DML操作。默认情况下,不使用该选项。
NOSORT:默认情况下,不使用该选项。则Oracle在创建索引时对表中记录进行
排序
。如果表中数据已经是按该索引顺序排列的,则可以使用该选项。
二、 单列索引和复合索引
一个索引可以由一个或多个列组成。基于单个列所创建的索引称为单列索引,基于两列或多列所创建的索引称为多列索引。
三、 B树索引
B树索引是Oracle
数据库
中最常用的一种索引。当使用CREATE INDEX语句创建索引时,默认创建的索引就是B树索引。B树索引就是一棵二叉树,它由根、分支节点和叶子节点三部分构成。叶子节点
包含
索引列和指向表中每个匹配行的ROWID值。叶子节点是一个双向链表,因此可以对其进行任何方面的范围扫描。
B树索引中所有叶子节点都具有相同的深度,所以不管
查询
条件如何,
查询
速度基本相同。另外,B树索引能够适应各种
查询
条件,包括精确
查询
、模糊
查询
和比较
查询
。
--创建B树索引,属于单列索引
create index idx_emp_job on emp(job)
--创建B树索引,属于复合索引
create index idx_emp_nameorsal on emp(ename,sal)
--创建唯一的B树索引,属于单列索引
create unique index idx_emp_ename on emp(ename)
--删除索引
drop index idx_emp_job
drop index idx_emp_nameorsal
drop index idx_emp_ename
--如果表已存在大量的数据,需要规划索引段
create index idx_emp_nameorsal on emp(ename,sal)
pctfree 30 tablespace system
四、 位图索引
在B树索引中,保存的是经
排序
过的索引列及其对应的ROWID值。但是对于一些基数很小的列来说,这样做并不能显著提高
查询
的速度。所谓基数,是指某个列可能拥有的不重复值的个数。比如性别列的基数为2(只有男和女)。
因此,对于象性别、婚姻状况、政治面貌等只具有几个固定值的
字段
而言,如果要建立索引,应该建立位图索引,而不是默认的B树索引。
--创建位图索引,单列索引
create bitmap index idx_bm_job on emp(job)
--创建位图索引,复合索引
create bitmap index idx_bm_jobordeptno on emp(job,deptno)
--删除位图索引
drop index idx_bm_job
drop index idx_bm_jobordeptno
五、 函数索引
函数索引既可以使用B树索引,也可以使用位图索引,可以根据函数或表达式的结果的基数大小来进行选择,当函数或表达式的结果不确定时采用B树索引,当函数或表达式的结果是固定的几个值时采用位图索引。
--合并索引
alter index idx_emp_ename COALESCE
六、 并和重建索引
表在使用一段时间后,由于用户不断对其进行更新操作,而每次对表的更新必然伴随着索引的改变,因此,在索引中会产生大量的碎片,从而降低索引的使用效率。有两种方法可以清理碎片:合并索引和重建索引。
合并索引就是将B树叶子节点中的存储碎片合并在一起,从而提高存取效率,但这种合并并不会改变索引的物理组织结构。
--创建B树类型的函数索引
create index idx_fun_emp_hiredate on emp(to_char(hiredate,'yyyy-mm-dd'))
--创建位图类型的函数索引
create index idx_fun_emp_job on emp(upper(job))
重建索引相当于删除原来的索引,然后再创建一个新的索引,因此,CREAT INDEX语句中的选项同样适用于重建索引。如果在索引列上频繁进行UPDATE和DELETE操作,为了提高空间的利用率,应该定期重建索引。
七、 管理索引的原则
使用索引的目的是为了提高系统的效率,但同时它也会增加系统的负担,进行影响系统的性能,因为系统必须在进行DML操作后维护索引数据。
在新的
SQL
标准中并不推荐使用索引,而是建议在创建表的时候用主键替代。因此,为了防止使用索引后反而降低系统的性能,应该遵循一些基本的原则:
1. 小表不需要建立索引。
2. 对于大表而言,如果经常
查询
的记录数目少于表中总记录数目的15%时,可以创建索引。这个比例并不绝对,它与全表扫描速度成反比。
3. 对于大部分列值不重复的列可建立索引。
4. 对于基数大的列,适合建立B树索引,而对于基数小的列适合建立位图索引。
5. 对于列中有许多空值,但经常
查询
所有的非空值记录的列,应该建立索引。
6. LONG和LONG RAW列不能创建索引。
7. 经常进行连接
查询
的列上应该创建索引。
8. 在使用CREATE INDEX语句创建
查询
时,将最常
查询
的列放在其他列
前面
。
9. 维护索引需要开销,特别时对表进行插入和删除操作时,因此要限制表中索引的数量。对于主要用于读的表,则索引多就有好处,但是,一个表如果经常被更改,则索引应少点。
10. 在表中插入数据后创建索引。如果在装载数据之前创建了索引,那么当插入每行时,Oracle都必须更改每个索引。
八、 ROWID和ROWNUM
1. ROWID
rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行。rowid是存储在索引中的一组既定的值(当行确定后)。我们可以像表中普通的列一样将它选出来, 利用rowid是访问表中一行的最快方式。rowid的是基于64位编码的18个字符显示(数据对象编号(6)+文件编号(3) +块编号(6)+行编号(3)=18位)
select rowid from emp
ROWID的使用
--快速删除重复的记录
delete from temp t where rowid not in(
select max(rowid) from temp
where t.id=id and t.name=name and t.sal = sal
2. ROWNUM
ROWNUM是一个序列,是oracle
数据库
从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。
select rownum,emp.* from emp
ROWID的使用
--取前3条记录
select * from emp where rownum<=3--方式一
select * from emp where rownum!=4--方式二
select * from emp where empno not in(
select empno from emp where rownum<5--方式一
) and rownum <4
第八章 PL/
SQL
编程
一、 介绍
PL/
SQL
是oracle在标准
sql
语言上的扩展,PL/
SQL
不仅允许嵌入
sql
语言,还可以定义变量和常量,允许使用例外处理各种错误,这样使它的功能变得更加强大。
PL/
SQL
也是一种语言,叫做过程化
sql
语言(procedural language/
sql
),通过此语言可以实现复杂功能或者复杂的计算。
1. 提高应用程序的运行性能
2. 模块化的设计思想
3. 减少网络传输量
4. 提高安全性
1. 可移植性差
2. 违反MVC设计模式
3. 无法进行面向对象编程
4. 无法做成通用的业务逻辑框架
5. 代码可读性差,相当难维护
二、 PL/
SQL
基础
1. 编写规范
1) 注释
--单行注释
/*块注释*/
2) 标识符的命名规范
定义变量:建议用v_作为前缀v_price
定义常量:建议用c_作为前缀c_pi
定义游标:建议用_cursor作为后缀emp_cursor
定义例外:建议用e_作为前缀e_error
2. 块结构
PL/
SQL
块由三个部分组成:定义部分、执行部分、例外处理部分
Declare
定义部分(可选):定义常量、变量、游标、例外,复杂数据类型
begin
执行部分(必须):要执行的PL/
SQL
语句和
SQL
语句
exception
/*例外部分(可选):处理运行各种错误*/
案例一 :只定义执行部分
begin
dbms_output是oracle提供的包(类似java开发包)
该包
包含
一些过程,put_line就是其一个过程
dbms_output.put_line('HELLO WORLD'); --控制台输出
案例二 :定义声明部分和执行部分
declare
--声明变量
v_name varchar2(20);
v_sal number(7,2);
begin
--执行
查询
select ename,sal into v_name,v_sal
from emp where rownum=1;
--控制台输出
dbms_output.put_line('用户名:' || v_name);
dbms_output.put_line('工资:' || v_sal);
案例三 :定义声明部分、执行部分和例外部分
declare
--声明变量
v_name varchar2(20);
v_sal number(7,2);
begin
--执行
查询
,条件中的&表示从控制接受数据
select ename,sal into v_name,v_sal
from emp where empno=&no;
--控制台输出
dbms_output.put_line('用户名:' || v_name);
dbms_output.put_line('工资:' || v_sal);
exception
--例外处理(no_data_found)
when no_data_found then
dbms_output.put_line('执行
查询
没有结果');
3. 预定义例外
1) case_not_found预定义例外
在开发pl/
sql
块中编写case语句时,如果在when子句中没有
包含
必须的条件分支,就会触发case_not_found例外。
2) cursor_already_open预定义例外
当重新打开已经打开的游标时,会隐含的触发cursor_already_open例外。
3) dup_val_on_index预定义例外
在唯一索引所对应的列上插入重复的值时,会隐含的触发例外
4) invalid_cursorn预定义例外
当试图在不合法的游标上执行操作时,会触发该例外
5) invalid_number预定义例外
当输入的数据有误时,会触发该例外
6) no_data_found预定义例外
当执行select into没有返回行,就会触发该例外
7) too_many_rows预定义例外
当执行select into语句时,如果返回超过了一行,则会触发该例外
8) zero_divide预定义例外
当执行2/0语句时,则会触发该例外
9) value_error预定义例外
当在执行赋值操作时,如果变量的长度不足以容纳实际数据,则会触发该例外value_error
10) others
4. 变量类型分类
在编写PL/
SQL
时,可以定义变量和常量,常用的类型主要有:
标量类型(scalar)
复合类型(composite)
参照类型(reference)
lob(large object)
5. 标量类型:常用类型
declare
--定义一个变长
字符串
v_name varchar2(20);
--定义小数,并赋值
v_sal number(7,2) :=9.8;
--定义整数
v_num number(4);
--定义日期
v_birthday date;
--定义布尔类型,不能为空,初始值为false
v_flg boolean not null default false;
--使用%type类型
v_job emp.job%type;
begin
v_flg := true;
v_birthday :=sysdate;
dbms_output.put_line('当前时间:' || v_birthday);
6. 复合类型:可以存放多个值。主要包括PL/
SQL
记录、PL/
SQL
表、嵌入表和varray这四种类型
记录类型:类似于c中的结构体
declare
--定义记录类型
type emp_record_type is record(
empno emp.empno%type,
ename emp.ename%type,
sal emp.sal%type
--定义变量引用记录类型
v_record emp_record_type;
begin
--使用记录类型
select empno,ename,sal into v_record from emp where rownum=1;
--控制台输出
dbms_output.put_line('雇员编号:' || v_record.empno);
dbms_output.put_line('雇员姓名:' || v_record.ename);
dbms_output.put_line('雇员工资:' || v_record.sal);
表类型:类似于java语言中的数组
declare
--声明表类型
type emp_table_type is table of varchar2(20)
index by PLS_INTEGER;--表示表按整数来
排序
v_enames emp_table_type;--定义变量引用表类型
begin
select ename into v_enames(0) from emp where rownum=1;
select ename into v_enames(1) from emp where empno=7499;
select ename into v_enames(2) from emp where empno=7698;
dbms_output.put_line('下标0:' || v_enames(0));
dbms_output.put_line('下标1:' || v_enames(1));
dbms_output.put_line('下标2:' || v_enames(2));
varray类型:可变长数组
declare
--定义varray类型
type varray_list is varray(20) of number(4);
--定义变量引用varray类型
v_list varray_list:=varray_list(7369,7499,7566);
begin
--for i in v_list.first..v_list.last
for i in 1..v_list.count
dbms_output.put_line(v_list(i));
end loop;
PL/
SQL
集合方法
1) exists():用于确定特定集合元素是否存在
2) count:用于返回集合变量的元素总个数
3) limit:用于返回varray变量所允许的最大元素个数
4) first:用于返回集合变量中的一个元素的下标
5) last:用于返回集合变量中最后一个元素的下标
6) prior():返回当前元素前一个元素的下标
7) next():返回当前元素后一个元素的下标
8) extend:为集合变量添加元素,此方法适合用于嵌套表和varray
9) trim:从集合变量尾部删除元素,此方法适用于嵌套表和varray
10) delete:从集合变量中删除特定的元素,此方法适用于嵌套表和index-by表
7. 参照类型:类似c语言中的指针,oracle的游标
三、 PL/
SQL
控制语句
1. 条件分支语句
1) if—then
declare
--声明变量
v_empno emp.empno%type;
v_sal emp.sal%type;
begin
--根据雇员编号
查询
工资
select empno,sal into v_empno,v_sal from emp where empno=&no;
--如果工资小于2000就加100
if v_sal<2000
--工资加100
update emp set sal = sal+100 where empno=v_empno;
commit;
end if;
2) if—then—else
declare
--声明变量
v_loginname varchar2(10);
v_password varchar2(10);
begin
--从控制台接收数据
v_loginname := '&ln';
v_password := '&pw';
if v_loginname = 'admin' and v_password = '123456'
dbms_output.put_line('用户登录成功!');
dbms_output.put_line('用户登录失败!');
end if;
3) if—then—elsif—else
declare
--声明变量
v_empno emp.empno%type;
v_job emp.job%type;
begin
--根据雇员编号
查询
职位
select empno,job into v_empno,v_job from emp where empno=&no;
/*如果雇员所属职位是manager工资加1000
职位是salesman工资加500
其他职位加200
if v_job = 'MANAGER' then
--MANAGER职位工资加1000
update emp set sal = sal+1000 where empno=v_empno;
elsif v_job = 'SALESMAN' then
--SALESMAN职位工资加500
update emp set sal = sal+500 where empno=v_empno;
--其他职位工资加200
update emp set sal = sal+200 where empno=v_empno;
end if;
commit;
4) case
declare
--声明变量
v_mark number(4);
v_outstr varchar2(40);
begin
--从控制台接收成绩
v_mark := &m;
when v_mark=90 then
v_outstr := '优秀';
when v_mark=80 then
v_outstr := '良好';
when v_mark=70 then
v_outstr := '中等';
when v_mark=60 then
v_outstr := '及格';
when v_mark=0 then
v_outstr := '不及格';
v_outstr := '成绩输入有误';
end case;
--控制台输出
dbms_output.put_line(v_outstr);
2. 循环语句
1) loop
LOOP 要执行的语句;
EXIT WHEN /*条件满足,退出循环语句*/
END LOOP;
其中:EXIT WHEN 子句是必须的,否则循环将无法停止。
declare
v_num number(4):=1;
begin
--从控制台接收数据并插入到account表中
insert into account values(v_num,'&name');
exit when v_num =10;
v_num :=v_num+1;
end loop;
2) while
WHILE LOOP要执行的语句;END LOOP;
循环语句执行的顺序是先判断的真假,如果为真则循环执行,否则退出循环
在WHILE循环语
结果:09
3、SUBSTRING(name,5,3) 截取name这个
字段
从第五个字符开始 只截取之后的3个字符
SELECT SUBSTRING('成都融资事业部',5,3)
结果:事业部
4、SUBSTRING(name,3) 截取name这个
字段
从第三个字符开始,之后的所有个字符
SELECT SUBSTRING('成都融资事业部',3)
结果:融资事业部
在
MySQL
中,可以使用CAST或CONVERT函数将
字符串
转换为数字类型,并进行
排序
。下面是一个示例
查询
,演示如何将
字符串
转换为数字类型并进行
排序
:
CAST:强制转换,在其它
数据库
中比较通用,当小数转化为数值,并保留原始表达式中的小数数值时,仍然需要使用CAST
SELECT 列名
FROM 表名
ORDER BY CAST(列名 AS signed);
在这个
查询
中,将"列名"替换为你要
排序
的
字符串
类型列名,"表名"替换为实际表名。
使用CAST函数,将
字符串
转换为有符号整数类型(sign
alter table user modify tel varchar(15) default ‘02087654321’;
修改tel列的位置,在第一列显示
alter table user modify tel varchar(15) default '02087654321' first;
修改tel列的位置,在
指定
列之后显示
alter table user modify tel varchar(15) default '02087654321' after age;
注意:alter modify不支持一次修改多个列,但是Oracle支持多列修改
但是
MySQL
可以通过多个modify的方式完成:
alter table user
modify tel varchar(15) default '02087654321' first,
modify name varchar(20) after tel;
11、 删除
指定
字段
alter table user drop photo;
12、 重命名表数据
alter table user rename to users;
字段
重命名
alter table users change name u_name varchar(10);
alter table users change sex u_sex varchar(10) after u_name;
如果需要改变列名建议使用change,如果需要改变数据类型和显示位置可以使用modify
13、 删除表
drop table users;
drop删除表会删除表结构,表对象将不存在数据中;数据也不会存在;表内的对象也不存在,如:索引、视图、约束;
truncate删除表
truncate都被当成DDL出来,truncate的作用就是删除该表里的全部数据,保留表结构。相当于DDL中的delete语句,
但是truncate比delete语句的速度要快得多。但是truncate不能带条件删除
指定
数据,只会删除所有的数据。如果删除的表有外键,
删除的速度类似于delete。但新版本的
MySQL
中truncate的速度比delete速度快。
MySQL
中约束保存在information_schema
数据库
的table_constraints中,可以通过该表
查询
约束信息;
约束主要完成对数据的检验,保证
数据库
数据的完整性;如果有相互依赖数据,保证该数据不被删除。
常用五类约束:
not null:非空约束,
指定
某列不为空
unique: 唯一约束,
指定
某列和几列组合的数据不能重复
primary key:主键约束,
指定
某列的数据不能重复、唯一
foreign key:外键,
指定
该列记录属于主表中的一条记录,参照另一条数据
check:检查,
指定
一个表达式,用于检验
指定
数据
MySQL
不支持check约束,但可以使用check约束,而没有任何效果;
根据约束数据列限制,约束可分为:
单列约束:每个约束只约束一列
多列约束:每个约束约束多列数据
MySQL
中约束保存在information_schema
数据库
的table_constraints中,可以通过该表
查询
约束信息;
1、 not null约束
非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
Null类型特征:
所有的类型的值都可以是null,包括int、float等数据类型
空
字符串
“”是不等于null,0也不等于null
create table temp(
id int not null,
name varchar(255) not null default ‘abc’,
sex char null
上面的table加上了非空约束,也可以用alter来修改或增加非空约束
增加非空约束
alter table temp
modify sex varchar(2) not null;
取消非空约束
alter table temp modify sex varchar(2) null;
取消非空约束,增加默认值
alter table temp modify sex varchar(2) default ‘abc’ null;
2、 unique
唯一约束是
指定
table的列或列组合不能重复,保证数据的唯一性。虽然唯一约束不允许出现重复的值,但是可以为多个null
同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。
唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。
MySQL
会给唯一约束的列上默认创建一个唯一索引;
create table temp (
id int not null,
name varchar(25),
password varchar(16),
--使用表级约束语法,
constraint uk_name_pwd unique(name, password)
表示用户名和密码组合不能重复
添加唯一约束
alter table temp add unique(name, password);
alter table temp modify name varchar(25) unique;
alter table temp drop index name;
3、 primary key
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束,
那么这些列都不允许为空值,并且组合的值不允许重复。
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
MySQL
的主键名总是PRIMARY,
当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
create table temp(
/*主键约束*/
id int primary key,
name varchar(25)
create table temp2(
id int not null,
name varchar(25),
pwd varchar(15),
constraint pk_temp_id primary key(id)
组合模式:
create table temp2(
id int not null,
name varchar(25),
pwd varchar(15),
constraint pk_temp_id primary key(name, pwd)
alter删除主键约束
alter table temp drop primary key;
alter添加主键
alter table temp add primary key(name, pwd);
alter修改列为主键
alter table temp modify id int primary key;
设置主键自增
create table temp(
id int auto_increment primary key,
name varchar(20),
pwd varchar(16)
auto_increment自增模式,设置自增后在插入数据的时候就不需要给该列插入值了。
4、 foreign key 约束
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个
字段
或是两个表的两个
字段
之间的参照关系。
也就是说从表的外键值必须在主表中能找到或者为空。
当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,
然后才可以删除主表的数据。还有一种就是级联删除子表数据。
注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录,
那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束。
创建外键约束:
create table classes(
id int auto_increment primary key,
name varchar(20)
create table student(
id int auto_increment,
name varchar(22),
constraint pk_id primary key(id),
classes_id int references classes(id)
通常先建主表,然后再建从表,这样从表的参照引用的表才存在。
表级别创建外键约束:
create table student(
id int auto_increment primary key,
name varchar(25),
classes_id int,
foreign key(classes_id) references classes(id)
上面的创建外键的方法没有
指定
约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n,
其中student是表名,n是当前约束从1开始的整数。
指定
约束名称:
create table student(
id int auto_increment primary key,
name varchar(25),
classes_id int,
/*
指定
约束名称*/
constraint fk_classes_id foreign key(classes_id) references classes(id)
多列外键组合,必须用表级别约束语法:
create table classes(
id int,
name varchar(20),
number int,
primary key(name, number)
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/*表级别联合外键*/
foreign key(classes_name, classes_number) references classes(name, number)
删除外键约束:
alter table student drop foreign key student_ibfk_1;
alter table student drop foreign key fk_student_id;
增加外键约束
alter table student add foreign key(classes_name, classes_number) referencesclasses(name, number);
自引用、自关联(递归表、树状表)
create table tree(
id int auto_increment primary key,
name varchar(50),
parent_id int,
foreign key(parent_id) references tree(id)
级联删除:删除主表的数据时,关联的从表数据也删除,则需要在建立外键约束的后面增加on deletecascade
或on delete set null,前者是级联删除,后者是将从表的关联列的值设置为null。
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/*表级别联合外键*/
foreign key(classes_name, classes_number) references classes(name, number) on deletecascade
5、 check约束
MySQL
可以使用check约束,但check约束对数据验证没有任何作用。
create table temp(
id int auto_increment,
name varchar(20),
age int,
primary key(id),
/*check约束*/
check(age > 20)
上面check约束要求age必须大于0,但没有任何作用。但是创建table的时候没有任何错误或警告。
索引是存放在模式(schema)中的一个
数据库
对象,索引的作用就是提高对表的检索
查询
速度,
索引是通过快速访问的方法来进行快速定位数据,从而减少了对磁盘的读写操作。
索引是
数据库
的一个对象,它不能独立存在,必须对某个表对象进行依赖。
提示:索引保存在information_schema
数据库
里的STATISTICS表中。
创建索引方式:
自动:当表上定义主键约束、唯一、外键约束时,该表会被系统自动添加上索引。
手动:手动在相关表或列上增加索引,提高
查询
速度。
删除索引方式:
自动:当表对象被删除时,该表上的索引自动被删除
手动:手动删除
指定
表对象的相关列上的索引
索引类似于书籍的目录,可以快速定位到相关的数据,一个表可以有多个索引。
创建索引:
create index idx_temp_name on temp(name);
组合索引:
create index idx_temp_name$pwd on temp(name, pwd);
删除索引:
drop index idx_temp_name on temp;
视图就是一个表或多个表的
查询
结果,它是一张虚拟的表,因为它并不能存储数据。
视图的作用、优点:
限制对数据的访问
让复杂
查询
变得简单
提供数据的独立性
可以完成对相同数据的不同显示
创建、修改视图
create or replace view view_temp
select name, age from temp;
通常我们并不对视图的数据做修改操作,因为视图是一张虚拟的表,它并不存储实际数据。如果想让视图不被修改,可以用with check option来完成限制。
create or replace view view_temp
select * from temp
with check option;
修改视图:
alter view view_temp
select id, name from temp;
删除视图:
drop view view_temp;
显示创建语法:
show create view v_temp;
Ø DML语句
DML主要针对
数据库
表对象的数据而言的,一般DML完成:
插入新数据
修改已添加的数据
删除不需要的数据
1、 insert into 插入语句
insert into temp values(null, ‘jack’, 25);
主键自增可以不插入,所以用null代替
insert into temp(name, age) values(‘jack’, 22);
在表面后面带括号,括号中写列名,values中写
指定
列名的值即可。当省略列名就表示插入全部数据,
注意插入值的顺序和列的顺序需要保持一致。
Set方式插入,也可以
指定
列
insert into temp set id = 7, name = 'jason';
MySQL
中外键的table的外键引用列可以插入数据可以为null,不参照主表的数据。
使用子
查询
插入数据
insert into temp(name) select name from classes;
insert into temp values(null, ‘jack’, 22), (null, ‘jackson’ 23);
2、 update 修改语句
update主要完成对数据的修改操作,可以修改一条或多条数据。修改多条或
指定
条件的数据,需要用where条件来完成。
修改所有数据
update temp set name = ‘jack2’;
所有的数据的name会被修改,如果修改多列用“,”分开
update temp set name = ‘jack’, age = 22;
修改
指定
条件的记录需要用where
update temp set name = ‘jack’ where age > 22;
3、 delete 删除语句
删除table中的数据,可以删除所有,带条件可以删除
指定
的记录。
删除所有数据
delete from temp;
删除
指定
条件数据
delete from temp where age > 20;
Ø select
查询
、function 函数
select
查询
语句用得最广泛、功能也最丰富。可以完成单条记录、多条记录、单表、多表、子
查询
等。
1、
查询
某张表所有数据
select * from temp;
*代表所有列,temp代表表名,不带条件就
查询
所有数据
2、
查询
指定
列和条件的数据
select name, age from temp where age = 22;
查询
name和age这两列,age 等于22的数据。
3、 对
查询
的数据进行运算操作
select age + 2, age / 2, age – 2, age * 2 from temp where age – 2 > 22;
4、 concat函数,
字符串
连接
select concat(name, ‘-eco’) from temp;
concat和null进行连接,会导致连接后的数据成为null
5、 as 对列重命名
select name as ‘名称’ from temp;
as也可以省略不写,效果一样
如果重命名的列名出现特殊字符,如“‘”单引号,那就需要用双引号引在外面
select name as “名’称” from temp;
6、 也可以给table去别名
select t.name Name from temp as t;
7、
查询
常量
类似于
SQL
Server
select 5 + 2;
select concat('a', 'bbb');
8、 distinct 去掉重复数据
select distinct id from temp;
多列将是组合的重复数据
select distinct id, age from temp;
9、 where 条件
查询
大于>、大于等于>=、小于<、小于等于<=、等于=、不等于<>
都可以出现在where语句中
select * from t where a > 2 or a >= 3 or a < 5 or a <= 6 or a = 7 or a <> 0;
10、 and 并且
select * from temp where age > 20 and name = ‘jack’;
查询
名称等于jack并且年龄大于20的
11、 or 或者
满足一个即可
select * from tmep where name = ‘jack’ or name = ‘jackson’;
12、 between v and v2
大于等于v且小于等于v2
select * form temp where age between 20 and 25;
13、 in
查询
可以多个条件 类似于or
select * from temp where id in (1, 2, 3);
查询
id在括号中出现的数据
14、 like 模糊
查询
查询
name以j开头的
select * from temp where name like ‘j%’;
查询
name
包含
k的
select * from temp where name like ‘%k%’;
escape转义
select * from temp where name like ‘/_%’ escape ‘/’;
指定
/为转义字符,上面的就可以
查询
name中
包含
“_”的数据
15、 is null、is not null
查询
为null的数据
select * from temp where name is null;
查询
不为null的数据
select * from temp where name is not null;
16、 not
select * from temp where not (age > 20);
取小于等于20的数据
select * from temp where id not in(1, 2);
17、 order by
排序
,有desc、asc升序、降序
select * from temp order by id;
默认desc
排序
select * from temp order by id asc;
select * from temp order by id, age;
Ø function 函数
函数的作用比较大,一般多用在select
查询
语句和where条件语句之后。按照函数返回的结果,
可以分为:多行函数和单行函数;所谓的单行函数就是将每条数据进行独立的计算,然后每条数据得到一条结果。
如:
字符串
函数;而多行函数,就是多条记录同时计算,得到最终只有一条结果记录。如:sum、avg等
多行函数也称为聚集函数、分组函数,主要用于完成一些统计功能。
MySQL
的单行函数有如下特征:
单行函数的参数可以是变量、常量或数据列。单行函数可以接受多个参数,但返回一个值。
单行函数就是它会对每一行单独起作用,每一行(可能
包含
多个参数)返回一个结果。
单行函数可以改变参数的数据类型。单行函数支持嵌套使用:内层函数的返回值是外层函数的参数。
单行函数可以分为:
类型转换函数;
流程控制语句;
加密解密函数;
1、 char_length字符长度
select char_length(tel) from user;
2、 sin函数
select sin(age) from user;
select sin(1.57);
3、 添加日期函数
select date_add('2010-06-21', interval 2 month);
interval是一个关键字,2 month是2个月的意思,2是数值,month是单位
select addDate('2011-05-28', 2);
在
前面
的日期上加上后面的天数
4、 获取当前系统时间、日期
select curdate();
select curtime();
5、 加密函数
select md5('zhangsan');
6、 Null 处理函数
select ifnull(birthday, 'is null birthday') from user;
如果birthday为null,就返回后面的
字符串
select nullif(age, 245) from user;
如果age等于245就返回null,不等就返回age
select isnull(birthday) from user;
判断birthday是否为null
select if(isnull(birthday), 'birthday is null', 'birthday not is null') from user;
如果birthday为null或是0就返回birthday is null,否则就返回birthday not is null;类似于三目运算符
7、 case 流程函数
case函数是一个流程控制函数,可以接受多个参数,但最终只会返回一个结果。
select name,
(case sex
when 1 then '男'
when 0 then '女'
else '火星人'
) sex
from user;
组函数就是多行函数,组函数是完成一行或多行结果集的运算,最后返回一个结果,而不是每条记录返回一个结果。
1、 avg平均值运算
select avg(age) from user;
select avg(distinct age) from user;
2、 count 记录条数统计
select count(*), count(age), count(distinct age) from user;
3、 max 最大值
select max(age), max(distinct age) from user;
4、 min 最小值
select min(age), min(distinct age) from user;
5、 sum 求和、聚和
select sum(age), sum(distinct age) from user;
select sum(ifnull(age, 0)) from user;
6、 group by 分组
select count(*), sex from user group by sex;
select count(*) from user group by age;
select * from user group by sex, age;
7、 having进行条件过滤
不能在where子句中过滤组,where子句仅用于过滤行。过滤group by需要having
不能在where子句中用组函数,having中才能用组函数
select count(*) from user group by sex having sex <> 2;
Ø 多表
查询
和子
查询
数据库
的
查询
功能最为丰富,很多时候需要用到
查询
完成一些事物,而且不是单纯的对一个表进行操作。而是对多个表进行联合
查询
,
MySQL
中多表连接
查询
有两种规范,较早的
SQL
92规范支持,如下几种表连接
查询
:
非等值连接
广义笛卡尔积
SQL
99规则提供了可读性更好的多表连接语法,并提供了更多类型的连接
查询
,
SQL
99支持如下几种多表连接
查询
:
使用using子句的连接
使用on子句连接
全部连接或者左右外连接
SQL
92的连接
查询
SQL
92的连接
查询
语法比较简单,多将多个table放置在from关键字之后,多个table用“,”隔开;
连接的条件放在where条件之后,与
查询
条件直接用and逻辑运算符进行连接。如果条件中使用的是相等,
则称为等值连接,相反则称为非等值,如果没有任何条件则称为广义笛卡尔积。
广义笛卡尔积:select s.*, c.* from student s, classes c;
等值:select s.*, c.* from student s, classes c where s.cid = c.id;
非等值:select s.*, c.* from student s, classes c where s.cid <> c.id;
select s.*, c.name classes from classes c, student s where c.id = s.classes_id ands.name is not null;
SQL
99连接
查询
1、交叉连接cross join,类似于
SQL
92的笛卡尔积
查询
,无需条件。如:
select s.*, c.name from student s cross join classes c;
2、自然连接 natural join
查询
,无需条件,默认条件是将2个table中的相同
字段
作为连接条件,如果没有相同
字段
,
查询
的结果就是空。
select s.*, c.name from student s natural join classes c;
3、using子句连接
查询
:using的子句可以是一列或多列,显示的
指定
两个表中同名列作为连接条件。
如果用natural join的连接
查询
,会把所有的相同
字段
作为连接
查询
。而using可以
指定
相同列及个数。
select s.*, c.name from student s join classes c using(id);
4、 join … on连接
查询
,
查询
条件在on中完成,每个on语句只能
指定
一个条件。
select s.*, c.name from student s join classes c on s.classes_id = c.id;
5、 左右外连接:3种外连接,left [outer] join、right [outer] join,连接条件都是通过用on子句来
指定
,条件可以等值、非等值。
select s.*, c.name from student s left join classes c on s.classes_id = c.id;
select s.*, c.name from student s right join classes c on s.classes_id = c.id;
子
查询
就是指在
查询
语句中嵌套另一个
查询
,子
查询
可以支持多层嵌套。子
查询
可以出现在2个位置:
from关键字之后,被当做一个表来进行
查询
,这种用法被称为行内视图,因为该子
查询
的实质就是一个临时视图
出现在where条件之后作为过滤条件的值
子
查询
注意点:
子
查询
用括号括起来,特别情况下需要起一个临时名称
子
查询
当做临时表时(在from之后的子
查询
),可以为该子
查询
起别名,尤其是要作为前缀来限定数据列名时
子
查询
用作过滤条件时,将子
查询
放在比较运算符的右边,提供可读性
子
查询
作为过滤条件时,单行子
查询
使用单行运算符,多行子
查询
用多行运算符
将from后面的子
查询
当做一个table来用:
select * from (select id, name from classes) s where s.id in (1, 2);
当做条件来用:
select * from student s where s.classes_id in (select id from classes);
select * from student s where s.classes_id = any (select id from classes);
select * from student s where s.classes_id > any (select id from classes);
Ø 操作符和函数
1、 boolean只判断
select 1 is true, 0 is false, null is unknown;
select 1 is not unknown, 0 is not unknown, null is not unknown;
2、 coalesce函数,返回第一个非null的值
select coalesce(null, 1);
select coalesce(1, 1);
select coalesce(null, 1);
select coalesce(null, null);
3、 当有2个或多个参数时,返回最大的那个参数值
select greatest(2, 3);
select greatest(2, 3, 1, 9, 55, 23);
select greatest('D', 'A', 'B');
4、 Least函数,返回最小值,如果有null就返回null值
select least(2, 0);
select least(2, 0, null);
select least(2, 10, 22.2, 35.1, 1.1);
5、 控制流函数
select case 1 when 1 then 'is 1' when 2 then 'is 2' else 'none' end;
select case when 1 > 2 then 'yes' else 'no' end;
6、 ascii
字符串
函数
select ascii('A');
select ascii('1');
7、 二进制函数
select bin(22);
8、 返回二进制
字符串
长度
select bit_length(11);
9、 char将值转换成字符,小数取整四舍五入
select char(65);
select char(65.4);
select char(65.5);
select char(65.6);
select char(65, 66, 67.4, 68.5, 69.6, '55.5', '97.3');
10、 using改变字符集
select charset(char(0*65)), charset(char(0*65 using utf8));
11、 得到字符长度char_length,character_length
select char_length('abc');
select character_length('eft');
12、 compress压缩
字符串
、uncompress解压缩
select compress('abcedf');
select uncompress(compress('abcedf'));
13、 concat_ws分隔
字符串
select concat_ws('#', 'first', 'second', 'last');
select concat_ws('#', 'first', 'second', null, 'last');
Ø 事务处理
开始事务:start transaction
提交事务:commit
回滚事务:rollback
设置自动提交:set autocommit 1 | 0
atuoCommit系统默认是1立即提交模式;如果要手动控制事务,需要设置set autoCommit 0;
这样我们就可以用commit、rollback来控制事务了。
在一段语句块中禁用autocommit 而不是set autocommit
start transaction;
select @result := avg(age) from temp;
update temp set age = @result where id = 2;
select * from temp where id = 2;//值被改变
rollback;//回滚
select * from temp where id = 2;//变回来了
在此期间只有遇到commit、rollback,start Transaction的禁用autocommit才会结束。然后就恢复到原来的autocommit模式;
不能回滚的语句
有些语句不能被回滚。通常,这些语句包括数据定义语言(DDL)语句,比如创建或取消
数据库
的语句,
和创建、取消或更改表或存储的子程序的语句。
您在设计事务时,不应
包含
这类语句。如果您在事务的前部中发布了一个不能被回滚的语句,
则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。
一些操作也会隐式的提交事务
如alter、create、drop、rename table、lock table、set autocommit、starttransaction、truncate table 等等,
在事务中出现这些语句也会提交事务的
事务不能嵌套事务
事务的保存点
Savepoint pointName/Rollback to savepoint pointName
一个事务可以设置多个保存点,rollback可以回滚到
指定
的保存点,恢复保存点后面的操作。
如果有后面的保存点和
前面
的同名,则删除
前面
的保存点。
Release savepoint会删除一个保存点,如果在一段事务中执行commit或rollback,则事务结束,所以保存点删除。
Set Transaction设计
数据库
隔离级别
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
本语句用于设置事务隔离等级,用于下一个事务,或者用于当前会话。
在默认情况下,SET TRANSACTION会为下一个事务(还未开始)设置隔离等级。
如果您使用GLOBAL关键词,则语句会设置全局性的默认事务等级,
用于从该点以后创建的所有新连接。原有的连接不受影响。使用SESSION关键测可以设置默认事务等级,
用于对当前连接执行的所有将来事务。
默认的等级是REPEATABLE READ全局隔离等级。
select 1+1; # 单行注释
select 1+1; -- 单行注释
select 1 /* 多行注释 */ + 1;
Ø 基本数据类型操作
select 'hello', '"hello"', '""hello""', 'hel''lo', '/'hello';
select "hello", "'hello'", "''hello''", "hel""lo", "/"hello";
select 'This/nIs/nFour/nLines';
select 'hello / world!';
select 'hello /world!';
select 'hello // world!';
select 'hello /' world!';
Ø 设置
数据库
mode模式
SET
sql
_mode='ANSI_QUOTES';
create table t(a int);
create table "tt"(a int);
create table "t""t"(a int);
craate talbe tab("a""b" int);
Ø 用户变量
set @num1 = 0, @num2 = 2, @result = 0;
select @result := (@num1 := 5) + @num2 := 3, @num1, @num2, @result;
Ø 存储过程
创建存储过程:
delimiter //
create procedure get(out result int)
begin
select max(age) into result from temp;
end//
调用存储过程:
call get(@temp);
查询
结果:
select @temp;
删除存储过程:
drop procedure get;
查看存储过程创建语句:
show create procedure get;
select…into 可以完成单行记录的赋值:
create procedure getRecord(sid int)
begin
declare v_name varchar(20) default 'jason';
declare v_age int;
declare v_sex bit;
select name, age, sex into v_name, v_age, v_sex from temp where id = sid;
select v_name, v_age, v_sex;
call getRecord(1);
函数类似于存储过程,只是调用方式不同
例如:select max(age) from temp;
创建函数:
create function addAge(age int) returns int
return age + 5;
使用函数:
select addAge(age) from temp;
删除函数:
drop function if exists addAge;
drop function addAge;
显示创建语法:
show create function addAge;
声明游标:declare cur_Name cursor for select name from temp;
打开游标:open cur_Name;
Fetch游标:fetch cur_Name into @temp;
关闭游标:close cur_Name;
CREATE PROCEDURE cur_show()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_id, v_age INT;
DECLARE v_name varchar(20);
DECLARE cur_temp CURSOR FOR SELECT id, name, age FROM temp;
DECLARE CONTINUE HANDLER FOR
SQL
STATE '02000' SET done = 1;
OPEN cur_temp;
REPEAT
FETCH cur_temp INTO v_id, v_name, v_age;
IF NOT done THEN
IF isnull(v_name) THEN
update temp set name = concat('test-json', v_id) where id = v_id;
ELSEIF isnull(v_age) THEN
update temp set age = 22 where id = v_id;
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur_temp;
Ø 触发器
触发器分为insert、update、delete三种触发器事件类型
还有after、before触发时间
创建触发器:
create trigger trg_temp_ins
before insert
on temp for each row
begin
insert into temp_log values(NEW.id, NEW.name);
end//
删除触发器:
drop trigger trg_temp_ins
MYSQL
常用命令
1.导出整个
数据库
mysql
dump -u 用户名 -p --default-character-set=latin1
数据库
名 > 导出的文件名(
数据库
默认编码是latin1)
mysql
dump -u wcnc -p smgp_apps_wcnc > wcnc.
sql
2.导出一个表
mysql
dump -u 用户名 -p
数据库
名 表名> 导出的文件名
mysql
dump -u wcnc -p smgp_apps_wcnc users> wcnc_users.
sql
3.导出一个
数据库
结构
mysql
dump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.
sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
4.导入
数据库
A:常用source 命令
进入
mysql
数据库
控制台,
如
mysql
-u root -p
mysql
>use
数据库
然后使用source命令,后面参数为脚本文件(如这里用到的.
sql
)
mysql
>source wcnc_db.
sql
B:使用
mysql
dump命令
mysql
dump -u username -p dbname < filename.
sql
C:使用
mysql
命令
mysql
-u username -p -D dbname
2、退出
MySQL
:quit或exit
二、库操作
1、、创建
数据库
命令:create database
例如:建立一个名为xhkdb的
数据库
mysql
> create database xhkdb;
2、显示所有的
数据库
命令:show databases (注意:最后有个s)
mysql
> show databases;
3、删除
数据库
命令:drop database
例如:删除名为 xhkdb的
数据库
mysql
> drop database xhkdb;
4、连接
数据库
命令: use
例如:如果xhkdb
数据库
存在,尝试存取它:
mysql
> use xhkdb;
屏幕提示:Database changed
5、查看当前使用的
数据库
mysql
> select database();
6、当前
数据库
包含
的表信息:
mysql
> show tables; (注意:最后有个s)
三、表操作,操作之前应连接某个
数据库
命令:create table ( [,.. ]);
mysql
> create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default '0',
> degree double(16,2));
2、获取表结构
命令: desc 表名,或者show columns from 表名
mysql
>DESCRIBE MyClass
mysql
> desc MyClass;
mysql
> show columns from MyClass;
3、删除表
命令:drop table
例如:删除表名为 MyClass 的表
mysql
> drop table MyClass;
4、插入数据
命令:insert into [( [,.. ])] values ( 值1 )[, ( 值n )]
例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99,编号为3 的名为Wang 的成绩为96.5.
mysql
> insert into MyClass values(1,'Tom',96.45),(2,'Joan',82.99), (2,'Wang', 96.59);
5、
查询
表中的数据
1)、
查询
所有行
命令: select from where
例如:查看表 MyClass 中所有数据
mysql
> select * from MyClass;
2)、
查询
前几行数据
例如:查看表 MyClass 中前2行数据
mysql
> select * from MyClass order by id limit 0,2;
mysql
> select * from MyClass limit 0,2;
6、删除表中数据
命令:delete from 表名 where 表达式
例如:删除表 MyClass中编号为1 的记录
mysql
> delete from MyClass where id=1;
7、修改表中数据:update 表名 set
字段
=新值,… where 条件
mysql
> update MyClass set name='Mary' where id=1;
7、在表中增加
字段
:
命令:alter table 表名 add
字段
类型 其他;
例如:在表MyClass中添加了一个
字段
passtest,类型为int(4),默认值为0
mysql
> alter table MyClass add passtest int(4) default '0'
8、更改表名:
命令:rename table 原表名 to 新表名;
例如:在表MyClass名字更改为YouClass
mysql
> rename table MyClass to YouClass;
更新
字段
内容
update 表名 set
字段
名 = 新内容
update 表名 set
字段
名 = replace(
字段
名,'旧内容','新内容');
文章
前面
加入4个空格
update article set content=concat(' ',content);
字段
类型
1.INT[(M)] 型: 正常大小整数类型
2.DOUBLE[(M,D)] [ZEROFILL] 型: 正常大小(双精密)浮点数字类型
3.DATE 日期类型:支持的范围是1000-01-01到9999-12-31。
MySQL
以YYYY-MM-DD格式来显示DATE值,但是允许你使用
字符串
或数字把值赋给DATE列
4.CHAR(M) 型:定长
字符串
类型,当存储时,总是是用空格填满右边到
指定
的长度
5.BLOB TEXT类型,最大长度为65535(2^16-1)个字符。
6.VARCHAR型:变长
字符串
类型
5.导入
数据库
表
(1)创建.
sql
文件
(2)先产生一个库如auction.c:
mysql
bin>
mysql
admin -u root -p creat auction,会提示输入密码,然后成功创建。
(2)导入auction.
sql
文件
c:
mysql
bin>
mysql
-u root -p auction grant select,insert,delete,create,drop
on *.* (或test.*/user.*/..)
to 用户名@localhost
identified by '密码';
如:新建一个用户帐号以便可以访问
数据库
,需要进行如下操作:
mysql
> grant usage
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected (0.15 sec)
此后就创建了一个新用户叫:testuser,这个用户只能从localhost连接到
数据库
并可以连接到test
数据库
。下一步,我们必须
指定
testuser这个用户可以执行哪些操作:
mysql
> GRANT select, insert, delete,update
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected (0.00 sec)
此操作使testuser能够在每一个test
数据库
中的表执行SELECT,INSERT和DELETE以及UPDATE
查询
操作。现在我们结束操作并退出
MySQL
客户程序:
mysql
> exit
Bye9!
1:使用SHOW语句找出在服务器上当前存在什么
数据库
:
mysql
> SHOW DATABASES;
2:2、创建一个
数据库
MYSQL
DATA
mysql
> Create DATABASE
MYSQL
DATA;
3:选择你所创建的
数据库
mysql
> USE
MYSQL
DATA; (按回车键出现Database changed 时说明操作成功!)
4:查看现在的
数据库
中存在什么表
mysql
> SHOW TABLES;
5:创建一个
数据库
表
mysql
> Create TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
6:显示表的结构:
mysql
> DESCRIBE MYTABLE;
7:往表中加入记录
mysql
> insert into MYTABLE values ("hyq","M");
8:用文本方式将数据装入
数据库
表中(例如D:/
mysql
.txt)
mysql
> LOAD DATA LOCAL INFILE "D:/
mysql
.txt" INTO TABLE MYTABLE;
9:导入.
sql
文件命令(例如D:/
mysql
.
sql
)
mysql
>use database;
mysql
>source d:/
mysql
.
sql
;
10:删除表
mysql
>drop TABLE MYTABLE;
11:清空表
mysql
>delete from MYTABLE;
12:更新表中数据
mysql
>update MYTABLE set sex="f" where name='hyq';
以下是无意中在网络看到的使用
MySql
的管理心得,
摘自:http://www1.xjtusky.com/article/htmldata/2004_12/3/57/article_1060_1.html
在windows中
MySql
以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start
mysql
命令启动。而Linux中启动时可用“/etc/rc.d/init.d/
mysql
d start"命令,注意启动者应具有管理员权限。
刚安装好的
MySql
包含
一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、 root帐户设置密码,可用如下命令进行:
use
mysql
;
delete from User where User="";
update User set Password=PASSWORD('newpassword') where User='root';
如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host
字段
,在进行了以上更改后应重新启动
数据库
服务,此时登录时可用如下类似命令:
mysql
-uroot -p;
mysql
-uroot -pnewpassword;
mysql
mydb -uroot -p;
mysql
mydb -uroot -pnewpassword;
上面命令参数是常用参数的一部分,详细情况可参考文档。此处的mydb是要登录的
数据库
的名称。
在进行开发和实际应用中,用户不应该只用root用户进行连接
数据库
,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的
数据库
权限。如一个只进行数据插入的用户不应赋予其删除数据的权限。
MySql
的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下:
grant all on mydb.* to NewUserName@HostName identified by "password" ;
grant usage on *.* to NewUserName@HostName identified by "password";
grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";
grant update,delete on mydb.TestTable to NewUserName@HostName identified by "password";
若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的用户,Password
字段
应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码。对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应
字段
,也可以使用REVOKE操作。
下面给出本人从其它资料(www.cn-java.com)获得的对常用权限的解释:
全局管理权限:
FILE: 在
MySQL
服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭
MySQL
服务。
数据库
/数据表/数据列权限:
Alter: 修改已存在的数据表(例如增加/删除列)和索引。
Create: 建立新的
数据库
或数据表。
Delete: 删除表的记录。
Drop: 删除数据表或
数据库
。
INDEX: 建立或删除索引。
Insert: 增加表的记录。
Select: 显示/搜索表的记录。
Update: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
---------------------
MYSQL
常用命令
有很多朋友虽然安装好了
mysql
但却不知如何使用它。在这篇文章中我们就从连接
MYSQL
、修改密码、增加用户等方面来学习一些
MYSQL
的常用命令。
有很多朋友虽然安装好了
mysql
但却不知如何使用它。在这篇文章中我们就从连接
MYSQL
、修改密码、增加用户等方面来学习一些
MYSQL
的常用命令。
一、连接
MYSQL
格式:
mysql
-h主机地址 -u用户名 -p用户密码
1、例1:连接到本机上的
MYSQL
首先在打开DOS窗口,然后进入目录
mysql
bin,再键入命令
mysql
-uroot -p,回车后提示你输密码,如果刚安装好
MYSQL
,超级用户root是没有密码的,故直接回车即可进入到
MYSQL
中了,
MYSQL
的提示符是:
mysql
>
2、例2:连接到远程主机上的
MYSQL
假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
mysql
-h110.110.110.110 -uroot -pabcd123
(注:u与root可以不用加空格,其它也一样)
3、退出
MYSQL
命令: exit (回车)
二、修改密码
格式:
mysql
admin -u用户名 -p旧密码 password 新密码
1、例1:给root加个密码ab12。首先在DOS下进入目录
mysql
bin,然后键入以下命令
mysql
admin -uroot -password ab12
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
2、例2:再将root的密码改为djg345
mysql
admin -uroot -pab12 password djg345
MYSQL
常用命令(下)
一、操作技巧
1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。
2、你可以使用光标上下键调出以前的命令。但以前我用过的一个
MYSQL
旧版本不支持。我现在用的是
mysql
-3.23.27-beta-win。
二、显示命令
1、显示
数据库
列表。
show databases;
刚开始时才两个
数据库
:
mysql
和test。
mysql
库很重要它里面有
MYSQL
的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
2、显示库中的数据表:
use
mysql
; //打开库,学过FOXBASE的一定不会陌生吧
show tables;
3、显示数据表的结构:
describe 表名;
4、建库:
create database 库名;
5、建表:
use 库名;
create table 表名 (
字段
设定列表);
6、删库和删表:
drop database 库名;
drop table 表名;
7、将表中记录清空:
delete from 表名;
8、显示表中的记录:
select * from 表名;
三、一个建库和建表以及插入数据的实例
drop database if exists school; //如果存在SCHOOL则删除
create database school; //建立库SCHOOL
use school; //打开库SCHOOL
create table teacher //建立表TEACHER
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default '深圳',
year date
); //建表结束
//以下为插入
字段
insert into teacher values('','glchengang','深圳一中','1976-10-10');
insert into teacher values('','jack','深圳一中','1975-12-23');
注:在建表中(1)将ID设为长度为3的数字
字段
:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主
字段
primary key
(2)将NAME设为长度为10的字符
字段
(3)将ADDRESS设为长度50的字符
字段
,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。
(4)将YEAR设为日期
字段
。
如果你在
mysql
提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.
sql
,然后复制到c:\下,并在DOS状态进入目录\
mysql
\bin,然后键入以下命令:
mysql
-uroot -p密码 school.bbb
注释:将
数据库
school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
一.SELECT语句的完整语法为:
SELECT[ALL|DISTINCT|DISTINCTROW|TOP]
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
FROM tableexpression[,…][IN externaldatabase]
[WHERE…]
[GROUP BY…]
[HAVING…]
[ORDER BY…]
[WITH OWNERACCESS OPTION]
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
1 FROM子句
FROM 子句
指定
了SELECT语句中
字段
的来源。FROM子句后面是
包含
一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的
查询
或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或
查询
存储在外部
数据库
,在IN 子句之后指明其完整路径。
例:下列
SQL
语句返回所有有定单的客户:
SELECT OrderID,Customer.customerID
FROM Orders Customers
WHERE Orders.CustomerID=Customers.CustomeersID
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
(1) ALL 返回满足
SQL
语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
例:SELECT ALL FirstName,LastName
FROM Employees
(2) DISTINCT 如果有多个记录的选择
字段
的数据相同,只返回一个。
(3) DISTINCTROW 如果有重复的记录,只返回一个
(4) TOP显示
查询
头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
例:返回5%定货额最大的定单
SELECT TOP 5 PERCENT*
FROM [ Order Details]
ORDER BY UnitPrice*Quantity*(1-Discount) DESC
3 用 AS 子句为
字段
取别名
如果想为返回的列取一个新的标题,或者,经过对
字段
的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
例:返回FirstName
字段
取别名为NickName
SELECT FirstName AS NickName ,LastName ,City
FROM Employees
例:返回新的一列显示库存价值
SELECT ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
FROM Products
二 .WHERE 子句
指定
查询
条件
1 比较运算符
比较运算符 含义
= 大于等于
<= 小于等于
!> 不大于
!#1/1/96# AND OrderDate#96-1-1#
也可以表示为:
WHERE OrderDate>Datevalue(‘1/1/96’)
使用 NOT 表达式求反。
例:查看96年1月1日以后的定单
WHERE Not OrderDateQuantity
另一种方法是用 Microsof JET
SQL
独有的 JNNER JOIN
FROM table1 INNER JOIN table2
ON table1.field1 comparision table2.field2
其中comparision 就是
前面
WHERE子句用到的比较运算符。
SELECT FirstName,lastName,OrderID,CustomerID,OrderDate
FROM Employees
INNER JOIN Orders ON Employees.EmployeeID=Orders.EmployeeID
INNER JOIN不能连接Memo OLE Object Single Double 数据类型
字段
。
在一个JOIN语句中连接多个ON子句
SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2 OR
ON table1.field3 compopr table2.field3
SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOER] [( ]tablex[INNER JOIN]
ON table1.field1 compopr table2.field1
ON table1.field2 compopr table2.field2
ON table1.field3 compopr table2.field3
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
FROM table [LEFT|RIGHT]JOIN table2
ON table1.field1comparision table.field2
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
例:不管有没有定货量,返回所有商品
SELECT ProductName ,OrderID
FROM Products
LEFT JOIN Orders ON Products.PrductsID=Orders.ProductID
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的
字段
是否有空值。
SELECT *
FROM talbe1
LEFT JOIN table2 ON table1.a=table2.c
1 连接
查询
中使用Iif函数实现以0值显示空值
Iif表达式: Iif(IsNull(Amount,0,Amout)
例:无论定货大于或小于¥50,都要返回一个标志。
Iif([Amount]>50,?Big order?,?Small order?)
五. 分组和总结
查询
结果
在
SQL
的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个
字段
来分组,而将记录分组后,用HAVING子句过滤这些记录。
GROUP BY 子句的语法
SELECT fidldlist
FROM table
WHERE criteria
[GROUP BY groupfieldlist [HAVING groupcriteria]]
注:Microsoft Jet
数据库
Jet 不能对备注或OLE对象
字段
分组。
GROUP BY
字段
中的Null值以备分组但是不能被省略。
在任何
SQL
合计函数中不计算Null值。
GROUP BY子句后最多可以带有十个
字段
,
排序
优先级按从左到右的顺序排列。
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
SELECT Title ,Count(Title) as Total
FROM Employees
WHERE Region = ‘WA’
GROUP BY Title
HAVING Count(Title)>1
JET
SQL
中的聚积函数
聚集函数 意义
SUM ( ) 求和
AVG ( ) 平均值
COUNT ( ) 表达式中记录的数目
COUNT (* ) 计算记录的数目
MAX 最大值
MIN 最小值
VAR 方差
STDEV 标准误差
FIRST 第一个值
LAST 最后一个值
六. 用Parameters声明创建参数
查询
Parameters声明的语法:
PARAMETERS name datatype[,name datatype[, …]]
其中name 是参数的标志符,可以通过标志符引用参数.
Datatype说明参数的数据类型.
使用时要把PARAMETERS 声明置于任何其他语句之前.
PARAMETERS[Low price] Currency,[Beginning date]datatime
SELECT OrderID ,OrderAmount
FROM Orders
WHERE OrderAMount>[low price]
AND OrderDate>=[Beginning date]
七. 功能
查询
所谓功能
查询
,实际上是一种操作
查询
,它可以对
数据库
进行快速高效的操作.它以选择
查询
为目的,挑选出符合条件的数据,再对数据进行批处理.功能
查询
包括更新
查询
,删除
查询
,添加
查询
,和生成表
查询
.
1 更新
查询
UPDATE子句可以同时更改一个或多个表中的数据.它也可以同时更改多个
字段
的值.
更新
查询
语法:
UPDATE 表名
SET 新值
WHERE 准则
例:英国客户的定货量增加5%,货运量增加3%
UPDATE OEDERS
SET OrderAmount = OrderAmount *1.1
Freight = Freight*1.03
WHERE ShipCountry = ‘UK’
2 删除
查询
DELETE子句可以使用户删除大量的过时的或冗于的数据.
注:删除
查询
的对象是整个记录.
DELETE子句的语法:
DELETE [表名.*]
FROM 来源表
WHERE 准则
例: 要删除所有94年前的定单
DELETE *
FROM Orders
WHERE OrderData<#94-1-1#
3 追加
查询
INSERT子句可以将一个或一组记录追加到一个或多个表的尾部.
INTO 子句
指定
接受新记录的表
valueS 关键字
指定
新记录所
包含
的数据值.
INSERT 子句的语法:
INSETR INTO 目的表或
查询
(
字段
1,
字段
2,…)
valueS(数值1,数值2,…)
例:增加一个客户
INSERT INTO Employees(FirstName,LastName,title)
valueS(‘Harry’,’Washington’,’Trainee’)
4 生成表
查询
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
SELECT INTO子句用来创建生成表
查询
语法:
SELECT
字段
1,
字段
2,…
INTO 新表[IN 外部
数据库
]
FROM 来源
数据库
WHERE 准则
例:为定单制作一个存档备份
SELECT *
INTO OrdersArchive
FROM Orders
八. 联合
查询
UNION运算可以把多个
查询
的结果合并到一个结果集里显示.
UNION运算的一般语法:
[表]
查询
1 UNION [ALL]
查询
2 UNION …
例:返回巴西所有供给商和客户的名字和城市
SELECT CompanyName,City
FROM Suppliers
WHERE Country = ‘Brazil’
UNION
SELECT CompanyName,City
FROM Customers
WHERE Country = ‘Brazil’
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
UNION运算要求
查询
具有相同数目的
字段
.但是,
字段
数据类型不必相同.
每一个
查询
参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以
指定
的顺序来显示返回的数据,可以在最后一个
查询
的尾部使用OREER BY子句.
九. 交叉
查询
交叉
查询
可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
Microsoft Jet
SQL
用TRANSFROM语句创建交叉表
查询
语法:
TRANSFORM aggfunction
SELECT 语句
GROUP BY 子句
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
Aggfounction指
SQL
聚积函数,
SELECT语句选择作为标题的的
字段
,
GROUP BY 分组
Pivotfield 在
查询
结果集中创建列标题时用的
字段
或表达式,用可选的IN子句限制它的取值.
value代表创建列标题的固定值.
例:显示在1996年里每一季度每一位员工所接的定单的数目:
TRANSFORM Count(OrderID)
SELECT FirstName&’’&LastName AS FullName
FROM Employees INNER JOIN Orders
ON Employees.EmployeeID = Orders.EmployeeID
WHERE DatePart(“yyyy”,OrderDate)= ‘1996’
GROUP BY FirstName&’’&LastName
ORDER BY FirstName&’’&LastName
POVOT DatePart(“q”,OrderDate)&’季度’
十 .子
查询
子
查询
可以理解为 套
查询
.子
查询
是一个SELECT语句.
1 表达式的值与子
查询
返回的单一值做比较
表达式 comparision [ANY|ALL|SOME](子
查询
)
ANY 和SOME谓词是同义词,与比较运算符(=,,,=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子
查询
返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既WHERE子句的结果),对应于该表达式的当前记录将进入主
查询
的结果中.ALL测试则要求表达式与子
查询
返回的一系列的值的比较都产生 True结果,才回返回True值.
例:主
查询
返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
SELECT * FROM Products
WHERE UnitPrice>ANY
(SELECT UnitPrice FROM[Order Details] WHERE Discount>0.25)
2 检查表达式的值是否匹配子
查询
返回的一组值的某个值
[NOT]IN(子
查询
)
例:返回库存价值大于等于1000的产品.
SELECT ProductName FROM Products
WHERE ProductID IN
(SELECT PrdoctID FROM [Order DEtails]
WHERE UnitPrice*Quantity>= 1000)
3检测子
查询
是否返回任何记录
[NOT]EXISTS (子
查询
)
例:用EXISTS检索英国的客户
SELECT ComPanyName,ContactName
FROM Orders
WHERE EXISTS
(SELECT *
FROM Customers
WHERE Country = ‘UK’ AND
Customers.CustomerID= Orders.CustomerID)
update 表名 set
字段
名 =
字段
值 where 要判断的
字段
名 = 要判断的
字段
值;
如果你要进行判断的
字段
值为null 要写
update 表名 set
字段
名 =
字段
值 where 要判断的
字段
名 is null;
4.删除记录
delete from 表名 where 要删除的
字段
名 = 要删除的
字段
值;
2.建立连接
String url = "jdbc:
mysql
://localhost:3306/student"; //3306指你当前
数据库
的端口号,student指你
指定
的哪个
数据库
名字
String user = "root"; //root是你的用户名
String password = "esoft"; //esoft你的
数据库
密码
connection conn = DriverManager.getconnection(url,user,password);
3.创建对象 //create object
Statement ste = conn.createStatement();
4.执行语句
// 对
数据库
进行插入,更新,删除等操作时用executeUpdate()返回int型。
int i = ste.executeUpdate();
// 对
数据库
进行查看操作时用executeQuery()返回ResultSet结果集。
ResultSet res = ste.executeQuery();
5.处理结果
当是返回int型时
if(i > 0){
System.out.println("操作成功!");
当返回ResultSet型结果集时
while(res.next()){
Student stu = new Student();
stu.setSno(res.getString("Sno"));
stu.setSname(res.getString("Sname"));
stu.setId(res.getInt("id"));
stu.setSage(res.getInt("Sage"));
list.add(stu);
return list;
6.关闭连接
当是返回int型时只需关闭
ste.close();
conn.close();
当是返回ResultSet型结果集时需关闭
res.close();
ste.close();
conn.close();
Oracle
数据库
数据库
4种语言
1. DCL:数据控制语言。授权
2. DDL:数据定义语言。创建、修改
数据库
对象
3. DML:数据操纵语言。对
数据库
的增、删、改、查。
4.
数据库
事物处理语言
常用
sql
语句
1.插入
字段
insert into 表名(表里
字段
,不加括号表示插入所有
字段
) values (对应的
字段
值);
2.查看表记录
select *(或
字段
名) from 表名;
3.更新记录
update 表名 set
字段
名 =
字段
值 where 要判断的
字段
名 = 要判断的
字段
值;
如果你要进行判断的
字段
值为null 要写
update 表名 set
字段
名 =
字段
值 where 要判断的
字段
名 is null;
4.删除记录
delete from 表名 where 要删除的
字段
名 = 要删除的
字段
值;
5.连接运算符 (||)
select
字段
名||'名字' from 表名;
6.去除重复行 (distinct)
select distinct
字段
名 from 表名;
7.升序
排序
select
字段
名 from 表名 order by ;
8.降序
排序
select
字段
名 from 表名 order by desc;
9.在……和……之间 (between and)
select
字段
名 from 表名 where 要判断的
字段
名 between 数值 and 数值;
10.in (相当于or) not in(相当于and)
select
字段
名 from 表名 where
字段
名 in(数值,数值);
select
字段
名 from 表名 where
字段
名 not in(数值,数值);
11.模糊
查询
like %:0个或多个任意字符 _:1个任意字符
select
字段
名 from 表名 where 要判断的
字段
like '%字符%';
12.null的处理
select
字段
名 from 表名 where 要判断的
字段
名 is null(is not null);
13.dual表是用来计算的表 可以用来round:四舍五入,trunc:截断小数位,mod取余,ceil:求大于等于某数的最小整数。例:ceil(2.35) 3,floor:求小于等于某数的最大整数。例:floor(2.35) 2。
select round(123.123,要保留的位数) from dual;
select trunc(213.231,要保留的位数) from dual;
14.字符函数
substr:截取
字符串
Oracle当中substrate()函数的截取的索引从0或从1开始都可以。
Initcap:字符的首字母大写
Lpad:向
字符串
的左侧添加字符
Rpad:向
字符串
的右侧添加字符
Instr:是否
包含
某字符,从第几个字符开始,第几次出现的位置。
Replace:用一个
字符串
替换另一个
字符串
中的字符
15.日期函数
sysdate:当前日期
months_between(日期值1,日期值2):求出给定日期范围的月数
add_months(日期值,给定的月数):在制定日期上加上
指定
的月数,求出之后的日期
next_day(日期值,星期):
指定
日期后的星期对应的新日期
last_day(日期值):返回
指定
日期所在月份的最后一天
日期进行加减的一些规律:
日期-数字 = 日期
日期+数字 = 日期
日期-日期 = 数字(天数)
16.转换函数
(1).to_char:转换成
字符串
a. 日期转换..............................后面文档自己下载
group by可用于单个
字段
分组,也可用于多个
字段
分组
– 根据gender
字段
来分组
select gender from students group by gender;
– 根据name和gender
字段
进行分组
select name, gender from studen...
可以用case when做一个列,然后根据这个列来
排序
,下面给出代码
select *,(case id when 19 then '1' else '2' end) as 'abc' from table order by abc
转载于:https://www.cnblogs.com/zhuxiaojie/p/4724884.html...
MYSQL
常用命令
1.导出整个
数据库
mysql
dump -u 用名 -p –default-character-set=latin1
数据库
名 > 导出的文件名(
数据库
默认编码是latin1)
mysql
dump -u wcnc -p smgp_apps_wcnc > wcnc.
sql
2.导出一个表
mysql
dump -u 用户名 -p
数据库
名 表名> 导出的文件名
mysql
dump -u wcnc -p smgp_apps_wcnc users> wcnc_users.
sql
3.导出一个
数据库
结构
mysql
dump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.
sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
4.导入
数据库
A:常用source 命令
进入
mysql
数据库
控制台,
如
mysql
-u root -p
mysql
>use
数据库
然后使用source命令,后面参数为脚本文件(如这里用到的.
sql
)
mysql
>source wcnc_db.
sql
B:使用
mysql
dump命令
mysql
dump -u username -p dbname < filename.
sql
C:使用
mysql
命令
mysql
-u username -p -D dbname
2、退出
MySQL
:quit或exit
二、库操作
1、创建
数据库
命令:create database
例如:建立一个名为xhkdb的
数据库
mysql
> create database xhkdb;
2、显示所有的
数据库
命令:show databases (注意:最后有个s)
mysql
> show databases;
3、删除
数据库
命令:drop database
例如:删除名为 xhkdb的
数据库
mysql
> drop database xhkdb;
4、连接
数据库
命令:use
例如:如果xhkdb
数据库
存在,尝试存取它:
mysql
> use xhkdb;
屏幕提示:Database changed
5、查看当前使用的
数据库
mysql
> select database();
6、当前
数据库
包含
的表信息:
mysql
> show tables; (注意:最后有个s)
三、表操作,操作之前应连接某个
数据库
命令:create table ( [,.. ]);
mysql
> create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default ’′,
> degree double(16,2));
2、获取表结构
命令:desc 表名,或者show columns from 表名
mysql
>DESCRIBE MyClass
mysql
> desc MyClass;
mysql
> show columns from MyClass;
3、删除表
命令:drop table
例如:删除表名为 MyClass 的表
mysql
> drop table MyClass;
4、插入数据
命令:insert into [( [,.. ])] values ( 值 )[, ( 值n )]
例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为的名为Tom的成绩为.45, 编号为 的名为Joan 的成绩为.99,编号为 的名为Wang 的成绩为.5.
mysql
>insert into MyClass values(1,’Tom’,96.45),(2,’Joan’,82.99), (2,’Wang’, 96.59);
5、
查询
表中的数据
1)、
查询
所有行
命令:select from where
例如:查看表 MyClass 中所有数据
mysql
> select * from MyClass;
2)、
查询
前几行数据
例如:查看表 MyClass 中前行数据
mysql
> select * from MyClass order by id limit 0,2;
mysql
> select * from MyClass limit 0,2;
6、删除表中数据
命令:delete from 表名 where 表达式
例如:删除表 MyClass中编号为 的记录
mysql
> delete from MyClass where id=1;
7、修改表中数据:update 表名 set
字段
=新值,…where 条件
mysql
> update MyClass set name=’Mary’where id=1;
7、在表中增加
字段
:
命令:alter table 表名 add
字段
类型 其他;
例如:在表MyClass中添加了一个
字段
passtest,类型为int(4),默认值为
mysql
> alter table MyClass add passtest int(4) default ’′
8、更改表名:
命令:rename table 原表名 to 新表名;
例如:在表MyClass名字更改为YouClass
mysql
> rename table MyClass to YouClass;
更新
字段
内容
update 表名 set
字段
名 = 新内容
update 表名 set
字段
名 = replace(
字段
名,’旧内容’,'新内容’)
1.INT[(M)] 型:正常大小整数类型
2.DOUBLE[(M,D)] [ZEROFILL] 型:正常大小(双精密)浮点数字类型
3.DATE 日期类型:支持的范围是-01-01到-12-31。
MySQL
以YYYY-MM-DD格式来显示DATE值,但是允许你使用
字符串
或数字把值赋给DATE列
4.CHAR(M) 型:定长
字符串
类型,当存储时,总是是用空格填满右边到
指定
的长度
5.BLOB TEXT类型,最大长度为(2^16-1)个字符。
6.VARCHAR型:变长
字符串
类型
5.导入
数据库
表
()创建.
sql
文件
()先产生一个库如auction.c:
mysql
bin>
mysql
admin -u root -p creat auction,会提示输入密码,然后成功创建。
()导入auction.
sql
文件
c:
mysql
bin>
mysql
-u root -p auction grant select,insert,delete,create,drop
on *.* (或test.*/user.*/..)
to 用户名@localhost
identified by ‘密码’;
如:新建一个用户帐号以便可以访问
数据库
,需要进行如下操作:
mysql
> grant usage
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected (0.15 sec)
此后就创建了一个新用户叫:testuser,这个用户只能从localhost连接到
数据库
并可以连接到test
数据库
。下一步,我们必须
指定
testuser这个用户可以执行哪些操作:
mysql
> GRANT select, insert, delete,update
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected (0.00 sec)
此操作使testuser能够在每一个test
数据库
中的表执行SELECT,INSERT和DELETE以及UPDATE
查询
操作。现在我们结束操作并退出
MySQL
客户程序:
mysql
> exit
Bye9!
1:使用SHOW语句找出在服务器上当前存在什么
数据库
:
mysql
> SHOW DATABASES;
2:2、创建一个
数据库
MYSQL
DATA
mysql
> Create DATABASE
MYSQL
DATA;
3:选择你所创建的
数据库
mysql
> USE
MYSQL
DATA; (按回车键出现Database changed 时说明操作成功!)
4:查看现在的
数据库
中存在什么表
mysql
> SHOW TABLES;
5:创建一个
数据库
表
mysql
> Create TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
6:显示表的结构:
mysql
> DESCRIBE MYTABLE;
7:往表中加入记录
mysql
> insert into MYTABLE values (“hyq”,”M”);
8:用文本方式将数据装入
数据库
表中(例如D:/
mysql
.txt)
mysql
> LOAD DATA LOCAL INFILE “D:/
mysql
.txt”INTO TABLE MYTABLE;
9:导入.
sql
文件命令(例如D:/
mysql
.
sql
)
mysql
>use database;
mysql
>source d:/
mysql
.
sql
;
10:删除表
mysql
>drop TABLE MYTABLE;
11:清空表
mysql
>delete from MYTABLE;
12:更新表中数据
mysql
>update MYTABLE set sex=”f”where name=’hyq’;
以下是无意中在网络看到的使用
MySql
的管理心得,
在windows中
MySql
以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start
mysql
命令启动。而Linux中启动时可用“/etc/rc.d/init.d/
mysql
d start”命令,注意启动者应具有管理员权限。
刚安装好的
MySql
包含
一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、root帐户设置密码,可用如下命令进行:
use
mysql
;
delete from User where User=”";
update User set Password=PASSWORD(‘newpassword’) where User=’root’;
如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host
字段
,在进行了以上更改后应重新启动
数据库
服务,此时登录时可用如下类似命令:
mysql
-uroot -p;
mysql
-uroot -pnewpassword;
mysql
mydb -uroot -p;
mysql
mydb -uroot -pnewpassword;
上面命令参数是常用参数的一部分,详细情况可参考文档。此处的mydb是要登录的
数据库
的名称。
在进行开发和实际应用中,用户不应该只用root用户进行连接
数据库
,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的
数据库
权限。如一个只进行数据插入的用户不应赋予其删除数据的权限。
MySql
的用户管理是通过User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下:
grant all on mydb.* to NewUserName@HostName identified by “password”;
grant usage on *.* to NewUserName@HostName identified by “password”;
grant select,insert,update on mydb.* to NewUserName@HostName identified by “password”;
grant update,delete on mydb.TestTable to NewUserName@HostName identified by “password”;
若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的用户,Password
字段
应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码。对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应
字段
,也可以使用REVOKE操作。
下面给出本人从其它资料(www.cn-java.com)获得的对常用权限的解释:
全局管理权限:
FILE: 在
MySQL
服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭
MySQL
服务。
数据库
/数据表/数据列权限:
Alter: 修改已存在的数据表(例如增加/删除列)和索引。
Create: 建立新的
数据库
或数据表。
Delete: 删除表的记录。
Drop: 删除数据表或
数据库
。
INDEX: 建立或删除索引。
Insert: 增加表的记录。
Select: 显示/搜索表的记录。
Update: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录–其它什么也不允许做。
———————
MYSQL
常用命令
有很多朋友虽然安装好了
mysql
但却不知如何使用它。在这篇文章中我们就从连接
MYSQL
、修改密码、增加用户等方面来学习一些
MYSQL
的常用命令。
有很多朋友虽然安装好了
mysql
但却不知如何使用它。在这篇文章中我们就从连接
MYSQL
、修改密码、增加用户等方面来学习一些
MYSQL
的常用命令。
一、连接
MYSQL
格式:
mysql
-h主机地址-u用户名-p用户密码
、例:连接到本机上的
MYSQL
首先在打开DOS窗口,然后进入目录
mysql
bin,再键入命令
mysql
-uroot -p,回车后提示你输密码,如果刚安装好
MYSQL
,超级用户root是没有密码的,故直接回车即可进入到
MYSQL
中了,
MYSQL
的提示符是:
mysql
>
、例:连接到远程主机上的
MYSQL
假设远程主机的IP为:.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
mysql
-h110.110.110.110 -uroot -pabcd123
(注:u与root可以不用加空格,其它也一样)
、退出
MYSQL
命令:exit (回车)
二、修改密码
格式:
mysql
admin -u用户名-p旧密码password 新密码
、例:给root加个密码ab12。首先在DOS下进入目录
mysql
bin,然后键入以下命令
mysql
admin -uroot -password ab12
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
、例:再将root的密码改为djg345
mysql
admin -uroot -pab12 password djg345
MYSQL
常用命令(下)
一、操作技巧
、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。
、你可以使用光标上下键调出以前的命令。但以前我用过的一个
MYSQL
旧版本不支持。我现在用的是
mysql
-3.23.27-beta-win。
二、显示命令
、显示
数据库
列表。
show databases;
刚开始时才两个
数据库
:
mysql
和test。
mysql
库很重要它里面有
MYSQL
的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
、显示库中的数据表:
use
mysql
;//打开库,学过FOXBASE的一定不会陌生吧
show tables;
、显示数据表的结构:
describe 表名;
create database 库名;
use 库名;
create table 表名(
字段
设定列表);
、删库和删表:
drop database 库名;
drop table 表名;
、将表中记录清空:
delete from 表名;
、显示表中的记录:
select * from 表名;
三、一个建库和建表以及插入数据的实例
drop database if exists school; //如果存在SCHOOL则删除
create database school; //建立库SCHOOL
use school; //打开库SCHOOL
create table teacher //建立表TEACHER
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default ‘深圳’,
year date
); //建表结束
//以下为插入
字段
insert into teacher values(”,’glchengang’,'深圳一中’,’-10-10′);
insert into teacher values(”,’jack’,'深圳一中’,’-12-23′);
注:在建表中()将ID设为长度为的数字
字段
:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主
字段
primary key
()将NAME设为长度为的字符
字段
()将ADDRESS设为长度的字符
字段
,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。
()将YEAR设为日期
字段
。
如果你在
mysql
提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.
sql
,然后复制到c:\下,并在DOS状态进入目录\
mysql
\bin,然后键入以下命令:
mysql
-uroot -p密码school.bbb
注释:将
数据库
school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
一.SELECT语句的完整语法为:
SELECT[ALL|DISTINCT|DISTINCTROW|TOP]
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
FROM tableexpression[,…][IN externaldatabase]
[WHERE…]
[GROUP BY…]
[HAVING…]
[ORDER BY…]
[WITH OWNERACCESS OPTION]
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
1 FROM子句
FROM 子句
指定
了SELECT语句中
字段
的来源。FROM子句后面是
包含
一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的
查询
或由INNER JOIN、LEFT JOIN 或RIGHT JOIN 得到的复合结果。如果表或
查询
存储在外部
数据库
,在IN 子句之后指明其完整路径。
例:下列
SQL
语句返回所有有定单的客户:
SELECT OrderID,Customer.customerID
FROM Orders Customers
WHERE Orders.CustomerID=Customers.CustomeersID
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
(1) ALL 返回满足
SQL
语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
例:SELECT ALL FirstName,LastName
FROM Employees
(2) DISTINCT 如果有多个记录的选择
字段
的数据相同,只返回一个。
(3) DISTINCTROW 如果有重复的记录,只返回一个
(4) TOP显示
查询
头尾若干记录。也可返回记录的百分比,这是要用TOP N PERCENT子句(其中N 表示百分比)
例:返回%定货额最大的定单
SELECT TOP 5 PERCENT*
FROM [ Order Details]
ORDER BY UnitPrice*Quantity*(1-Discount) DESC
3 用AS 子句为
字段
取别名
如果想为返回的列取一个新的标题,或者,经过对
字段
的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
例:返回FirstName
字段
取别名为NickName
SELECT FirstName AS NickName ,LastName ,City
FROM Employees
例:返回新的一列显示库存价值
SELECT ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
FROM Products
二.WHERE 子句
指定
查询
条件
1 比较运算符
比较运算符含义
= 大于等于
<= 小于等于
!> 不大于
!#1/1/96# AND OrderDate#96-1-1#
也可以表示为:
WHERE OrderDate>Datevalue(‘/1/96’)
使用NOT 表达式求反。
例:查看年月日以后的定单
WHERE Not OrderDateQuantity
另一种方法是用Microsof JET
SQL
独有的JNNER JOIN
FROM table1 INNER JOIN table2
ON table1.field1 comparision table2.field2
其中comparision 就是
前面
WHERE子句用到的比较运算符。
SELECT FirstName,lastName,OrderID,CustomerID,OrderDate
FROM Employees
INNER JOIN Orders ON Employees.EmployeeID=Orders.EmployeeID
INNER JOIN不能连接Memo OLE Object Single Double 数据类型
字段
。
在一个JOIN语句中连接多个ON子句
SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2 OR
ON table1.field3 compopr table2.field3
SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOER] [( ]tablex[INNER JOIN]
ON table1.field1 compopr table2.field1
ON table1.field2 compopr table2.field2
ON table1.field3 compopr table2.field3
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
FROM table [LEFT|RIGHT]JOIN table2
ON table1.field1comparision table.field2
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
例:不管有没有定货量,返回所有商品
SELECT ProductName ,OrderID
FROM Products
LEFT JOIN Orders ON Products.PrductsID=Orders.ProductID
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的
字段
是否有空值。
SELECT *
FROM talbe1
LEFT JOIN table2 ON table1.a=table2.c
1 连接
查询
中使用Iif函数实现以值显示空值
Iif表达式:Iif(IsNull(Amount,0,Amout)
例:无论定货大于或小于¥,都要返回一个标志。
Iif([Amount]>50,?Big order?,?Small order?)
五. 分组和总结
查询
结果
在
SQL
的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个
字段
来分组,而将记录分组后,用HAVING子句过滤这些记录。
GROUP BY 子句的语法
SELECT fidldlist
FROM table
WHERE criteria
[GROUP BY groupfieldlist [HAVING groupcriteria]]
注:Microsoft Jet
数据库
Jet 不能对备注或OLE对象
字段
分组。
GROUP BY
字段
中的Null值以备分组但是不能被省略。
在任何
SQL
合计函数中不计算Null值。
GROUP BY子句后最多可以带有十个
字段
,
排序
优先级按从左到右的顺序排列。
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于人的所有头衔。
SELECT Title ,Count(Title) as Total
FROM Employees
WHERE Region = ‘WA’
GROUP BY Title
HAVING Count(Title)>1
JET
SQL
中的聚积函数
聚集函数意义
SUM ( ) 求和
AVG ( ) 平均值
COUNT ( ) 表达式中记录的数目
COUNT (* ) 计算记录的数目
MAX 最大值
MIN 最小值
VAR 方差
STDEV 标准误差
FIRST 第一个值
LAST 最后一个值
六. 用Parameters声明创建参数
查询
Parameters声明的语法:
PARAMETERS name datatype[,name datatype[, …]]
其中name 是参数的标志符,可以通过标志符引用参数.
Datatype说明参数的数据类型.
使用时要把PARAMETERS 声明置于任何其他语句之前.
PARAMETERS[Low price] Currency,[Beginning date]datatime
SELECT OrderID ,OrderAmount
FROM Orders
WHERE OrderAMount>[low price]
AND OrderDate>=[Beginning date]
七. 功能
查询
所谓功能
查询
,实际上是一种操作
查询
,它可以对
数据库
进行快速高效的操作.它以选择
查询
为目的,挑选出符合条件的数据,再对数据进行批处理.功能
查询
包括更新
查询
,删除
查询
,添加
查询
,和生成表
查询
.
1 更新
查询
UPDATE子句可以同时更改一个或多个表中的数据.它也可以同时更改多个
字段
的值.
更新
查询
语法:
UPDATE 表名
SET 新值
WHERE 准则
例:英国客户的定货量增加%,货运量增加%
UPDATE OEDERS
SET OrderAmount = OrderAmount *1.1
Freight = Freight*1.03
WHERE ShipCountry = ‘UK’
2 删除
查询
DELETE子句可以使用户删除大量的过时的或冗于的数据.
注:删除
查询
的对象是整个记录.
DELETE子句的语法:
DELETE [表名.*]
FROM 来源表
WHERE 准则
例: 要删除所有年前的定单
DELETE *
FROM Orders
WHERE OrderData<#94-1-1#
3 追加
查询
INSERT子句可以将一个或一组记录追加到一个或多个表的尾部.
INTO 子句
指定
接受新记录的表
valueS 关键字
指定
新记录所
包含
的数据值.
INSERT 子句的语法:
INSETR INTO 目的表或
查询
(
字段
,
字段
,…)
valueS(数值,数值,…)
例:增加一个客户
INSERT INTO Employees(FirstName,LastName,title)
valueS(‘Harry’,’Washington’,’Trainee’)
4 生成表
查询
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
SELECT INTO子句用来创建生成表
查询
语法:
SELECT
字段
,
字段
,…
INTO 新表[IN 外部
数据库
]
FROM 来源
数据库
WHERE 准则
例:为定单制作一个存档备份
SELECT *
INTO OrdersArchive
FROM Orders
八. 联合
查询
UNION运算可以把多个
查询
的结果合并到一个结果集里显示.
UNION运算的一般语法:
[表]
查询
UNION [ALL]
查询
UNION …
例:返回巴西所有供给商和客户的名字和城市
SELECT CompanyName,City
FROM Suppliers
WHERE Country = ‘Brazil’
UNION
SELECT CompanyName,City
FROM Customers
WHERE Country = ‘Brazil’
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
UNION运算要求
查询
具有相同数目的
字段
.但是,
字段
数据类型不必相同.
每一个
查询
参数中可以使用GROUP BY 子句或HAVING 子句进行分组.要想以
指定
的顺序来显示返回的数据,可以在最后一个
查询
的尾部使用OREER BY子句.
九. 交叉
查询
交叉
查询
可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
Microsoft Jet
SQL
用TRANSFROM语句创建交叉表
查询
语法:
TRANSFORM aggfunction
SELECT 语句
GROUP BY 子句
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
Aggfounction指
SQL
聚积函数,
SELECT语句选择作为标题的的
字段
,
GROUP BY 分组
Pivotfield 在
查询
结果集中创建列标题时用的
字段
或表达式,用可选的IN子句限制它的取值.
value代表创建列标题的固定值.
例:显示在年里每一季度每一位员工所接的定单的数目:
TRANSFORM Count(OrderID)
SELECT FirstName&’’&LastName; AS FullName
FROM Employees INNER JOIN Orders
ON Employees.EmployeeID = Orders.EmployeeID
WHERE DatePart(“yyyy”,OrderDate)= ‘’
GROUP BY FirstName&’’&LastName;
ORDER BY FirstName&’’&LastName;
POVOT DatePart(“q”,OrderDate)&’季度’
十.子
查询
子
查询
可以理解为套
查询
.子
查询
是一个SELECT语句.
1 表达式的值与子
查询
返回的单一值做比较
表达式comparision [ANY|ALL|SOME](子
查询
)
ANY 和SOME谓词是同义词,与比较运算符(=,,,=)一起使用.返回一个布尔值True或False.ANY的意思是,表达式与子
查询
返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回True值(既WHERE子句的结果),对应于该表达式的当前记录将进入主
查询
的结果中.ALL测试则要求表达式与子
查询
返回的一系列的值的比较都产生True结果,才回返回True值.
例:主
查询
返回单价比任何一个折扣大于等于%的产品的单价要高的所有产品
SELECT * FROM Products
WHERE UnitPrice>ANY
(SELECT UnitPrice FROM[Order Details] WHERE Discount>0.25)
2 检查表达式的值是否匹配子
查询
返回的一组值的某个值
[NOT]IN(子
查询
)
例:返回库存价值大于等于的产品.
SELECT ProductName FROM Products
WHERE ProductID IN
(SELECT PrdoctID FROM [Order DEtails]
WHERE UnitPrice*Quantity>= 1000)
3检测子
查询
是否返回任何记录
[NOT]EXISTS (子
查询
)
例:用EXISTS检索英国的客户
SELECT ComPanyName,ContactName
FROM Orders
WHERE EXISTS
(SELECT *
FROM Customers
WHERE Country = ‘UK’AND
Customers.CustomerID= Orders.CustomerID)
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`id` int(10) NOT.
如果你想要根据某个字符的最后一个出现位置来截取
字符串
字段
,你可以使用
MySQL
的SUBSTRING函数和INSTR函数组合。INSTR函数返回
指定
字符在
字符串
中第一次出现的位置,因此你可以使用它来找到要截取的字符的最后一个出现位置。然后,你可以将该位置作为SUBSTRING函数的第二个参数来截取
字符串
字段
。例如,如果你想要从一个名为"orders"的表中截取"address"
字段
中的邮政编码部分,可以使用以下
SQL
语句:
SELECT SUBSTRING(address, INSTR(address, ' ') + 1) FROM orders;
这将返回"address"
字段
中第一个空格之后的所有字符,即邮政编码部分。你可以根据需要调整要截取的字符和位置参数来截取不同的
字符串
。注意,如果要截取的字符在
字符串
中不存在,INSTR函数会返回0,此时SUBSTRING函数将返回整个
字符串
字段
。
JAVA 最常用实用的正则表达式校验
小目标青年:
JAVA 最常用实用的正则表达式校验
小目标青年:
Springboot 玩一玩代码混淆,防止反编译代码泄露
花田深似海:
Springboot 玩一玩代码混淆,防止反编译代码泄露
花田深似海:
Command line is too long. Shorten command line for XXXX.testXXX or also for JUnit defau......
Mybatis 新增/批量新增, 拿到返回的自增主键ID