现在的位置: 首页 > 综合 > 正文

常用sql语句总结

2017年11月18日 ⁄ 综合 ⁄ 共 12169字 ⁄ 字号 评论关闭

SQL语句:用于操作数据库的语句。
数据库:保存在硬盘上的文件
数据库产品:采用一种优良的数据库结构来保存数据,方便我们对数据进行查询和修改(增 删 改  更新)等等。
Oracle数据库是收费的, MySQL是免费的 ,但是性能比不上Oracle。
我们要使用数据库首先要下载数据库服务器,解压压缩文件,(BIN目录下存放着mysql.exe和其他可执行文件),并对数据库服务器进行安装设置。服务器监听端口为3306。在使用数据库之前我们必须启动数据库服务器。可以在CMD命令行窗口输入 net start mysql对mysql服务器进行启动。
所谓数据库服务器,是指在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库,为了保存应用中的实体数据,一般会在数据库创建多个表,以保存程序中的实体数据。
一、连接MYSQL。(进入mysql服务器,必须运行mysql.exe才能进入)
需要输入以下命令连接服务器:主机名 端口号 用户名  密码。
格式: mysql  -h主机名  -P(大写)端口号 -u用户名 -p用户密码
1、连接到本机上的MYSQL。(访问本地的可以省略主机名和端口号)
首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码.这样可以防止密码泄露。
如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>
2、连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,端口号为3306,用户名为root,密码为123。则键入以下命令:
mysql -h110.110.110.110  -P 3306 -u root -p 123;(注:u与root之间可以不用加空格,其它也一样)
3、退出MYSQL命令: exit (回车)

下篇我是MYSQL中有关数据库方面的操作。注意:你必须首先登录到MYSQL中,以下操作都是在MYSQL的提示符下进行的,而且每个命令以分号结束。

数据库和表的操作由以下SQL语句组合:
数据库:database
表:table
创建:create
查看:show
修改:alter
删除:drop
使用:use

@@@@@@@数据库的操作实例。
创建一个名称为mydb1的数据库:
create database mydb1;
创建一个使用utf-8字符集的mybd2数据库:
create database mydb2 character set utf8;
创建一个使用utf-8字符集,并带校对规则的mydb3数据库:
create database mydb3 character set utf8 collate utf8_general_ci;
注意:相同的数据库名字不能再创建。
查看数据库所有编码:show variables like 'character%';
查看所有数据库:show databases;
查看数据库的创建语句:show create database mydb2;
删除前面创建的mydb3数据库:drop database mydb3;
数据库的修改,数据库一旦创建名称无法修改,只有字符集和校对规则可以修改。例如把mydb2的字符集修改成gb2312:alter database mydb2 character set gb2312;
使用数据库mydb2:use mydb2;
另外还有2个特殊的命令:
1,备份数据库mydb2:mysqldump -uroot -proot mydb2 > d:\a.sql 此命令和mysql是一个级别的命令  因此需要在根目录执行 而不是在服务器内部执行。
2,恢复数据库,实际上是恢复数据库中的数据:
create database mydb3; 创建数据库---相当创建文件夹
use mydb3;  使用数据库  -----相当于打开文件夹
source d:\a.sql   恢复内容到使用的数据库---相当于复制粘贴
注意:mysqldump(备份)和source(恢复)命令语句后面不带;号。

@@@@@@@@表的操作实例。
创建表employee(员工表):
create table employee
(  //字段(field)    类型 (type)  
     id              int,               
     name            varchar(20),
     gender          varchar(6),
     birthday        date,
     job             varchar(20),
     salary          float,
     resume          text
);

修改表的名称:Rename table 表名 to 新表名
修改表的字符集: alter table 表名 character set utf8;
使用ALTER TABLE 表名 语句追加,修改,或删除列的语法:
ALTER TABLE 表名  ADD  列名  列的类型 ;--------添加某一列
ALTER TABLE 表名  MODIFY 列名  列的类型;-------------修改某一列
ALTER TABLE 表名   DROP   列名; -------------删除某一列
ALTER TABLE 表名  change column 列名 新列名 varchar(40);----修改列名
注:列名对应的就是字段(field),类型对应的就是类型(type)。

