数据库中常用的复杂查询,希望对你有所帮助

在数据库操作中,sql语句结束时一定要带上 ; 号 否则不会执行。

1.一般特性

1.查看当前用户——show user;
2.查看当前用户有哪些表——select table_name from user_tables;
3.查看emp表的结构——desc emp;
4.列出emp表的所有列——select * from emp;
5.查看指定列——select ename from emp;

特性:
1.数字左对齐,字母右对齐
2.支持运算符——select sal+100 from emp;
3.运算符具有优先级;
4.列别名,使用单引号可以保持数据原样
5.连接运算符|| ——
select ename||sal from emp;
6.去除重复的行——DISTANCE关键字——select DISTANCE job from emp;

2.简单查询

基本语法规则:
SELECT 需要查找的字段 FROM 表名 WHERE 条件 ;
例如:
查找每个雇员的编号——select empno from emp;
查找每个雇员的职位——select job from emp;

注意:
查询出来的job内容有重复数据,使用distance删除

简单查询可以使用四则运算

查询每个雇员的姓名,职位和基本年薪:
select ename,job,sal12 from emp;
有时候列的名称不方便浏览,可以用列别名来表示:
select ename,job,sal
12 as yearsal from emp;

限定查找

SELECT 查找字段[字段别名] FROM 表名 [表别名] WHERE 条件;
其中条件包含有:
’ > , < , >= , < = , ! = , <> , BETWEEN…AND… , LIKE , IN , IS NULL , AND , OR , NOT’
查询出所有职位是办事员的雇员信息:
select * from emp where ename=‘CLERK’;

注意:
在Oracle数据库中,数据区分大小写

查询职位是办事员,或者是销售员,且他们的工资大于2000:
select * from emp where (job=‘CLERK’ or job=‘SALEMAN’) and sal>2000;
查询基本工资在1500-3000之间的雇员的姓名:
select ename from emp where sal between 1500 and 3000;

在这里介绍一下模糊查找 LIKE:

LIKE子句:
_ :匹配单个字符
%:匹配任意字符
例如:
1.查询雇员姓名中是以字母A开头的信息:
select * from emp where ename LIKE ‘A%’;
2.查询雇员姓名的第二个字符是A的信息:
select * from emp where ename LIKE ‘_A%’;
3.查询雇员姓名中包含A的信息:
select * from emp where ename LIKE ‘%A%’;

这里介绍一下数据排序

数据排序其实很简单,无非就是 :
SELECT 字段 FROM 表名 WHERE 条件 ORDER BY 需要排序的字段 DESC(ASC);
这里DESC 表示降序,ASC表示升序;

例如:
查找所有雇员信息,按照工资降序排列,工资相同按照雇佣日期从早到晚排列:
select * from emp order by sl desc,hiredate asc;

字符函数:主要对字符串数据进行操作

UPPER(字符串|列) 将输入的字符串变为大写
LOWER(字符串|列)将输入的字符串变为小写
INITCAP(字符串|列) 将字符串首字母大写
LENGTH(字符串|列) 将字符串长度返回
REPLACE(字符串|列) 替换字符串
SUBSTR(字符串|列) 截取字符串
oracle提供了一个虚拟表 dual;

1.将所有雇员的姓名以小写返回,并计算每个姓名的长度:
select lower(ename),length(ename) from emp;
2.使用字符‘-’替换雇员姓名的所有字母A:
select replace(ename,‘A’,’-’) from emp;

字符串截取有两种语法:

1.SUBSTR(字符串,开始点),表示从开始点一直截取到结尾;
2.SUBSTR(字符串,开始点,截取多少位),表示从开始点截取多少位;
例如:要求截取雇员姓名的后三个字母:
select substr(ename,length(ename)-2) from emp;

数字函数

ROUND(数字,保留小数的范围)——四舍五入的操作
TRUNC(数字,保留小数的范围)——舍弃指定位置的内容
MOD(数字1,数字2)——取模,取余数;

日期函数

取得系统当前的年月日可以用SYSDATE;
在这里插入图片描述日期除了上述的三个公式外,还有以下几个操作:
1.LAST_DAY(日期):求出指定日期当月的最后一天
求出本月的最后一天——select LAST_DAY(sysdate) from dual;
2.NEXT_DAY(日期):求出下一个指定星期几的日期
下一个周日是几号——select NEXT_DAY(sysdate,‘sun’) from dual;
3.ADD_MONTHS(日期,数字):求出若干月之后的日期
四个月之后是几号——select ADD_MONTHS(sysdate,4) from dual;
4.MONTHS_BETWEEN(日期1,日期2):求出两个日期之间所经历的月份
求出每个雇员到今天为止的雇佣月份——select MONTHS_BETWEEN(sysdate,hiredate) from emp;

转换函数TO_CHAR

转换函数主要是完成几种数据之间的转换:
TO_CHAR(字符串,格式字符串):将日期或数字转换为字符产形式
TO_DATE(字符串,格式字符串):将字符串转换为DATE数据显示
TO_NUMBER(字符串):将字符串转换为数字形式

TO_CHAR()函数的格式:
年(yyyy):月(mm):日(dd);
例如:将时间按照年-月-日格式显示:
select TO_CHAR(sysdate,‘yyyy-mm-dd’) stime from dual;
使用24小时制:
select TO_CHAR(sysdate,‘yyyy-mm-dd hh24:mi:ss’) time from dual;

通用函数

主要有NVL(),DECODE()两个
NVL():处理数据位是空的情况
DECODE():多数值判断,类似于if-else,但仅仅只判断数字;

3.多表查询

