数据库(MSSQLServer,Oracle,DB2,MySql)常见语句以及问题
- 创建数据库表
create table person
(
FName varchar(),
FAge int,
FRemark varchar(),
primary key(FName)
)
- 基本sql语句
--查询
select * from person where FAge<;
--删除
delete from person where FRemark='名誉总裁';
--插入
insert into person(FAge,FRemark)values(,'新员工')
--更新
update person set FRemark='总经理'where FRemark='名誉总裁' or position='副经理';
- 一次插入数据
INSERT INTO T_ Person(FName,FAge,FRemark) VALUES('Jim',,'USA');
INSERT INTO T_ Person(FName,FAge,FRemark) VALUES('Lili',,'China');
INSERT INTO T_ Person(FName,FAge,FRemark) VALUES('XiaoWang',,' China’);insert 语句中的顺序可以是任意的,语句中的列的顺序不会影响插入的结果,但是values后面的字段值要和前面的字段值对应.可以忽略某些字段的插入
insert into T_person(FAge,FName)values(,'LXF')
- 不指定插入的列
insert into T_person values('lurenl',,'China')
如果不指定要插入的列,values后面的字段要按照数据库定义的字段顺序插入
- 非空约束对数据插入的影响.
如果对一个字段添加了非空约束,是不能向字段中插入null值的,比如T_Debt表的FAmount字段有非空约束.
insert into t_debt(FAmount,Fperson)values(null,'jim')
会报错:不能将值NULL插入列’FAmount',表’dbo.T Debt';列不允许有空值。INSERT失败
- 主键对数据插入的影响
主键是在同一张表中必须是唯一的,如果在进行数据插入的时候指定的主键与表中己有
的数据重复的话则会导致违反主键约束的异常。insert into t_debt(FNumber,FAmount,FPerson)values('',,'Jim')
会报错:不能在对象dbo.T Debt中插入重复键
- 数据的删除
删除person表里面的所有数据
delete from person;
delete删除的是表中的数据.drop删除数据的同时连表的结构都删除了
drop table person
delete执行完成之后还能查询,只是表是空的数据,drop执行完成之后再select,就会提示"数据表person不存在"
- 给列起别名
别名的定义规则(列名 AS 别名)select FName as name from person
也可以省略as
select FName name from person
- 按照条件过滤
SELECT FName FROM T_ Employee WHERE FSalary<
- 聚合(最)
- MAX查询年龄大于25岁的员工的最高工资
select Max(FSalary) from person where FAge>
- 也可以为聚合函数的结构取别名
SELECT MAX(FSa工ary) as MAX-SALARY FROM T_ Emp工oyee
WHERE FAge> - AVG求平均值
SELECT AVG(FAge) FROM T_ Emp工oyee WHERE FSalary>
- SUM求总数
SELECT SUM(FSa工ary) FROM T_ Emp工oyee
- MIN最小值与MAX一起使用
SELECT MIN(FSalary),MAX(FSalary) FROM T_ Emp工oyee
- Count计算数据总条数
SELECT COUNT(*),COUNT(FNumber)FROM T_ Employee
- 排序Order By
- order by位于select 语句的末端(asc代表升序,可以省略:desc是降序,不能省略)
SELECT * FROM T_ Employee ORDER BY FAge ASC
按照年龄从大到小排序,如果年龄相同则按照
之类的排序功能SELECT * FROM T_ Employee ORDER BY FAge DESC,FSalary DESC
- ORDER BY子句完全可以与WHERE子句一起使用(ORDER BY子句要放到WHERE子句之后,不能颠倒它们的顺序)
SELECT * FROM FAge> BY FAge T_ Emp工oyee WHERE ORDER by FAge DESC,FSalary DESC
- 通配符过滤
- like,_
- _(单个通配符)
SELECT * FROM T_ Employee WHERE FName LIKE '_erry'
以任意字符开头,剩余部分为“erry"
- 要检索长度为4、第3个字符为“n ",其他字符为任意字符
SELECT * FROM T_ Employee WHERE FName LIKE,'__n_'
- %(多字通配符)
SELECT * FROM T_ Employee WHERE FName LIKE’T%’
以“T”开头,长度任意。
- 姓名中包含字母"n”的员工信息
SELECT * FROM T_ Employee WHERE FName LIKE’%n%’
单字符匹配和多字符匹配还可以一起使用。
SELECT * FROM T_ Employee WHERE FName LIKE’%n_'
上面表示:最后一个字符为任意字符、倒数第_个字符为“n " ,长度任意的字符串。
- 集合匹配[](表示匹配集合中的任意一个)(只有MSSQLServer支持)
SELECT * FROM T_Employee WHERE FName LIKE '[SJ]%'
上面代表:以“S”或者“J“开头长度,长度任意
- 否定符"^"(用来对集合取反)(只有MSSQLServer支持)
SELECT * FROM T_Employee WHERE FName LIKE '[^SJ]%'
上面表示:不以“S”或者“J“开头,长度任意。
- is null和is not null(空值检测)
SELECT * FROM T_Employee WHERE FNAME IS NOT NULL AND FSalary <
上面表示:查询所有姓名已知且工资小于5000的员工信息
- "!","<>","not"(反义运算符)
SELECT * FROM T_Employee WHERE FAge<> AND FSALARY !=
上面表示:所有年龄不等于22岁并且工资不等于2000元”.(!=和<>)
SELECT * FROM T_Employee WHERE NOT(FAge=) AND NOT(FSALARY<)
上面表示:检索所有年龄不等于22岁并且工资不小于2000元(not)
- where...or...和in(),(多值运算)
SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge= OR FAge= OR FAge=;
SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge IN (,,)上面两句结果完全一样,都是要把21,22,25的所有信息查询出来
- 范围值查询(between...and...)
SELECT * FROM T_Employee WHERE FAGE>= AND FAGE <=;
SELECT * FROM T_Employee WHERE FAGE BETWEEN AND上面结果完全一样,检索所有年龄介于23岁到27岁之间的员工信息
- group by(分组)
SELECT FAge FROM T_Employee WHERE FSubCompany = 'Beijing' GROUP BY FAge
GROUP BY子句必须放到SELECT语句的之后,如果SELECT语句有WHERE子句,则GROUP BY子句必须放到WHERE语句的之后。
虽然GROUP BY子句常常和聚合函数一起使用,不过GROUP BY子句并不是不能离开聚合函
数而单独使用的,GROUP BY子句中可以指定多个列,只需要将多个列的列名用逗号隔开即可。 数据分组与聚合函数
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge
上面表示:查看每个年龄段的员工的人数
- count(*)是会对每个分组统计总数
- having(对部分数组尽心筛选)
--这是错误的(语法错误)
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge WHERE COUNT(*)>1上面报错是因为:聚合函数不能在where语句中使用,必须要用having字句来代替.比如下面
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1
HAVING语句中也可以像WHERE语句一样使用复杂的过滤条件:检索人数为1个或者3个的年龄段
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) =1 OR COUNT(*) =3
也可以使用IN操作符来实现上面的功能
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) IN (1,3)
- where 和having(使用where的时候group by要位于where之后,使用having的时候group by要位于having之前)
--这句是错的
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee HAVING COUNT(*) IN (1,3) GROUP BY FAge需要特别注意,在HAVING语句中不能包含未分组的列名,例如
--这句是错的
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING FName IS NOT NULL执行的时候数据库系统会提示类似如下的错误信息:
HAVING 子句中的列 'T_Employee.FName' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
需要用WHERE语句来代替HAVING,修改后的SQL语句如下:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee WHERE FName IS NOT NULL GROUP BY FAge
- 限制结果集行数:在进行数据检索的时候有时候需要只检索结果集中的部分行
- MySql(MYSQL中提供了LIMIT关键字用来限制返回的结果集,LIMIT放在SELECT语句的最后位置)(语法:“LIMIT 首行行号,要返回的结果集的最大数目”。)
select * from person order by age desc limit 2,5;
上面表示:返回按照年龄降序的从第二行开始(行号从0开始)的最多5条记录;
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 0,5
上面表示:按照工资降序排列的前五条记录
- MSSQLServer 2000(提 供 了 TOP 关 键 字 用来 返回 结 果 集 中的 前 N条 记录)
select top 5 * from T_Employee order by FSalary Desc
上面表示:检索工资水平排在前五位(按照工资从高到低)的员工信息.
SELECT top 3 * FROM T_Employee WHERE FNumber NOT IN(SELECT TOP 5 FNumber FROM T_Employee ORDER BY FSalary DESC)ORDER BY FSalary DESC
上面表示:
检索按照工资从高到低排序检索从第六名开始一共三个人的信息;
MSSQLServer2005(容几乎所有的MSSQLServer2000的语法,另外提供ROW_NUMBER()帮助更好的限制结果集行数的功能)(ROW_NUMBER()函数可以计算每一行数据在结果集中的行号(从1开始计数))<语法:
ROW_NUMBER OVER(排序规则)
>
select ROW_NUMBER() OVER(order by FSalary),FNumber,FName,FSalary,FAge from T_Employee
会输出如下图
如果想得到第3行到第5行的数据:下面的是错的
--代码是错的
SELECT ROW_NUMBER() OVER(ORDER BY FSalaryDESC),FNumber,FName,FSalary,FAge FROM T_Employee WHERE (ROW_NUMBER() OVER(ORDER BY FSalary DESC))>=3 AND (ROW_NUMBER() OVER(ORDER BY FSalary DESC))<=5运行时会报错:开窗函数只能出现在 SELECT 或 ORDER BY 子句中::也就是说ROW_NUMBER()不能用在WHERE语句中.
select * from (select row_number()over(order by fsalary desc)as rownum,fname,fname,fsalary,fage from t_employee) as a where a.rownum>=3 and a.rownum<=5
上面的结果就是想要的结果
- Oracle(Oracle中支持窗口函数ROW_NUMBER(),其用法和MSSQLServer2005中相同)(orace中定义别名的时候不能用as)
select * from(select row_number() over(order by fsalary desc) row_num,fnumber,fname,fsalary,fage from t_employee) a where a.row_num>=3 and a.row_num<=5
不过oracle提供了更方便的特性,用来计算行号,oracle为每个结果集都默认增加了一个默认的表示行号的列,这个列的名称为rownum(从1开始计数)
SELECT * FROM T_Employee WHERE rownum<=6 ORDER BY FSalary Desc
上面表示:按工资从高到底排序的前6名员工的信息;
当进行检索的时候,对于第一条数据,其rownum为1,因为符合“WHERE rownum<=6”
所以被放到了检索结果中;当检索到第二条数据的时候,其rownum为2,因为符合“WHERE
rownum<=6”所以被放到了检索结果中……依次类推,直到第七行。---这是错误的代码
SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee WHERE rownum BETWEEN 3 AND 5 ORDER BY FSalary DESC当进行检索的时候,对于第一条数据,其rownum为1,因为不符合“WHERE rownum
BETWEEN 3 AND 5”,所以没有被放到了检索结果中;当检索到第二条数据的时候,因为第
一条数据没有放到结果集中,所以第二条数据的rownum仍然为1,而不是我们想像的2,所以因
为不符合“WHERE rownum<=6”,没有被放到了检索结果中;当检索到第三条数据的时候,
因为第一、二条数据没有放到结果集中,所以第三条数据的rownum仍然为1,而不是我们想像的3,所以因为不符合“WHERE rownum<=6”,没有被放到了检索结果中…… - DB2也支持row_number(),语法跟mssql和oracle一样,还提供了fetch关键字用来提取前N行..语法为:fetch first 条数 rows only
select * from t_employee order by fsalary desc fetch first 6 rows only
--必须注意:fetch字句要放在order by语句后面上面表示:
按工资从高到底排序的前6名员工的信息
select * from t_employee where fnumber not in(select fnumber from t_employee order by fsalary desc fetch first 5 rows only) order by fsalary desc fetch first 3 rows only
上面表示:检索按照工资从高到低排序检索从第六名开始一共三个人的信息
- 数据库分页
假设页面上有首页,尾页,上一页,下一页.每页显示条数为PageSize,当前页数(从0开始)为CurrentIndex,那么只要查询从第PageSize*CurrentIndex开始的PageSize条数据,得到的就过就是当前页的数据;点击[上一页],将currentindex设置为currentindex-1;点击[下一页],将currentindex设置为currentindex+1;点击[首页],将currentindex设置为0;点击[尾页],将currentindex设置为 "总条数/PageSize"(如果有余,再加1).
抑制数据重复
当我们做数据检索的时候,如果一列的数据有重复的,这不是我们想要的,比如,我们检索公司人元列表的时候,很多部门名称是相同的,这不是我们想要的,我门想要的就是把重复的部门只留下一个,distinct关键字是用来进行重复数据抑制的最简单的功能,而且所有的数据库都支持distinct.distinct语法只需要在select之后增加distinct即可select fdepartment from t_employee
效果是这样的
select distinct fdepartment from t_employees
加了distinct之后的效果
- DISTINCT是对整个结果集进行数据重复抑制的,而不是针对每一个列
select distinct fdepartment,fsubcompany from t_employees
检索结果中不存在fdepartment和fsubcompany列都重复的数据行,但却存在fdepartment列重复的数据行,这就说明DISTINCT是对整个结果集进行数据重复抑制的
字符串的拼接
数据库(MSSQLServer,Oracle,DB2,MySql)常见语句以及问题的更多相关文章
- 数据库(MSSQLServer,Oracle,DB2,MySql)常见语句以及问题(续1之拼接字符串)
上一篇文章http://www.cnblogs.com/valiant1882331/p/4056403.html写的太长了,所以就换了一篇,链接上一节继续 字符串的拼接 MySql中可以使用&quo ...
- oracle 和 mysql 常用语句对比汇总
文章目录 一.数据库管理 1.1 用户管理 1.1.1 mysql用户.权限管理 1.1.2 oracle 用户.角色.权限管理 二.DQL 语句 2.1 基础查询 1.常量查询的区别: 2.字符串拼 ...
- SQL Server,Oracle,DB2索引建立语句的对比
原文引至:http://jvortex.blog.163.com/blog/static/16961890020122141010878/ 我们知道,索引是用于加速数据库查询的数据库对象.原理就是减少 ...
- 数据库开发 Oracle与mysql间的批量处理接口 SSIS+存储过程实现
公司目前不同的业务系统用了不同的数据库,涉及到oracle.mysql.sqlserver.而一些核心的业务在mysql中,所以平时经常要把oracle.sqlserver中的数据插入到mysql中. ...
- oracle,sqlserver,mysql常见数据库jdbc连接
发现JDBC连接字符串总是容易忘记,特此整理一下常用的几种数据的连接 ORACLE: /** * ORACLE * */ public static Connection getOracleConne ...
- Oracle导入的常见语句
登录sql > sqlplus / as sysdba 创建表空间sql > create tablespace TABLESPACE datafile 'e:\tables1.dbf' ...
- 【数据库】10.0 MySQL常用语句(一)
显示数据库语句: SHOW DATABASES 只是显示数据库的名字 显示数据库创建语句: SHOW CREATE DATABASE db_name 数据库删除语句: DROP DATABASE ...
- MYSQL常见语句
SHOW INDEXES from tablename EXPLAIN tablename EXPLAIN SELECT * FROM tablename
- mysql 常见语句
事务 默认是开启了autocommit,可以通过show variables like 'autocommit';查看. 如果临时需要取消autocommit,可以通过START TRANSACTIO ...
随机推荐
- [原创]经历:asp.net oracle 部署问题以及解决方法
精简的美丽...... 一.环境 开发环境 win7 64bit Vs2010 Oracle 11g r2 64bit <inst ...
- LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡
前言 首先声明下,由于这两天找资料,看了不少博客 ,但是出于不细心,参考者的博客地址没有记录下来,所有文中要是出现了与大家博客相同的地方,那么请大家在评论区说明并附上博客地址,我好引用进来:这里表示抱 ...
- HTML 之 Web页面表单form中只有一个input的text元素,按回车默认提交
WEB开发中,如果页面的 form 中只有一个input元素,在该input元素的输入框中按回车(注:此时并没有写对应的onkeydown等事件处理),则浏览器会默认提交表单,请看如下代码: < ...
- SSIS 学习(2):数据流任务(上)【转】
数据流任务是SSIS中的一个核心任务,估计大多数ETL包中,都离不开数据流任务.所以我们也从数据流任务学起. 数据流任务包括三种不同类型的数据流组件:源.转换.目标.其中: 源:它是指一组数据存储体, ...
- jquery手写焦点轮播图-------解决最后一张无缝跳转第一张的问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【二进制】FZU 2062 Suneast & Yayamao
题意:给出n,问最少需要多少个数字,这些数字能组成1~n的所有数: 分析:n=1; 1; 1个 n=2; 1,1; 2个 1 = 1; 2 = 1+1; n=3; 1,2; 2个 1 = 1; ...
- android 获取IMEI号
android 获取 imei号码 核心代码: Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId( ...
- iOS下编译ffmpeg
网络上搜索“ios ffmpeg 编译”,文章一大把,但我编译还是费了很大的功夫才编译成功.很多文章只是把步骤列了出来,但是每个人的系统环境,或者程序版本都不一样,结果出现各种的错误.我把自己编译过程 ...
- asp.net上传大文件
Asp.net默认允许上传文件的最大值为4M. 如果想要上传更大的文件,需要修改web.config文件,方法是: 在<system.web>节点中添加代码 <httpRuntime ...
- java-MySQL存储过程
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import ...