查看所有的表:show tables;
查看表的创建语句:show create table 表名;
查看表的结构:desc 表名;
删除表: drop table 表名;
============================================================
表中数据的操作由以下SQL语句执行:
insert语句  增加数据
update语句  更新数据
delete语句  删除数据
select语句  查询数据
@@@@@@@@@@@@@表中数据的操作实例。
注意:字符和日期型数据应包含在单引号中,插入的数据类型应与字段(列)规定的数据类型相同,数据大小要在规定范围之内。
1,增加数据:insert into 表名 (列名,列名...) values (数据,数据..);
如果不写列名默认是为所有的列添加数据:insert into 表名 values (数据,数据..);
增加多条数据:insert 表名 (列名,列名...) values (数据,数据..),(数据,数据..);
2,更新数据(修改数据):update 表名 set 列名=数据 ;//此列上的所有数据都被修改。
  update 表名 set 列名=数据 where 列名=数据;//用where删选数据 符合条件的修改。
update 表名 set 列名=数据 ,列名=数据  where 列名=数据;//改满足条件的多条信息。
3,删除数据:delete from 表名 where 列名=数据;//删除满足条件的数据。
删除表中所有的记录:delete from 表名;
使用高效的方法删除表中所有的记录:truncate 表名;
4,查询语句:select * from 表名 ;//查询表中所有的数据
  select  列名,列名  from 表名 ;//查询表中指定列名的数据
过滤表中指定列中重复的数据并显示出来:select ditinct 列名,列名 from 表名;

------------------------------------------------------------
表的约束:有的时候针对某个列。我们不希望别人插入任意的数据,这样会导致错误。
于是出现了表的约束 。表的约束有2种  ,一种是在表内约束,一种是表外约束:
create table employee
(  
     id              int    约束条件名,               
     name            varchar(20)   约束条件名,
     gender          varchar(6)  约束条件名
   primary key (id name)    //联合主键,相当于主键约束ID和NAME不能同时为空或相同
);
其中约束条件名自己定义有以下几种约束:not null (非空),unique(唯一)
primary key (主键约束)=not null+unique ,如果定义了主键约束,我们还可以在后面继续定义主键自定义增长(auto_increment): id  int primary key auto_increment这样ID就会不停的自加1,这样的好处是ID值自动增加1.

第二种是在表外约束,当我们表创建成功以后,忘记在表内约束的情况下输入以下SQL语句即可:alter table 表名 add 约束条件名(列名);
删除约束条件:alter table 表名 drop 约束条件名;

外键约束:某一列数据是参照另一张表的某一列 这时就需要加外键约束,这样做的好处是,外键列只能插入参照列存在的值,参照列被参照的值是不能删除的。
create table wife
(
       id  int,
       name  varchar(20),
       husbandid  int,
      constraint husbandid_FK foreign key(husbandid) references husband(id)

);
格式如下: constraint 要约束的列名_FK foreign key(要约束的列名) references 参照的表(参照的列名)   
如果要想在参照的列里面删除数据,必须先解除约束,即先把约束的列名数据修改为NULL
即:update wife set husbandid=null where id=要解除的id列的数据

-----------------------------------------------------------------
表的关系 有三种情况 
1,多对一:在多的一方建立外键
2,多对多:需要建立中间表描述关系,中间表的两个字段都是外键参照两个表的主键列,同时这两列又是联合主键
3,一对一:分清主从关系,在从的一方建立外键,此时应将主键直接作为外键。
------------------------------------------------------------
数据库中常用的数据类型
SMALLINT
整数,从-32000到 +32000范围
2
存储相对比较小的整数。

比如: 年纪,数量