基本语法:
SELECT 字段1[别名1],字段2[别名2] FROM 表名1[别名1],表名2[别名2] WHERE 条件;
在多表查询之前,首先必须查找各个表中的数据量,用COUNT()函数;
确认数据量之后,执行多表查询语句,但是由于数据库的机制问题,会产生笛卡尔积,所以如何去掉笛卡儿积?

去除笛卡儿积

采用关键字段关联的形式,emp表和dept表之间存在了deptno的关联字段,从关联字段下手:
select * from emp,dept where emp.deptno=dept.deptno;
如果表名比较长,可以使用表别名:
select * from emp e,dept d where e.deptno=d.deptno;
在这里插入图片描述在这里插入图片描述

左右连接

左右连接可以改变判断条件的参考方向,例如:
select * from emp e,dept d where e.deptno=d.deptno;

注意:
一共有四个部门,但这里只显示了三个,缺少40部门的信息,所以必须改变参考方向,这时就需要左右连接
select * from emp e,dept d where e.deptno(+)=d.deptno;

用于左右连接的更改有两种使用情况:
(+)= : 表示右连接
=(+) : 表示左连接

自然连接:
不用区分关联条件,oracle自己区分;例如:
查询公子大于2000的员工编号,员工姓名和部门名称:
select e.empno,e.ename,d.dname from emp e natural join dept d where e.sal>2000;

统计函数

COUNT():查询表中的数据记录
AVG():求平均值
SUM():求和
MAX():求最大值
MIN():求最小值
统计出公司所有雇员每个月支付的平均工资和总工资;
select count(empno),avg(sal),sum(sal) from emp ;
注意:
COUNT()函数的主要功能是进行数据的统计,如果该表中没有统计的数据,那么COUNT()也会返回数据0/null;

分组统计

当数据库中某一列的信息存在重复,可以按照性质对其进行分组统计;
GROUP BY()子句:
SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 分组字段 ;
按照部门编号分组,求出每个部门的人数和平均工资:
select d.depno,count(e.empno),avg(e.sal)
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno;

注意:
1.分组函数可以在没有分组的时候单独使用,可是不能出现其他查询字段
在这里插入图片描述
2.如果要进行分组,则select子句之后,只能出现分组的字段和统计函数
在这里插入图片描述
3.分组函数允许嵌套,但是嵌套之后的查询不能右其他字段
在这里插入图片描述

多字段分组

要求显示每个部门的编号,名称,位置,部门的人数和平均工资:
select d.deptno,d.dname,d.loc,count(e.empno),trunc(nvl(avg(e.sal),0)) from emp e,dept d
where e.deptno=(+)d.deptno
group by d.deptno,d.dname,d.loc;

如果要对分组后的数据再次进行筛选,可以使用HAVING子句。
SELECT 字段名,统计函数 FROM 表名 WHERE 条件 GROUP BY 字段 HAVING 筛选条件;
注意:HAVING在GROUP BY 分组之后再次过滤,可以使用统计函数;

子查询(重点)

子查询=简单查寻+限定查询+多表查询+统计查询的综合体;
SELECT 字段,统计函数
FROM 表名,(SELECT 字段,统计函数 FROM 表名 WHERE 条件 GROUP BY 分组)别名
WHERE 条件
GROUP BY 分组名
HAVING 再次过滤

WHERE:子查询一般返回单行多列,多行多列,单行单列的数据
FROM:子查询返回的一般是多行多列的数据,当成一个临时表

1.查询工资比SMITH还高的全部信息
select * from emp
where sal>(
select sal from emp where ename=‘SMITH’);

如果子查询返回的是单行多列的数据,这时需要用到三种判断符:

1.IN操作符:用于指定一个子查询的范围
2.ANY操作符,与每个内容相匹配,有三种形式:
1)=ANY:功能和IN一样,在范围内查询匹配
2)>ANY:比子查询中返回记录最小的还要大
3)<ANY:比子查询中返回记录最大的还要小
3.ALL操作符:与每个内容相匹配,有两种形式:
1)>ALL:比子查询中最大的还要大
2)<ALL:比子查询中最小的还要小
例如:
select * from emp
where sal<all(
select sal from emp where job=‘SALEMEN’);