INT
整数,从-2000000000 到 +2000000000 范围
4
存储中等整数

例如: 距离

BIGINT
不能用SMALLINT 或 INT描述的超大整数。
8
存储超大的整数

例如: 科学/数学数据

FLOAT
单精度浮点型数据
4
存储小数数据

例如:测量,温度

DOUBLE
双精度浮点型数据
8
需要双精度存储的小数数据
例如:科学数据

DECIMAL
用户自定义精度的浮点型数据
变量;取决于精度与长度
以特别高的精度存储小数数据。

例如:货币数额,科学数据

CHAR
固定长度的字符串
特定字符串长度(高达255字符)
存储通常包含预定义字符串的变量

例如: 定期航线,国家或邮编

VARCHAR
具有最大限制的可变长度的字符串
变量; 1 + 实际字符串长度 (高达 255 字符)
存储不同长度的字符串值(高达一个特定的最大限度).

例如:名字,密码,短文标签

TEXT
没有最大长度限制的可变长度的字符串
Variable; 2 +聽 actual string length
存储大型文本数据

例如: 新闻故事,产品描述

BLOB
二进制字符串
变量;2 + 实际字符串长度
存储二进制数据

例如:图片,附件,二进制文档

DATE
以 yyyy-mm-dd格式的日期
3
存储日期

例如:生日,产品满期
TIME
以 hh:mm:ss格式的时间
3
存储时间或时间间隔

例如:报警声,两时间之间的间隔,任务开始/结束时间

DATETIME
以yyyy-mm-ddhh:mm:ss格式结合日期和时间
8
存储包含日期和时间的数据

例如:提醒的人,事件

TIMESTAMP
以yyyy-mm-ddhh:mm:ss格式结合日期和时间
4
记录即时时间

例如:事件提醒器,“最后进入”的时间标记

YEAR
以 yyyy格式的年份
1
存储年份

例如:毕业年,出生年

ENUM
一组数据,用户可从中选择其中一个
1或 2个字节
存储字符属性,只能从中选择之一

例如:布尔量选择,如性别

SET
一组数据,用户可从中选择其中0,1或更多。
从1到8字节;取决于设置的大小
存储字符属性,可从中选择多个字符的联合。

例如:多选项选择,比如业余爱好和兴趣。

------------------------------------------------------------
JDBC 
  Java Database Connectivity (JDBC)是一个标准的Java API,它由一组类和接口组成,Java应用程序开发人员使用它来访问数据库和执行SQL语句。WebLogic JDBC是JDBC规范的企业级实现,它为标准的JDBC API提供了大量的扩展 

JDBC基础知识 

一、采用JDBC访问数据库的基本步骤: 
A.载入JDBC驱动程序 
B.定义连接URL 
C.建立连接 
D.创建Statement对象 
E.执行查询或更新 
F.结果处理 
G.关闭连接 

二、载入JDBC驱动程序: 
1.为了使代码尽可能地灵活,我们要避免对类名的引用进行硬编码(hard-coding),因此我们可以采用从Properties文件中载入驱动程序的方法,也可以使用在服务器中配置数据源(DataSource)的方法来避免在代码中硬编码 

2.在开发过程中要保证CLASSPATH设定中包括驱动程序JAR文件所在的路径。在WEB服务 
器上部署时要将JAR文件放在Web应用的WEB-INF/lib目录下。如果多个Web应用使用相同的数据库驱动程序可以将JAR文件放置在服务器使用的公共目录<%CATALINA_HOME%>\common\lib中 

三、定义连接URL: 
载入JDBC驱动程序之后,必须指定数据库服务器位置。指向数据库的URL所使用的协议是: 
jdbc:子协议,并且载入服务器的主机名、端口、数据库名(或引用)。如:Oracle 的连接URL:  
jdbc:oracle:thin:@192.168.0.71:1521:UMV2 
jdbc:oracle:采用Oracle驱动程序 
thin:指连接服务器所采用的模式 
@192.168.0.71:服务器的地址 
1521:服务器的监听端口 
UMV2:数据库名 

四、建立连接: 
1.一个数据库连接(Connection)可以通过其自身的getMetaData()来获取它的自身信息 
2.默认情况下一个数据库的连接是自动提交模式的(auto-commit),也就是说每当一个SQL语句 
被执行后其改变结果都会被自动提交,如果auto-commit模式被关闭,那么方法commit()必须被显式调用以提交改变结果,否则的话所有对数据库操作的结果都不会被保存 

五、创建Statement对象: 
在同一时间下,每个Statement对象只能打开一个ResultSet对象。所以,假如有两个同样结果的结果集在交叉访问,那么这两个结果集必定为两个不同的Statement对象所创建。如果在打开一个新的结果集的时候存在一个已经打开的结果集,则这个已经存在的结果集会被隐式的关闭 

六、执行查询或更新: 
在Statement对象中可以执行如下的操作: 
A.查询操作:executeQuery(SQL语句) B.维护操作:executeUpdate(SQL语句) 
C.批处理操作:executeBath() 

七、结果处理: 
1.ResultSet中行的第一列索引为1,而非0,访问ResultSet中的数据时要使用列名,而非索引 
 但要注意使用列名作为查询条件是大小写敏感的。 

2.JDBC1.0中,我们只能在ResultSet中向前移动;在JDBC2.0中,我们可以在ResultSet中向 
 下(next)或向上(previous)移动,同样也可以移到特定的行(relative,absolute) 

3.默认情况下ResultSet是不可更新的,且只能向前移动。下面的代码显示了如何创建一个可滚动的、对更新敏感的ResultSet 

Statement stmt = con.createStatement( 
ResultSet.TYPE_SCROLL_INSENSITIVE, 
ResultSet.CONCUR_UPDATABLE); 
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2"); 
// rs will be scrollable, will not show changes made by others, 
// and will be updatable 

4.ResultSet和ResultSetMetaData没有直接提供方法返回查询所返回的行数。然而,在JDBC 
 2.0中,可以通过调用last()方法将游标定位到ResultSet的最后一行,然后调用getRow()方 
 法获取当前的行号。在JDBC1.0中,确定行数的惟一方式是重复调用ResultSet的next()方法, 
 直到它返回false为至 

八、关闭连接: 
在关闭数据库连接时应该以ResultSet、Statement、Connection的顺序进行 

JDBC-PreparedStatement(预备语句) 

一、PreparedStatement(预备语句)的创建: 
首先按照标准的格式创建参数化语句,在实际使用之前发送参数到数据库进行编译。用问号表示语句中应该为具体的值所替换的位置。每次使用预备语句时,只需要使用相应的setXxx调用,替换语句中标记出来的参数。然后就可以和常规的语句一样,使用executeQuery或execute/executeUpdate修改表中的数据。例如: 

Connection connection = DriverManager.getConnection (url,username,password); 
// 创建带问号的参数化语句 
String template = " UPDATE music SET price=? WHERE id=? "; 
PreparedStatement statement = connection.prepareStatement (template); 

float newPrices[] = getNewPrices(); 
int recordingIDs = getIDs(); 
for(int i=0; i<recordingIDs.length;i++){ 
// 用setXxx代替? 
statement.setFloat(1,newPrices[i]); 
statement.setInt(2,recordingIDs[i]); 
// 执行预备语句 
statement.execute();} 

二、使用PreparedStatement的好处: 
1.依赖于服务器对预编译查询的支持,以及驱动程序处理原始查询的效率,预备语句在性能上的优势可能有很大的不同。 
2.安全是预备语句的另外一个特点,我们推荐在通过HTML表单接受用户输入,然后对数据库进行更新时,一定要使用预备语句或存储过程。 
3.预备语句还能够正确地处理嵌入在字符串中的引号以及处理非字符数据(比如向数据库发送序列化后的对象) 