以上所有的都是where中的单行单列/单行多列,那么下面就是FROM中多行多列:
1.查询出每个部门的编号,名称,位置和部门人数,平均工资:
select d.deptno,d.dname,d.loc,nvl(res.count,0),nvl(res.avg,0) from dept d,(
select deptno dno,count(empno)count,avg(sal)avg from emp group by deptno)res
where d.deptno=res.dno(+);
2.列出所有工作的最低工资及从事此工资的雇员姓名:
select e.ename,e.job,e.sal from emp e,(
select job,min(sal)min from emp group by job)temp
where e.sal=temp.sal and e.job=temp.job;
3.列出各部门的MANAGER的最低薪资、姓名、部门名称、部门人数:
select e.ename,e.sal,d.dname,res.count from emp e,dept d,(
select deptno dep,min(sal)min from emp where job=‘MANAGER’ group by deptno)temp,(
select deptno dno,count(empno)count from emp group by deptno)res
where d.deptno=e.deptno
and e.sal=temp.min
and e.deptno=temp.dep
and e.deptno=res.dno;

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷序列号码为 00000030 4489:1826 C:. │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整tempdb数据库的文件属性.sql │ ├─第02章 │ │ 2.1 日期概念理解的一些测试.sql │ │ 2.2.4 CONVERT在日期转换的使用示例.sql │ │ 2.3.3 SET DATEFORMAT对日期处理的影响.sql │ │ 2.3.4 SET LANGUAGE对日期处理的影响示例.sql │ │ 2.4.1 日期格式化处理.sql │ │ 2.4.2 日期推算处理.sql │ │ 2.4.3 特殊日期加减函数.sql │ │ 2.5.1 查询指定日期段内过生日的人员.sql │ │ 2.5.2 生成日期列表的函数.sql │ │ 2.5.3 工作日处理函数(标准节假日).sql │ │ 2.5.3 工作日处理函数(自定义节假日).sql │ │ 2.5.4 计算工作时间的函数.sql │ │ │ └─其他 │ 交叉表.sql │ 任意两个时间之间的星期几的次数-横.sql │ 任意两个时间之间的星期几的次数-纵.sql │ 复杂年月处理.sql │ 统计--交叉表+日期+优先.sql │ ├─第03章 │ │ 3.2 各种字符串分拆处理函数.sql │ │ 3.3 各种字符串合并处理示例.sql │ │ 3.4.1 分段截取函数.sql │ │ 3.4.2 分段更新函数.sql │ │ 3.4.3 IP地址处理函数.sql │ │ 3.5.1 字符串比较函数.sql │ │ 3.5.2 字符串并集&交集处理示例.sql │ │ 3.5.3 字符串分拆并统计的处理示例.sql │ │ 3.5.5 字符串处理示例--列车车次查询.sql │ │ 3.6.2 字符串在编号查询的应用示例及常见问题.sql │ │ 3.6.3 动态参数的存储过程示例.sql │ │ 3.6.4 动态他Transact-SQL语句处理的常见问题演示.sql │ │ 3.7.3 text与ntext字段的复制和合并处理示例.sql │ │ 3.7.4 text与image字段转换处理示例.sql │ │ 3.7.5 ntext字段的REPLACE处理示例.sql │ │ │ └─其他 │ varbinary转换成字符串.sql │ 关键字搜索.sql │ 分解公式.sql │ 字符串分拆--格式化.sql │ 得到一个字符串在另一个字符串出现的次数.sql │ 数字转换成十六进制.sql │ 比较第一与第二个字符串,是否有连续的5个字符相同.sql │ 生成查询的模糊匹配字符串.sql │ 简繁转换.sql │ 统计一个表某个字符出现最多的字母.sql │ 非法字符串处理.sql │ ├─第04章 │ │ 4.1.5 在各种处理应用排序规则的示例.sql │ │ 4.2.1 排序规则在拼音处理的应用.sql │ │ 4.2.2 排序规则在全角与半角处理的应用.sql │ │ │ └─其他 │ 生成GB2312汉字表.sql │ 生成GBK汉字表.sql │ 自动获取汉字笔画.sql │ ├─第05章 │ │ 5.1.1 SET IDENTITY_INSERT 的几个问题.sql │ │ 5.1.1 修改标识值的示例.sql │ │ 5.1.1 标识列与普通列互相转换的示例.sql │ │ 5.2.1 查表法按日期生成流水号的示例.sql │ │ 5.2.1 查表法生成流水号的示例.sql │ │ 5.2.2 使用编号表按日期生成流水号的示例.sql │ │ 5.2.2 使用编号表生成流水号的示例.sql │ │ 5.2.3 生成纯字母随机编号的示例(仅大小或者小写).sql │ │ 5.2.3 生成纯字母随机编号的示例(大小写混合).sql │ │ 5.2.3 生成纯数字随机编号的示例.sql │ │ 5.3.2 融合了补号处理的编号生成处理示例.sql │ │ 5.3.3 使用UPDATE进行编号重排的处理示例.sql │ │ 5.3.3 使用临时表进行编号重排的处理示例.sql │ │ 5.3.3 使用子查询进行编号重排的处理示例.sql │ │ 5.3.3 名次查询的处理示例.sql │ │ 5.4.1 查询已用编号分布情况的示例(临时表法).sql │ │ 5.4.1 查询已用编号分布情况的示例(子查询法).sql │ │ 5.4.2 查询缺号分布情况的示例.sql │ │ 5.4.3 返回已用编号、缺号分布字符串的处理示例.sql │ │ 5.4.4 缺勤天数统计的处理示例.sql │ │ │ └─其他 │ -补位法.sql │ 以另一个表的字段做默认值.sql │ 以另一表的字段生成编号.sql │ 关联部门流水号.sql │ 十六进制.sql │ 学号.sql │ 开票统计--涉及到连号处理.sql │ 新编号查询示例(分类查询).sql │ 新编号查询示例.sql │ 日期流水号.sql │ 材料流水号.sql │ 流水号.sql │ 箱编号连号处理.sql │ 类别自动生成编号示例.sql │ 自已做标识列的例子.sql │ 触发器自动维护已用&未用编号.sql │ 连续编号.sql │ 防止重复的示例.sql │ 项目编号=各项目独立流水号&各年不同.sql │ ├─第06章 │ │ 6.1.1 NULL对IN的查询的影响及解决示例.sql │ │ 6.1.2 各种联接的使用示例.sql │ │ 6.1.2 多表联结导致记录重复的示例.sql │ │ 6.1.3 使用UNION实现库存报表的示例.sql │ │ 6.1.5 按指定上下限区间进行数据统计的示例.sql │ │ 6.1.6 随机出题的示例.sql │ │ 6.2.1 ROLLUP实现的分级汇总示例(定义各汇总列标题).sql │ │ 6.2.1 ROLLUP实现的分级汇总示例(带排序及汇总列标题处理).sql │ │ 6.2.1 ROLLUP实现的分级汇总示例(带排序处理).sql │ │ 6.2.1 ROLLUP实现的分级汇总示例.sql │ │ 6.2.1 UNION ALL实现的分级汇总示例.sql │ │ 6.3.1 简单的交叉报表处理示例.sql │ │ 6.3.2 多列转换为行的交叉报表处理示例.sql │ │ 6.3.3 行值动态变化的交叉报表处理示例(转换多列).sql │ │ 6.3.3 行值动态变化的交叉报表处理示例.sql │ │ 6.3.4 化解字符串不能超过8000的方法.sql │ │ 6.3.5 特殊的交叉报表处理示例.sql │ │ 6.4.1 库存明细帐处理示例(包含结存数).sql │ │ 6.4.1 库存明细帐处理示例.sql │ │ 6.4.2 同期及上期数据对比处理示例.sql │ │ 6.4.3 动态分组处理示例.sql │ │ 6.4.4 排行榜处理示例.sql │ │ │ └─其他 │ 交叉表--复杂名次.sql │ 交叉表-优先级处理.sql │ 交叉表分析.sql │ 分级汇总.sql │ 分组交叉表.sql │ 列转行.sql │ 固定行列报表.sql │ 复杂交叉表.sql │ 复杂交叉表1.sql │ 多栏显示.sql │ 日期+星期+时间.sql │ 格式化报表.sql │ 横转竖-1.sql │ 横转竖-字段名.sql │ 横转竖-生成字段名.sql │ 横转竖.sql │ 行列互换的复杂交叉表.sql │ 限制列数的交叉表.sql │ ├─第07章 │ │ 7.1 splitpage.asp │ │ 7.2.1 TOP n 实现的通用分页存储过程.sql │ │ 7.2.2 字符串缓存实现的通用分页存储过程.sql │ │ 7.2.3 临时表缓存实现的通用分页存储过程.sql │ │ 7.2.4 使用系统存储过程实现的通用分页存储过程.sql │ │ 7.3.1 实现随机分页的通用分页存储过程.sql │ │ 7.3.2 根据分类表实现的分页存储过程.sql │ │ │ └─其他 │ sp_cursor.sql │ 基本方法.sql │ ├─第08章 │ │ 8.1.2 树形数据分级汇总示例.sql │ │ 8.1.3 树形数据编号重排的通用存储过程.sql │ │ 8.1.3 树形数据编号重排示例.sql │ │ 8.1.4 实现编码规则调整处理的通用存储过程.sql │ │ 8.1.4 生成编码规则调整处理T-SQL语句的函数.sql │ │ 8.1.5 删除节点处理的通用存储过程.sql │ │ 8.1.5 移动节点处理的通用存储过程.sql │ │ 8.2.2 树形数据层次显示处理示例.sql │ │ 8.2.2 树形数据广度排序处理示例.sql │ │ 8.2.2 树形数据深度排序处理示例(模拟单编号法).sql │ │ 8.2.2 树形数据深度排序处理示例(递归法).sql │ │ 8.2.3 查找指定节点的所有子节点的示例函数.sql │ │ 8.2.4 查找指定节点的所有父节点的示例函数.sql │ │ 8.2.5 校验插入指定结点是否导致编码循环的示例函数.sql │ │ 8.2.5 校验表数据是否有循环编码的通用存储过程.sql │ │ 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例(借鉴方式排序法).sql │ │ 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例.sql │ │ 8.2.7 实现删除指定结点及所有子节点的处理触发器.sql │ │ 8.2.8 逐级汇总示例(循环逐级累计法).sql │ │ 8.2.8 逐级汇总示例(用户定义函数法).sql │ │ 8.3.1 产品配件清单查询示例.sql │ │ 8.3.2 最短乘车路线查询示例.sql │ │ │ └─其他 │ xml菜单.sql │ 宝塔形数据的处理-1.sql │ 宝塔形数据的处理.sql │ 树形数据生成xml.sql │ ├─第09章 │ │ 9.1.3 访问外部数据源方法总结.sql │ │ 9.5.1 二进制文件存取示例(T-SQL).sql │ │ 9.5.1 二进制文件存取示例(VB&VBA).vbs │ │ a.txt │ │ Schema.ini │ │ │ └─其他 │ bcp-数据导入导出(全).sql │ bcp-数据导入导出-二进制文件.sql │ bcp-数据导出为文件.sql │ bcp表数据存为XML.sql │ SQL Server到Oracle连接服务器的实现.sql │ SQL Server到SQLBASE连接服务器的实现.sql │ SQL Server到SYBASE连接服务器的实现.sql │ sql导出mysql.sql │ textcopy实现文件存取.sql │ Vb程序实现文件存取.sql │ 导入文本文件时如何指定字段类型.sql │ 导出northwindEmployees的图像.sql │ 将某个目录上的Excel表,导入到数据库.sql │ 数据导入导出基本方法.sql │ 用ASP上传&下载文件.sql
数据库设计规范化的五个要求 数据库逻辑设计是优化关系数据库的核心。而数据库设计的规范化则是这个核心的核 心。一个规范化的逻辑数据库,可以为数据库管理员优化数据库和应用程序性能打下坚 实的基础。相反,若逻辑数据库设计不规范,则会损害整个数据库,包括应用程序的性 能。   通常情况下,可以从两个方面来判断数据库是否设计的比较规范。一是看看是否拥 有大量的窄表,二是宽表的数量是否足够的少。若符合这两个条件,则可以说明这个数 据库的规范化水平还是比较高的。当然这是两个泛泛而谈的指标。为了达到数据库设计 规范化的要求,一般来说,需要符合以下五个要求。 要求一:表应该避免可为空的列   虽然表允许空列,但是,空字段是一种比较特殊的数据类型。数据库在处理的时 候,需要进行特殊的处理。如此的话,就会增加数据库处理记录的复杂性。当表有比 较多的空字段时,在同等条件下,数据库处理的性能会降低许多。   所以,虽然在数据库表设计的时候,允许表具有空字段,但是,我们应该尽量避 免。若确实需要的话,我们可以通过一些折的方式,来处理这些空字段,让其对数据 库性能的影响降低到最少。 一是通过设置默认值的形式,来避免空字段的产生。 二是若一张表,允许为空的列比较多,接近表全部列数的三分之一。而且,这些列 在大部分情况下,都是可有可无的。若数据库管理员遇到这种情况,建议另外建立一张 副表,以保存这些列。然后通过关键字把主表跟这张副表关联起来。将数据存储在两个 独立的表使得主表的设计更为简单,同时也能够满足存储空值信息的需要。 要求二:表不应该有重复的值或者列   如进销存管理,还需要对客户的联系人进行管理。而一个客户的联系人可能有多 个,为了解决这个问题,有多种实现方式。若设计不合理的话在,则会导致重复的值或 者列。我们可以这么设计,把客户信息、联系人都放入同一张表。为了解决多个联系 人的问题,可以设置第一联系人、第一联系人电话、第二联系人、第二联系人电话等等 。若还有第三联系人、第四联系人等等,则往往还需要加入更多的字段。   可是这么设计的话,会产生一系列的问题。如客户的采购员流动性比较大,在一年 内换了六个采购员。直接修改又不利于追踪。   所以,在数据库设计的时候要尽量避免这种重复的值或者列的产生。建议,若数据 库管理员遇到这种情况,可以改变一下策略。如把客户联系人另外设置一张表。然后通 过客户ID把供应商信息表跟客户联系人信息表连接起来。也就是说,尽量将重复的值放 置到一张独立的表进行管理。然后通过视图或者其他手段把这些独立的表联系起来。 要求三:表记录应该有一个唯一的标识符。   在数据库表设计的时候,数据库管理员应该养成一个好习惯,用一个ID号来唯一的 标识行记录,而不要通过名字、编号等字段来对纪录进行区分。每个表都应该有一个ID 列,任何两个记录都不可以共享同一个ID值。另外,这个ID值最好有数据库来进行自动 管理,而不要把这个任务给前台应用程序。否则的话,很容易产生ID值不统一的情况。  另外,在数据库设计的时候,最好还能够加入行号。ID号是用户不能够维护的。但是 ,行号用户就可以维护。这是在实际应用程序设计对ID列的一个有效补充。 要求四:数据库对象要有统一的前缀名。   一个比较复杂的应用系统,其对应的数据库表往往以千计。若让数据库管理员看到 对象名就了解这个数据库对象所起的作用,恐怕会比较困难。而且在数据库对象引用的 时候,数据库管理员也会为不能迅速找到所需要的数据库对象而头疼。   建议:在开发数据库之前,最好能够花一定的时间,去制定一个数据库对象的前缀 命名规范。最常用的是根据前台应用程序的模块来定义后台数据库对象前缀名。需要注 意的是,这个命名规范应该在数据库管理员与前台应用程序开发者之间达成共识,并且 严格按照这个命名规范来定义对象名。   其次,表、视图、函数等最好也有统一的前缀。如视图可以用V为前缀,而函数则可 以利用F为前缀。如此数据库管理员无论是在日常管理还是对象引用的时候,都能够在最 短的时间内找到自己所需要的对象。 要求五:尽量只存储单一实体类型的数据。   实体类型跟数据类型不是一回事,要注意区分。如现在有一个图书馆里系统,有图 书基本信息、作者信息两个实体对象。若用户要把这两个实体对象信息放在同一张表 也是可以的。如可以把表设计成图书名字、图书作者等等。可是如此设计的话,会给后 续的维护带来不少的麻烦。   如当后续有图书出版时,则需要为每次出版的图书增加作者信息,这无疑会增加额 外的存储空间,也会增加记录的长度。而且若作者的情况有所改变,如住址改变了以后 ,则还需要去更改每本书的记录。同时,若这个作者的图书从数据库全部删除之后, 这个作者的信息也就荡然无存了。很明显,这不符合数据库
1 性能优化 1.1 避免频繁 commit,尤其是把 commit 写在循环体每次循环都进行commit。 1.2 使用绑定变量,避免常量的直接引用。 示例:以下书写不符合本规范。 INSERT INTO sm_users (user_id, user_name, created_by, creation_date) VALUES (1, 'Tang', -1, SYSDATE); 建议用如下方式操作: DECLARE v_user_id sm_users.user_id%TYPE; v_user_name sm_users_user_name%TYPE; v_created_by sm_users.created_by%TYPE; v_creation_date sm_users.creation_date%TYPE; BEGIN ... INSERT INTO sm_users (user_id, user_name, created_by, creation_date) VALUES (v_user_id, v_user_name, v_created_by, v_creation_date); END; 1.3 Operator 的使用规范  IN  比较容易写及清晰易懂  但效能是比较低的  ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。  NOT IN  此操作是强列推荐不使用的,因为不能应用表的索引。  推荐方案:用NOT EXISTS 或(Outer-Join+判断为空)方案代替 例如: SELECT deptno FROM dept WHERE deptno NOT IN(SELECT deptno FROM emp) 建议写成: SELECT deptno FROM dept, emp WHERE dept.deptno = emp.deptno(+) AND emp.deptno IS NULL  <>  永远不会用到索引的  推荐方案:用其它相同功能的操作运算代替,如: a<>0 改为 a>0 or a<0 a<>’’ 改为 a>’’  IS NULL 或IS NOT NULL  一般是不会应用索引的,因为B-tree索引是不索引空值的。  推荐方案:用其它相同功能的操作运算代替,如: a is not null 改为 a>0 或a>’’  不允许字段为空,而用一个default代替空值,如业扩申请状态区位不允许为空, default为申请。  > 及 <  有索引就会采用索引查找  但有的情况下可以对它进行优化  如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。  LIKE  LIKE可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。性能肯定大大提高。  UNION  SQL在运行时先取出数个查询的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。  实际大部分应用是不会产生重复的记录,推荐采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。  Exists 示例:当有 A、B 两个结果集,当结果集 B 很大时,A 较小时,适用 exists,如: SELECT * FROM a WHERE EXISTS(SELECT 1 FROM b WHERE a.COLUMN = b.COLUMN); 当结果集 A 很大时,B 很小时,适用 in,如: SELECT * FROM a WHERE a.COLUMN IN(SELECT b.COLUMN FROM b) 1.4 SQL书写的影响  同一功能同一性能不同写法SQL的影响  Select * from zl_yhjbqk  Select * from dlyx.zl_yhjbqk(带表所有者的前缀)  Select * from DLYX.ZL_YHJBQK(大写表名)  Select * from DLYX.ZL_YHJBQK(间多了空格)  以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则ORACLE只会分析一次,共享内存也只会留下一次的分析结果,这不仅可以减少分析SQL的时间,而且可以减少共享内存重复的信息,ORACLE也可以准确统计SQL的执行频率。  WHERE后面的条件顺序影响  Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1  Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'  以上两个SQLdy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。  查询表顺序的影响  在FROM后面的表的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行了统计分析,ORACLE会自动先进小表的链接,再进行大表的链接)  对条件字段的一些优化  采用函数处理的字段不能利用索引,如: substr(hbs_bh,1,4)=’5400’,优化处理:hbs_bh like ‘5400%’ trunc(sk_rq)=trunc(sysdate), 优化处理: sk_rq>=trunc(sysdate) and sk_rq<trunc(sysdate+1)  进行了显式或隐式的运算的字段不能进行索引,如: ss_df+20>50,优化处理:ss_df>30 ‘X’||hbs_bh>’X5400021452’,优化处理:hbs_bh>’5400021542’ sk_rq+5=sysdate,优化处理:sk_rq=sysdate-5 hbs_bh=5401002554,优化处理:hbs_bh=’ 5401002554’ 注:此条件对hbs_bh 进行隐式的to_number转换,因为hbs_bh字段是字符型  条件内包括了多个本表的字段运算时不能进行索引,如: ys_df>cx_df,无法进行优化 qc_bh||kh_bh=’5400250000’,优化处理:qc_bh=’5400’ and kh_bh=’250000’  HINT  是在ORACLE产生的SQL分析执行路径不满意的情况下要用到的。它可以对SQL进行以下方面的提示  目标方面的提示:  COST(按成本优化)  RULE(按规则优化)  CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化)  ALL_ROWS(所有的行尽快返回)  FIRST_ROWS(第一行资料尽快返回)  执行方法的提示:  USE_NL(使用NESTED LOOPS方式联合)  USE_MERGE(使用MERGE JOIN方式联合)  USE_HASH(使用HASH JOIN方式联合)  索引提示:  INDEX(TABLE INDEX)(使用提示的表索引进行查询)  其它高级提示(如并行处理等等) 1.5 索引的规则: 建立索引常用的原则如下: 1. 表的主键、外键必须有索引 2. 数据量超过 1000 行的表应该有索引 3. 经常与其它表进行连接的表,在边接字段上应建立索引 4. 经常出现在 where 子句的字段且过滤性极强的,特别是大表的字段,应该建立索引 5. 索引字段,尽量避免值为 null 6. 复合索引的建立需要仔细分析;尽量考虑用单字段索引代替:  正确选择复合索引的第一个字段,一般是选择性较好的且在 where 子句常的字段上。  复合索引的几个字段是否经常同时以and方式出现在where子句?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引。  如果复合索引包含的字段经常单独出现在 where 子句,则分解为多个单字段索引。  如果复合索引所包含的字段超过 3 个,那么仔细考虑其必要性,考虑减少复合的字段。  如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引; 7. 频繁 DDL 的表,不要建立太多的索引 8. 删除无用的索引,避免对执行计划造成负面影响 9. 让 SQL 语句用上合理的索引,合理让 SQL 语句使用索引的原则如下:  首先,看是否用上了索引,对于该使用索引而没有用上索引的 SQL 语句,应该想办法用上索引。  其次,看是否用上正确的索引了,特别复杂的 SQL 语句,当其 where 子句包含多个带有索引的字段时,更应该注意索引的选择是否合理。错误的索引不仅不会带来性能的提高,相反往往导致性能的降低。  针对如何用上合理的索引,以 Oracle 数据的例子进行说明:  任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数。  避免不必要的类型转换,要了解“隐藏”的类型转换。  增加查询的范围,限制全范围的搜索。  索引选择性低,但资料分布差异很大时,仍然可以利用索引提高效率。  Oracle 优化器无法用上合理索引的情况下,利用 hint 强制指定索引。  使用复合索引且第一个索引字段没有出现在 where 时,建议使用 hint 强制。 1.6 索引使用优化  建立Plan_Table CREATE TABLE PLAN_TABLE ( STATEMENT_ID VARCHAR2(30), TIMESTAMP DATE, REMARKS VARCHAR2(80), OPERATION VARCHAR2(30), OPTIONS VARCHAR2(30), OBJECT_NODE VARCHAR2(128), OBJECT_OWNER VARCHAR2(30), OBJECT_NAME VARCHAR2(30), OBJECT_INSTANCE NUMBER(38), OBJECT_TYPE VARCHAR2(30), OPTIMIZER VARCHAR2(255), SEARCH_COLUMNS NUMBER(38), ID NUMBER(38), PARENT_ID NUMBER(38), POSITION NUMBER(38), OTHER LONG )  Syntax 说明: explain plan set statement_id = user_define for select ... 将结果显示 SELECT LPAD(' ', 2 *(LEVEL - 1)) || operation op, options, object_name, POSITION FROM plan_table START WITH ID = 0 AND STATEMENT_ID = user_define CONNECT BY PRIOR ID = parent_id AND STATEMENT_ID = user_define  示例 如要测试下面SQL: SELECT c.short, a.cday, a.card_no, a.qty FROM sales.stockiohis a, sales.product_info b, sales.vendor c WHERE a.card_no = b.card_no AND b.vendorid = c.vendorid AND a.produce_no = '2007090001' AND a.CATEGORY = '10' AND a.iotype = '1' 新增文件:例 d:\mydoc\plan.sql '0001'为user_define为使用者自定义编号 EXPLAIN PLAN SET STATEMENT_ID = '0001' FOR SELECT 'X' FROM sales.stockiohis a ,sales.product_info b ,sales.vendor c WHERE a.card_no = b.card_no AND b.vendorid = c.vendorid AND a.produce_no = '2007090001' AND a.CATEGORY = '10' AND a.iotype = '1' / SET arraysize 1 SET line 100 COLUMN op format a40 COLUMN object_name format a20 COLUMN options format a20 SELECT LPAD(' ', 2 *(LEVEL - 1)) || operation op, options, object_name, POSITION FROM plan_table START WITH ID = 0 AND STATEMENT_ID = '0001' CONNECT BY PRIOR ID = parent_id AND STATEMENT_ID = '0001' / DELETE FROM plan_table WHERE STATEMENT_ID = '0001' / COMMIT / 结果 1.7 避免不必要的排序 说明:对查询结果进行排序会大大的降低系统的性能,group与union都会对数据作排序,要耗费较多的内存,视状况用union all既可,不然有时数据太大又要进行union的排序,会导致Oracle数据库SORT_AREA_SIZE不足发生系统错误。 1.8 对于数字型的Primary Key,建议用序列 sequence 产生。 说明:除非是单据的单号,要求必须是唯一,并且依据流水号不可以跳号,不然在大量交易的表格,不在乎跳耗时,要取得唯一的Primary Key 建议使用Oracle Sequence这样速度会较快,而且不会有锁定(Lock)的问题。
1、索引 ·什么是索引 ·索引的基本原理 ·索引的基本写法 ·索引的分类 ·索引的作用 ·索引的优缺点 ·索引的建立原则 2、存储过程 ·什么是存储过程 ·存储过程的基本写法 ·存储过程的作用 ·存储过程的优缺点 ·存储过程的应用场景 3、触发器 ·什么是触发器 ·触发器的的基本写法 ·触发器的功能 ·触发器的优缺点 ·触发器的两种形式 ·触发器的应用场景 4、视图 ·什么是视图 ·视图的基本写法 ·视图在哪些情况下不能被增、删、改 ·视图的作用 ·视图的优缺点 ·视图的应用场景 5、游标 ·什么是游标 ·游标的作用 ·游标的分类 ·游标的基本用法 ·使用游标的优缺点 ·什么时候选择使用游标 1、 (1)索引是对数据库一列或多列进行排序的一种结构。 (2)Mysql搜索引擎Innodb(聚簇索引)和Mysiam(非聚簇索引)都采用B+,oracle也采用B+树实现 注:聚簇索引:一张表只能建立一个聚簇索引,以主键建立索引。聚簇索引包括主键索引和二级索引(二级索引是在对非主键字段建立索引后,通过索引找到对应这个非主键字段的主键,再进行主键索引,找到B+树叶子结点);(聚簇索引B+树叶子结点存放的是数据和指向下一条数据的指针) 非聚簇索引:对主键和非主键字段建立索引时,直接找到B+树的叶子结点,B+树叶子结点存放的是对应数据的地址,并通过地址找到数据。 (3)Create index 索引名 on 表名(字段名) (4)索引分为聚簇索引和非聚簇索引 (5)索引的作用 1.创建唯一性索引,可以保证数据库每一行数据的唯一性。 2.可以加大数据的检索速度,这也是创建索引的主要原因。 3.可以加速表与表之间的连接效率。 4.在分组排序时使用索引,可以减少分组排序的时间。 (6)索引的优缺点 索引的优点既索引的作用。 索引的缺点:1.建立索引会产生占据一定的空间。2.对表的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度。 (7)索引的建立原则 1.主外键 2.经常被查询的列 3.用于连接的字段 4.排序分组的字段 2、存储过程 (1)什么是存储过程? 存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,它存储在数据库,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 (2)存储过程的基本写法(oracle) Create or replace procedure 名称(参数) Is/as (变量的赋值例如:(a name%type)(a varchar(2))) Begin Sql语句以及判断条件 End 名称; (3)存储过程的作用 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而 一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速 度。 2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来 与数据库提供的事务处理结合一起使用。 3.存储过程可以重复使用,可减少数据库开发人员的工作量。 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。 (4)存储过程的优缺点 优点: 作用的四条加上 1.分布式工作。 应用程序和数据库的编码工作可以分别独立进行,而不会相互影响。 缺点:1.如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了。 2.可移植性差 由于存储过程将应用程序绑定到数据库,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。 (5)存储过程的应用场景 1.通常,复杂的业务逻辑需要多条  SQL  语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程,那么客户机和服务器之间的网络传输就会大大减少,降低了网络负载。 3、触发器 (1)什么是触发器 在Oracle,触发器是一种特殊的存储过程,也是由一组sql语句以及一些业务逻辑代码组成的。数据库可以通过增、删、改来触发触发器。 (2)触发器的基本写法 create or replace trigger tri_adddept AFTER INSERT on dept For each row //表级不用加 declare begin dbms_output.put_line('插入了新部门'); end ; (3)触发器的功能 1.配合sequence实现自增(oracle) 2.提供审计和日志记录 3.写复杂的业务逻辑代码 (4)触发器的优缺点 优点: 1.实现级联更改 2.能过实现比check更严格的约束,与CHECK 约束不同,触发器可以引用其它表的数据。通过其他表的数据的变化来设置更加复杂的约束。 缺点:滥用触发器会造成数据库及应用程序的维护困难。 (5)触发器的两种形式(行级触发器,表级触发器) 1.在语法上,行级触发器就多了一句话:for each row 2.在表现上,行级触发器,在每一行的数据进行操作的时候都会触发。 语句级触发器,对表的一个完整操作才会触发一次。 简单的说:行级触发器,是对应行操作的;语句级触发器,是对应表操作的。 (6)应用场景 作用+优点 4、视图 (1)什么是视图? 视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条SELECT语句,结果集被赋予一个名字,即视图名字。 视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。 (2)视图的基本写法 Create view 视图名 as select * from emp; (3)视图在哪些情况下不能被增、删、改 (1)若视图的字段是来自字段表达式或常数,则不允许对此视图执行INSERT、UPDATE操作,允许执行DELETE操作; (2)若视图的字段是来自库函数,则此视图不允许更新; (3)若视图的定义有GROUP BY子句或聚集函数时,则此视图不允许更新; (4)若视图的定义有DISTINCT任选项,则此视图不允许更新; (5)若视图的定义有嵌套查询,并且嵌套查询的FROM子句涉及的表也是导出该视图的基表,则此视图不允许更新; (6)若视图是由两个以上的基表导出的,此视图不允许更新; (7)一个不允许更新的视图上定义的视图也不允许更新; 本表的行列子集视图一般是可更新的。若视图的属性来自集函数、表达式,则该视图肯定是不可以更新的。 (4)视图的作用 1、视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。 2、视图提供了一个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限) 3、从而加强了安全性,使用户只能看到视图所显示的数据。 4、视图还可以被嵌套,一个视图可以嵌套另一个视图。 (5) 视图的优缺点 优点:1.简单性。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。 2.安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。 3. 逻辑数据独立性。视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。 缺点:1.如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,也要花费一定的时间。 2.修改限制:当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。 (6)视图的应用场景 1.访问频繁,更新少的一组数据 2.需要对一些数据限制访问权限时 5、游标(cursor) (1)什么是游标 游标实际上是一种能从包括多条数据记录的结果集每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果的所有行,但他一次只指向一行。 (2)游标的作用 游标的一个常见用途就是保存查询结果,以便以后使用。 (3)游标的分类 游标分为显示游标和隐式游标 隐式游标:是用户操作SQL时自动生成的,而显式游标是在声明块直接定义的游标。 (4)游标的基本用法 通过ROWCOUNT查看游标指向的行:(隐式游标实例) 例: DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count from dept; --返回一个隐式游标 dbms_output.put_line('SQL%ROWCOUNT = '||SQL%COUNT); END; / 执行结果:SQL%ROWCOUNT = 1 (显式游标基本) DECLARE CURSOR mycur IS SELECT * FROM dept; deptinfo dept%ROWTYPE; BEGIN IF mycur%ISOPEN THEN NULL; ELSE OPEN mycur; END IF; LOOP FETCH mycur INTO deptinfo; EXIT WHEN mycur%NOTFOUND; dbms_output.put_line('部门名称:'||deptinfo.dname); END LOOP; END; (配合for) DECLARE CURSOR mycur IS SELECT * FROM dept; deptinfo dept%ROWTYPE; BEGIN For test in mycur loop EXIT WHEN mycur%NOTFOUND; dbms_output.put_line('部门名称:'||test.dname); END LOOP; END; (5)游标的优缺点 优点: 游标允许应用程序对查询语句select 返回的行结果集每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作; 它还提供对基于游标位置而对表数据进行删除或更新的能力 缺点: 处理大数据量时,效率低下,占用内存大 (6)什么时候选择使用游标? 一般是在循环处理的时候使用。 比如你判断一个班上的同学数学成绩怎么样,你就可能用游标,先把全部的成绩查询到游标,之后再循环一条条进行判断处理。
要将数据导入MySQL数据库,你可以使用MySQL提供的命令行工具或使用编程语言(如Java)的MySQL连接库来实现。以下是两种常见的方法: 1. 使用MySQL命令行工具: - 将数据保存到一个文本文件(如CSV或SQL格式)。 - 打开命令行终端,并使用以下命令登录到MySQL服务器:`mysql -u <username> -p <database_name>`。请将`<username>`替换为你的用户名,`<database_name>`替换为你要导入数据的数据库名称。 - 输入密码并按Enter键登录到MySQL服务器。 - 使用以下命令导入数据:`LOAD DATA INFILE '<file_path>' INTO TABLE <table_name> FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';`。请将`<file_path>`替换为数据文件的路径,`<table_name>`替换为要导入数据的目标表名。 - 执行命令后,MySQL将读取数据文件并将其导入到指定的表。 2. 使用编程语言的MySQL连接库: - 在你的程序使用适当的MySQL连接库(如JDBC)建立与MySQL数据库的连接。 - 将数据从源(如文本文件或其他数据源)读取到你的程序。 - 使用SQL语句来将数据插入到MySQL数据库的目标表。例如,你可以使用`INSERT INTO`语句来插入数据。 这两种方法都有各自的优点和适用场景。如果你只需偶尔导入少量数据,使用MySQL命令行工具可能更为方便。如果你需要自动化导入或有更复杂的数据处理需求,使用编程语言来处理数据可能更为灵活。 请注意,无论使用哪种方法,确保数据格式正确,并根据实际情况调整导入数据的方法和参数。 希望对你有所帮助

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值