JDBC-CallableStatement(可调用语句) 

一、使用CallableStatement(可调用语句)的优缺点: 
1.优点:语法错误可以在编译时找出来,而非在运行期间;数据库存储过程的运行可能比常规的 
SQL查询快得多;程序员只需知道输入和输出参数,不需了解表的结构。另外,由于数据库语言能够访问数据库本地的一下儿功能(序列,触发器,多重游标),因此用它来编写存储过程可能要比使用Java编程语言要简易一些。 
2.缺点:存储过程的商业逻辑在数据库服务器上运行,而非客户机或Web服务器。而行业的发展趋势是尽可能多地将商业逻辑移出数据库,将它们放在JavaBean组件(或者在大型的系统中,EnterPrise JavaBean组件)中,在Web构架上采用这种方式的主要动机是:数据库访问和网络I/O常常是性能的瓶颈。 

二、使用CallableStatement在JAVA中调用数据库存储过程: 

1.定义对数据库过程的调用 
A.无参数过程:{ call procedure_name} 
B. 仅有输入参数的过程:{call procedure_name(?,?...)} 
C.有一个输出参数的过程:{? Call procedure_name} 
D.既有输入参数又有输出参数的过程{?=call procedure_name(?,?...)} 
在过程的4种形式中要注意过程可能返回多个输出参数,并且参数的索引值从输出参数开始。因此前面最后例子中,第一个输入参数的索引值是2而不是1。 
2.为过程准备CallableStatement 
String procedure = “{ ? = call procedure_name(?,?) }”; 
CallableStatement statement = connection.prepareCall(procedure); 
3.提供输入参数的值 
在执行存储过程之前,我们需要调用与所要设置的项以及参数的类型相对应的setXxx,替换标记出来的输入参数 
Statement.setString(2,”name”); 
4.注册输出参数的类型 
我们必须使用registerOutParameter注册每个输出参数的JDBC类型 
Statement.registerOutParameter(n,type); 
5.执行这个存储过程 
Statement.execute(); 
6.访问返回的输出参数 
可以通过调用getXxx访问每个对应的输出参数 

例如: 
Connection connection = DriverManager.getConnection(url,username,password); 
String procedure = “{ ? = call myProc(?,?)}”; 
CallableStatement statement = connection.prepareCall(procedure); 
statement.setString(2,×××); 
statement.setFloat(3,×××); 
statement.registerOutParameter(1,Types.INTEGER); 
statement.execute(); 
int row = statement.getInt(1); 

JDBC-Transation(事务处理) 

一、Transation(事务处理)的概念: 
在更新数据库时,默认情况下,更改是永久性写入到数据库。然而这种默认行为可以通过编写程序来关闭。在自动交付关闭的情况下,如果在更新时发生问题,则对数据库的每个更改都能够取消(或者说回退到最初的值)。如果更新成功,那么之后可以将这些更改永久性提交给数据库。这种方式也称为事务管理。 
我们需要确保,要么所有的操作都发生,要么所有的操作都不发生。这就是事务管理的原则。 

二、在JAVA中使用Transation(事务管理)保证数据库的完整性: 
我们使用try-catch-finally块来正确地应对事务管理,首先,记录自动提交的当前状态。然后,在try块中,调用setAutoCommit(false)并执行一系列的查询或更新。如果发生故障,则在catch块中调用rollback;如果事务成功,则在try块的结尾调用commit。不管哪种方式,都在finally块中重置自动提交的状态。例如: 

Connection connection = DriverManager.getConnection(url,username,password); 
boolean autoCommit = connection.getAutoCommit(); 
Statement statement; 
try{ 
connection.setAutoCommit(false); // 关闭数据库的自动提交 
statement = connection.createStatement(); 
statement.execute(…); 
statement.execute(..); 
… 
connection.commit(); // 如果所有语句执行成功则提交事务 

catch(SQLException sqle){ 
connection.rollback(); // 如果有异常发生则回滚所有的事务 

finally{ 
if(statement!=null){statement.close();} 
connection.setAutoCommit(autoCommit); // 重置自动提交的状态 

上面的代码中,从DriverManager获取连接的语句在try/catch块之外。这样除非成功获取连接,否则不会调用rollback。如果把获取连接的语句放在try/catch快之内,一旦在连接成功后发生异常,由于rollback的作用会把已经建立的连接断开。但是getConnection方法也会抛出SQLException异常这个异常要么被外围的方法重新抛出,要么在单独的try/catch块内捕获。 
JDBC的常用API 

一、Connection接口: 
1.createStatement():创建数据库连接 
2.prepareStatement(String sql):创建预处理语句 
3.prepareCall(String sql):创建可调用语句 

4.getAutoCommit():获取自动提交的模式 
5.setAutoCommit():设置自动提交的模式 

6.commit():提交所执行的SQL语句 
7.rollback():回滚所执行的SQL语句 

8.getMetaData():获取一个DatabaseMetaData对象,该对象包含了有关数据库的基本信息 

9.close():关闭数据库连接 
10.isClose():判断数据库连接是否超时或被显示关闭 

二、Statement接口: 
1.execute(String sql):执行SQL语句,如果返回值是结果集则为true,否则为false 
2.executeQuery(String sql):执行SQL语句,返回值为ResultSet 
3.executeUpdate(String sql):执行SQL语句,返回值为所影响的行数 

4.addBatch(String sql):向当前Statement对象的命令列表中添加新的批处理SQL语句 
5.clearBatch():清空当前Statement对象的命令列表 
6.executeBatch():执行当前Statement对象的批处理语句,返回值为每个语句所影响的函数数组 

7.getConnection():返回创建了该Statement对象的Connection对象 

8.getQueryTimeout():获取等待处理结果的时间 
9.setQueryTimeout():设置等待处理结果的时间 

三、ResultSet接口: 
1.first()/beforeFirst():将游标移动到ResultSet中第一条记录(的前面) 
2.last()/afterLast():将游标移动到ResultSet中最后一条记录(的后面) 

3.absolute(int column):将游标移动到相对于第一行的指定行,负数则为相对于最后一条记录 
4.relative(int rows):将游标移动到相对于当前行的第几行,正为向下,负为向上 

5.next():将游标下移一行 
6.previous():将游标上移一行 

7.insertRow():向当前ResultSet和数据库中被插入行处插入一条记录 
8.deleteRow():将当前ResultSet中的当前行和数据库中对应的记录删除 
9.updateRow():用当前ResultSet中已更新的记录更新数据库中对应的记录 
10.cancelUpdate():取消当前对ResultSet和数据库中所做的操作 

11.findColumn(String columnName):返回当前ResultSet中与指定列名对应的索引 

12.getRow():返回ResultSet中的当前行号 

13.refreshRow():更新当前ResultSet中的所有记录 

14.getMetaData():返回描述ResultSet的ResultSetMetaData对象 

15.isAfterLast(): 是否到了结尾 
16.isBeforeFirst(): 是否到了开头 
17.isFirst():是否第一条记录 
18.isLast(): 是否最后一条记录 

19.wasNull():检查列值是否为NULL值,如果列的类型为基本类型,且数据库中的值为0,那么 
这项检查就很重要。由于数据库NULL也返回0,所以0值和数据库的NULL不能区分。如果列的类型为对象,可以简单地将返回值与null比较 

20.close():关闭当前ResultSet 

四、ResultSetMetaData接口: 
1.getColumnCount():返回ResultSet中列的数目 
2.getColumnName():返回列在数据库中的名称 
3.getColumnType():返回列的SQL类型 

4.isReadOnly():表示该数据项是否为只读值 
5.isNullable():表示该列是否可以存储NULL

抱歉!评论已关闭.