當前位置:首頁 » 編程語言 » csql操作類
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

csql操作類

發布時間: 2022-01-28 22:42:29

1. sql里查詢一個欄位里的記錄的多個類的匯總(幾個欄位按不同分類的匯總)

--技術要點:行轉列
--以下提供SQL SERVER語句

--創建測試環境
create table tab
(
machine int,
sernum varchar(10),
area varchar(2),
PF varchar(1)
)
--製造數據
insert into tab select 462,'16205R3E','AT','P'
insert into tab select 462,'16203H0N','AT','F'
insert into tab select 316,'1620A7WP','AT','S'
insert into tab select 316,'16206CCC','AT','S'

--1. 靜態行轉列(所謂靜態,是指的PF列只有P,F,S這三個值,或者值是固定的某幾個值)
select machine,
max(case pf when 'P' then num else 0 end) as P,
max(case pf when 'F' then num else 0 end) as F,
max(case pf when 'S' then num else 0 end) as S
from
(select machine,pf,count(1) as num from tab group by machine,pf
)tb
group by machine

/* 結果集
machine P F S
----------- ----------- ----------- -----------
316 0 0 2
462 1 1 0

(2 row(s) affected)
*/

--2. 動態行轉列(相對於靜態的概念)
declare @sql varchar(8000)
set @sql = 'select machine as ' + 'machine'
select @sql = @sql + ' , max(case pf when ''' + pf + ''' then num else 0 end) [' + pf + ']'
from (select distinct pf from tab) as a
set @sql = @sql + ' from (select machine,pf,count(1) as num from tab group by machine,pf
)tb group by machine'
exec(@sql)

/* 結果集
machine F P S
----------- ----------- ----------- -----------
316 0 0 2
462 1 1 0

(2 row(s) affected)
*/

--刪除環境
drop table tab

2. .net 資料庫操作類

樓主要寫好的類!using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;namespace SqlHelper
{
/// <summary>
/// 資料庫操作
/// </summary>
public class SqlDbHelp
{
/// <summary>
/// 獲取資料庫中的數據並存儲至 DataSet
/// </summary>
/// <param name="sqlStoredP">存儲過程名稱</param>
/// <param name="sp">參數</param>
/// <returns>返回一個 DataSet 類型對象</returns>
public static DataSet GetDataSetProcere(string storedProcereName, SqlParameter[] sp)
{
SqlConnection conn = CreateConnection();
SqlCommand cmd = new SqlCommand(storedProcereName, conn);
cmd.CommandType = CommandType.StoredProcere;
if (sp != null)
{
foreach (SqlParameter proc in sp)
{
cmd.Parameters.Add(proc);
}
}
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds);
cmd.Parameters.Clear();
return ds;
}
/// <summary>
/// 創建連接對象
/// </summary>
/// <returns>返回一個 SqlConnection 連接對象</returns>
private static SqlConnection CreateConnection()
{
SqlConnection conn = new SqlConnection(@"SERVER=.\SQLEXPRESS;DATABASE=ORCTMS_DateBase;INTEGRATED SECURITY=SSPI");
return conn;
}
/// <summary>
/// 批量處理存儲過程的方法
/// </summary>
/// <param name="sqlStoredP">存儲過程名稱</param>
/// <param name="sp">參數類型為 List 的 SqlParamete 集合</param>
/// <returns></returns>
public static int ExecuteProcere(string storedProcereName, List<SqlParameter[]> sp)
{
SqlConnection conn = CreateConnection();
conn.Open();
SqlCommand cmd = new SqlCommand(storedProcereName, conn);
cmd.CommandType = CommandType.StoredProcere;
if (sp != null)
{
foreach (SqlParameter[] proc in sp)
{
cmd.Parameters.Add(proc);
}
}
int count = cmd.ExecuteNonQuery();
conn.Close();
return count;
}
/// <summary>
/// 處理單一存儲過程的方法
/// </summary>
/// <param name="sqlStoredP">存儲過程名稱</param>
/// <param name="sp">參數類型為 SqlParamete 集合</param>
/// <returns></returns>
public static int ExecuteProcere(string storedProcereName, SqlParameter[] sp)
{
SqlConnection conn = CreateConnection();
conn.Open();
SqlCommand cmd = new SqlCommand(storedProcereName, conn);
cmd.CommandType = CommandType.StoredProcere;
if (sp != null)
{
foreach (SqlParameter proc in sp)
{
cmd.Parameters.Add(proc);
}
}
int count = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
conn.Close();
return count;
} /// <summary>
/// 使用資料庫視圖查詢數據
/// </summary>
/// <param name="strSqlView">資料庫視圖查詢語句</param>
/// <returns></returns>
public static DataSet ExecuteDatabaseView(string strSqlView)
{
SqlConnection conn = CreateConnection();
conn.Open();
try
{
SqlCommand cmd = new SqlCommand(strSqlView, conn);
SqlDataAdapter dap = new SqlDataAdapter();
cmd.CommandText = strSqlView;
dap.SelectCommand = cmd;
DataSet ds = new DataSet();
dap.Fill(ds);
return ds;
}
catch (Exception)
{
return null;
}
} public static SqlConnection conn = new SqlConnection(@"server=.\sqlexpress;database=ORCTMS_DateBase; integrated security=sspi");

/// <summary>
/// 建立資料庫鏈接並打開
/// </summary>
public static void CreateDatabaselink()
{
// conn.ConnectionString = @"server=.\sqlexpress;database=ORCTMS_DateBase; integrated security=sspi";

if (conn.State == ConnectionState.Closed || conn == null)
{
conn.Open();
}
}
/// <summary>
/// 關閉資料庫連接
/// </summary>
public static void CloseDatabase()
{
if (conn.State == ConnectionState.Open || conn == null)
{
conn.Close();
}
}
/// <summary>
/// 執行命令 准備參數
/// </summary>
/// <param name="cmd">命令</param>
/// <param name="sqlType">命令類型(存儲過程,T-SQL)</param>
/// <param name="strSql">命令名稱(存儲過程名稱,具體的T-SQL語句)</param>
/// <param name="sp">執行的參數</param>
/// <returns></returns>
public static void ReturnCommand(SqlCommand cmd,CommandType sqlType,String strSql,params SqlParameter[] sp)
{
CreateDatabaselink();
cmd.Connection = conn;
cmd.CommandType=sqlType;
cmd.CommandText=strSql;
if(sp!=null)
{
foreach(SqlParameter newsp in sp)
{
cmd.Parameters.Add(newsp);
}
}
}
/// <summary>
/// 返回個DataSet數據源
/// </summary>
/// <param name="sqlType">命令類型</param>
/// <param name="strSql">命令名稱</param>
/// <param name="sp">具體參數</param>
/// <returns>返回的數據源</returns>
public static DataSet ExecuteDataSet(CommandType sqlType,String strSql,params SqlParameter[] sp)
{
CreateDatabaselink();
SqlCommand cmd=new SqlCommand();
cmd.Connection = conn;
ReturnCommand(cmd,sqlType,strSql,sp);
SqlDataAdapter sda=new SqlDataAdapter(cmd);
DataSet ds=new DataSet();
sda.Fill(ds);
cmd.Parameters.Clear();
CloseDatabase();
return ds;
}
/// <summary>
/// 執行非查詢的語句,並返回影響行數
/// </summary>
/// <param name="sqlType">命令類型</param>
/// <param name="strSql">命令名稱</param>
/// <param name="sp">具體參數</param>
/// <returns>影響行數</returns>
public static int ExecuteNonQuery(CommandType sqlType,String strSql,params SqlParameter[] sp)
{
CreateDatabaselink();
SqlCommand cmd=new SqlCommand();
cmd.Connection = conn;
ReturnCommand(cmd,sqlType,strSql,sp);
int result = Convert.ToInt32(cmd.ExecuteScalar());
cmd.Parameters.Clear();
CloseDatabase();
return result;
}
/// <summary>
/// 返回個DataTable數據源
/// </summary>
/// <param name="sqlType">命令類型</param>
/// <param name="strSql">命令名稱</param>
/// <param name="sp">具體參數</param>
/// <returns>數據源</returns>
public static DataTable ExecuteDataTable(CommandType sqlType,String strSql,params SqlParameter[] sp)
{
CreateDatabaselink();
SqlCommand cmd=new SqlCommand();
cmd.Connection = conn;
ReturnCommand(cmd,sqlType,strSql,sp);
SqlDataAdapter sda=new SqlDataAdapter(cmd);
DataTable dt=new DataTable();
sda.Fill(dt);
cmd.Parameters.Clear();
CloseDatabase();
return dt;
} /// <summary>
/// 獲取ExecuteScalar查詢結果。
/// </summary>
/// <param name="sqlType">命令類型</param>
/// <param name="strSql">命令名稱</param>
/// <param name="sp">具體參數</param>
/// <returns>查詢的結果</returns>
public static object GetScalarResult(CommandType sqlType,String strSql,params SqlParameter[] sp)
{
object result;
CreateDatabaselink();
SqlCommand cmd=new SqlCommand();
cmd.Connection = conn;
ReturnCommand(cmd,sqlType,strSql,sp);
result=cmd.ExecuteScalar();
CloseDatabase();
return result;
}
}
}

3. SQLite資料庫操作類

SQLite Helper類,基於.net c#的SQLite資料庫操作類SQLite這個精巧的小資料庫,無需安裝軟體,只需要一個System.Data.SQLite.DLL文件即可操作SQLite資料庫。但是據說功能卻非常強大。簡介:SQLite是一個開源資料庫,現在已變得越來越流行,它的體積很小,被廣泛應用於各種不同類型的應用中。SQLite已經是世界上布署得最廣泛的SQL資料庫引擎,被用在無以計數的桌面電腦應用中,還有消費電子設備中,如行動電話、掌上電腦和MP3播放器等。SQLite的源碼就放在公有領域(即WikiPedia的public domain)中。開始使用:Sqliteman,windows下最好的sqlite gui客戶端 sqlite,sqliteman 7.72M

SQLite Administrator 0.8.3.2┊是基於資料庫引擎的管理工具┊漢化綠色特別版 sqlite 1.68M
SQLite,除了access,mysql以外的另外一個輕量級資料庫
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Configuration;
using System.Data;
using System.Data.SQLite;namespace DAL
{
public class Sqlite
{
/// <summary>
/// 獲得連接對象
/// </summary>
/// <returns></returns>
public static SQLiteConnection GetSQLiteConnection()
{
return new SQLiteConnection("Data Source=" + System.Web.HttpContext.Current.Server.MapPath(System.Configuration.ConfigurationManager.AppSettings["db"].ToString()));
} private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] p)
{ if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Parameters.Clear();
cmd.Connection = conn;
cmd.CommandText = cmdText; cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 30; if (p != null)
{
foreach (object parm in p)
cmd.Parameters.AddWithValue(string.Empty, parm);
//for (int i = 0; i < p.Length; i++)
// cmd.Parameters[i].Value = p[i];
}
} public static DataSet ExecuteDataset(string cmdText, params object[] p)
{
DataSet ds = new DataSet();
SQLiteCommand command = new SQLiteCommand();
using (SQLiteConnection connection = GetSQLiteConnection())
{
PrepareCommand(command, connection, cmdText, p);
SQLiteDataAdapter da = new SQLiteDataAdapter(command);
da.Fill(ds);
} return ds;
} public static DataRow ExecuteDataRow(string cmdText, params object[] p)
{
DataSet ds = ExecuteDataset(cmdText, p);
if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
return ds.Tables[0].Rows[0];
return null;
} /// <summary>
/// 返回受影響的行數
/// </summary>
/// <param name="cmdText">a</param>
/// <param name="commandParameters">傳入的參數</param>
/// <returns></returns>
public static int ExecuteNonQuery(string cmdText, params object[] p)
{
SQLiteCommand command = new SQLiteCommand(); using (SQLiteConnection connection = GetSQLiteConnection())
{
PrepareCommand(command, connection, cmdText, p);
return command.ExecuteNonQuery();
}
} /// <summary>
/// 返回SqlDataReader對象
/// </summary>
/// <param name="cmdText"></param>
/// <param name="commandParameters">傳入的參數</param>
/// <returns></returns>
public static SQLiteDataReader ExecuteReader(string cmdText, params object[] p)
{
SQLiteCommand command = new SQLiteCommand();
SQLiteConnection connection = GetSQLiteConnection();
try
{
PrepareCommand(command, connection, cmdText, p);
SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
catch
{
connection.Close();
throw;
}
} /// <summary>
/// 返回結果集中的第一行第一列,忽略其他行或列
/// </summary>
/// <param name="cmdText"></param>
/// <param name="commandParameters">傳入的參數</param>
/// <returns></returns>
public static object ExecuteScalar(string cmdText, params object[] p)
{
SQLiteCommand cmd = new SQLiteCommand(); using (SQLiteConnection connection = GetSQLiteConnection())
{
PrepareCommand(cmd, connection, cmdText, p);
return cmd.ExecuteScalar();
}
} /// <summary>
/// 分頁
/// </summary>
/// <param name="recordCount"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="cmdText"></param>
/// <param name="countText"></param>
/// <param name="p"></param>
/// <returns></returns>
public static DataSet ExecutePager(ref int recordCount, int pageIndex, int pageSize, string cmdText, string countText, params object[] p)
{
if (recordCount < 0)
recordCount = int.Parse(ExecuteScalar(countText, p).ToString()); DataSet ds = new DataSet(); SQLiteCommand command = new SQLiteCommand();
using (SQLiteConnection connection = GetSQLiteConnection())
{
PrepareCommand(command, connection, cmdText, p);
SQLiteDataAdapter da = new SQLiteDataAdapter(command);
da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "result");
}
return ds;
}
}
}
以上是我根據SqlHelper、OledbHelper類修改而來。我已經使用過。但是不確定是否完善,因為我對SQLite接觸時間還不長。歡迎大家批評指正。

4. SQL資料庫的操作

SQL包括了所有對資料庫的操作,主要是由4個部分組成:
1.數據定義:這一部分又稱為「SQL DDL」,定義資料庫的邏輯結構,包括定義資料庫、基本表、視圖和索引4部分。
2.數據操縱:這一部分又稱為「SQL DML」,其中包括數據查詢和數據更新兩大類操作,其中數據更新又包括插入、刪除和更新三種操作。
3.數據控制:對用戶訪問數據的控制有基本表和視圖的授權、完整性規則的描述,事務控制語句等。
4.嵌入式SQL語言的使用規定:規定SQL語句在宿主語言的程序中使用的規則。
下面我們將分別介紹: SQL數據定義功能包括定義資料庫、基本表、索引和視圖。
首先,讓我們了解一下SQL所提供的基本數據類型:(如^00100009b^)
1.資料庫的建立與刪除
(1)建立資料庫:資料庫是一個包括了多個基本表的數據集,其語句格式為:
CREATE DATABASE <資料庫名> 〔其它參數〕
其中,<資料庫名>在系統中必須是唯一的,不能重復,不然將導致數據存取失誤。〔其它參數〕因具體資料庫實現系統不同而異。
例:要建立項目管理資料庫(xmmanage),其語句應為:
CREATE DATABASE xmmanage
(2)資料庫的刪除:將資料庫及其全部內容從系統中刪除。
其語句格式為:DROP DATABASE <資料庫名>
例:刪除項目管理資料庫(xmmanage),其語句應為: DROP DATABASE xmmanage
2.基本表的定義及變更
本身獨立存在的表稱為基本表,在SQL語言中一個關系唯一對應一個基本表。基本表的定義指建立基本關系模式,而變更則是指對資料庫中已存在的基本表進行刪除與修改。 SQL是一種查詢功能很強的語言,只要是資料庫存在的數據,總能通過適當的方法將它從資料庫中查找出來。SQL中的查詢語句只有一個:SELECT,它可與其它語句配合完成所有的查詢功能。SELECT語句的完整語法,可以有6個子句。完整的語法如下:SELECT 目標表的列名或列表達式集合FROM 基本表或(和)視圖集合〔WHERE條件表達式〕〔GROUP BY列名集合〔HAVING組條件表達式〕〕〔ORDER BY列名〔集合〕…〕
簡單查詢,使用TOP子句
查詢結果排序order by
帶條件的查詢where,使用算術表達式,使用邏輯表達式,使用between關鍵字,使用in關鍵字,
模糊查詢like
整個語句的語義如下:從FROM子句中列出的表中,選擇滿足WHERE子句中給出的條件表達式的元組,然後按GROUPBY子句(分組子句)中指定列的值分組,再提取滿足HAVING子句中組條件表達式的那些組,按SELECT子句給出的列名或列表達式求值輸出。ORDER子句(排序子句)是對輸出的目標表進行重新排序,並可附加說明ASC(升序)或DESC(降序)排列。在WHERE子句中的條件表達式F中可出現下列操作符和運算函數:算術比較運算符:<,<=,>,>=,=,<>。邏輯運算符:AND,OR,NOT。集合運算符:UNION(並),INTERSECT(交),EXCEPT(差)。集合成員資格運算符:IN,NOT IN謂詞:EXISTS(存在量詞),ALL,SOME,UNIQUE。聚合函數:AVG(平均值),MIN(最小值),MAX(最大值),SUM(和),COUNT(計數)。F中運算對象還可以是另一個SELECT語句,即SELECT語句可以嵌套。上面只是列出了WHERE子句中可出現的幾種主要操作,由於WHERE子句中的條件表達式可以很復雜,因此SELECT句型能表達的語義遠比其數學原形要復雜得多。下面,我們以上面所建立的三個基本表為例,演示一下SELECT的應用:1.無條件查詢例:找出所有學生的的選課情況SELECT st_no,su_noFROM score例:找出所有學生的情況SELECT*FROM student「*」為通配符,表示查找FROM中所指出關系的所有屬性的值。2.條件查詢條件查詢即帶有WHERE子句的查詢,所要查詢的對象必須滿足WHERE子句給出的條件。例:找出任何一門課成績在70以上的學生情況、課號及分數SELECT UNIQUE student.st_class,student.st_no,student.st_name,student.st_sex,student.st_age,score.su_no,score.scoreFROM student,scoreWHERE score.score>=70 AND score.stno=student,st_no這里使用UNIQUE是不從查詢結果集中去掉重復行,如果使用DISTINCT則會去掉重復行。另外邏輯運算符的優先順序為NOT→AND→OR。例:找出課程號為c02的,考試成績不及格的學生SELECT st_noFROM scoreWHERE su_no=『c02』AND score<603.排序查詢排序查詢是指將查詢結果按指定屬性的升序(ASC)或降序(DESC)排列,由ORDER BY子句指明。例:查找不及格的課程,並將結果按課程號從大到小排列SELECT UNIQUE su_noFROM scoreWHERE score<60ORDER BY su_no DESC4.嵌套查詢嵌套查詢是指WHERE子句中又包含SELECT子句,它用於較復雜的跨多個基本表查詢的情況。例:查找課程編號為c03且課程成績在80分以上的學生的學號、姓名SELECT st_no,st_nameFROM studentWHERE stno IN (SELECT st_noFROM scoreWHERE su_no=『c03』 AND score>80 )這里需要明確的是:當查詢涉及多個基本表時用嵌套查詢逐次求解層次分明,具有結構程序設計特點。在嵌套查詢中,IN是常用到的謂詞。若用戶能確切知道內層查詢返回的是單值,那麼也可用算術比較運算符表示用戶的要求。5.計算查詢計算查詢是指通過系統提供的特定函數(聚合函數)在語句中的直接使用而獲得某些只有經過計算才能得到的結果。常用的函數有:COUNT(*) 計算元組的個數COUNT(列名) 對某一列中的值計算個數SUM(列名) 求某一列值的總和(此列值是數值型)AVG(列名) 求某一列值的平均值(此列值是數值型)MAX(列名) 求某一列值中的最大值MIN(列名) 求某一列值中的最小值例:求男學生的總人數和平均年齡SELECT COUNT(*),AVG(st_age)FROM studentWHERE st_sex=『男』例:統計選修了課程的學生的人數SELECT COUNT(DISTINCT st_no)FROM score注意:這里一定要加入DISTINCT,因為有的學生可能選修了多門課程,但統計時只能按1人統計,所以要使用DISTINCT進行過濾。 由於資料庫管理系統是一個多用戶系統,為了控制用戶對數據的存取權利,保持數據的共享及完全性,SQL語言提供了一系列的數據控制功能。其中,主要包括安全性控制、完整性控制、事務控制和並發控制。1.安全性控制數據的安全性是指保護資料庫,以防非法使用造成數據泄露和破壞。保證數據安全性的主要方法是通過對資料庫存取權力的控制來防止非法使用資料庫中的數據。即限定不同用戶操作不同的數據對象的許可權。存取權控制包括權力的授予、檢查和撤消。權力授予和撤消命令由資料庫管理員或特定應用人員使用。系統在對資料庫操作前,先核實相應用戶是否有權在相應數據上進行所要求的操作。(1)權力授予:權力授有資料庫管理員專用的授權和用戶可用的授權兩種形式。資料庫管理員專用授權命令格式如下:|CONNECT |GRANT|RESOURCE|TO 用戶名〔IDENTIFED BY 口令〕|DBA |其中,CONNECT表示資料庫管理員允許指定的用戶具有連接到資料庫的權力,這種授權是針對新用戶;RESOURCE表示允許用戶建立自己的新關系模式,用戶獲得CONNECT權力後,必須獲得RESOURCE權力才能創建自己的新表;DBA表示資料庫管理員將自己的特權授予指定的用戶。若要同時授予某用戶上述三種授權中的多種權力,則必須通過三個相應的GRANT命令指定。另外,具有CONNECT和RESOURCE授權的用戶可以建立自己的表,並在自己建立的表和視圖上具有查詢、插入、修改和刪除的權力。但通常不能使用其他用戶的關系,除非能獲得其他用戶轉授給他的相應權力。例:若允許用戶SSE連接到資料庫並可以建立他自己的關系,則可通過如下命令授予權力:GRANT CONNECT TO SSE INENTIFIED BY BD1928GRANT RESOURCE TO SSE用戶可用的授權是指用戶將自己擁有的部分或全部權力轉授給其他用戶的命令形式,其命令格式如下:|SELECT ||INSERT ||DELETE |GRANT|UPDATE(列名1[,列名2]…)|ON|表名 |TO|用戶名|〔WITH GRANT OPTION〕|ALTER | |視圖名| |PUBLIC||NDEX ||ALL |若對某一用戶同時授予多種操作權力,則操作命令符號可用「,」相隔。PUBLIC 表示將權力授予資料庫的所有用戶,使用時要注意:任選項WITH GRANT OPTION表示接到授權的用戶,具有將其所得到的同時權力再轉授給其他用戶權力。例:如果將表student的查詢權授予所有用戶,可使用以下命令:GRANT SELECT ON student TO PUBLIC例:若將表subject的插入及修改權力授予用戶SSE並使得他具有將這種權力轉授他人的權力,則可使用以下命令:GRANT INSERT,UPDATE(su_subject) ON subject TO SSE WITH GRANT OPTION這里,UPDATE後面跟su_subject是指出其所能修改的列。(2)權力回收:權力回收是指回收指定用戶原已授予的某些權力。與權力授予命令相匹配,權力回收也有資料庫管理員專用和用戶可用的兩種形式。DBA專用的權力回收命令格式為:|CONNECT |REVOKE|RESOURCE|FROM用戶名|DBA |用戶可用的權力回收命令格式為:|SELECT ||INSERT ||DELETE |REVOKE|UPDATE(列名1〔,列名2〕…) |ON|表名 |FROM |用戶名||ALTER | |視圖名| |PUBLIC||INDEX ||ALL |例:回收用戶SSE的DBA權力:REVOKE DBA FROM SSE2.完整性控制資料庫的完整性是指數據的正確性和相容性,這是資料庫理論中的重要概念。完整性控制的主要目的是防止語義上不正確的數據進入資料庫。關系系統中的完整性約束條件包括實體完整性、參照完整性和用戶定義完整性。而完整性約束條件的定義主要是通過CREATE TABLE語句中的〔CHECK〕子句來完成。另外,還有一些輔助命令可以進行數據完整性保護。如UNIQUE和NOT NULL,前者用於防止重復值進入資料庫,後者用於防止空值。3.事務控制事務是並發控制的基本單位,也是恢復的基本單位。在SQL中支持事務的概念。所謂事務,是用戶定義的一個操作序列(集合),這些操作要麼都做,要麼一個都不做,是一個不可分割的整體。一個事務通常以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK結束。SQL提供了事務提交和事務撤消兩種命令:(1)事務提交:事務提交的命令為:COMMIT 〔WORK〕事務提交標志著對資料庫的某種應用操作成功地完成,所有對資料庫的操作都必須作為事務提交給系統時才有效。事務一經提交就不能撤消。(2)事務撤消:事務撤消的命令是:ROLLBACK 〔WORK〕事務撤消標志著相應事務對資料庫操作失敗,因而要撤消對資料庫的改變,即要「回滾」到相應事務開始時的狀態。當系統非正常結束時(如掉電、系統死機),將自動執行ROLLBACK命令

5. 資料庫操作類的方法該如何設計。

資料庫設計(Database Design)是指對於一個給定的應用環境,構造最優的資料庫模式,建立資料庫及其應用系統,使之能夠有效地存儲數據,滿足各種用戶的應用需求(信息要求和處理要求)。

在資料庫領域內,常常把使用資料庫的各類系統統稱為資料庫應用系統。

一、資料庫和信息系統
(1)資料庫是信息系統的核心和基礎,把信息系統中大量的數據按一定的模型組織起來,提供存儲、維護、檢索數據的
功能,使信息系統可以方便、及時、准確地從資料庫中獲得所需的信息。
(2)資料庫是信息系統的各個部分能否緊密地結合在一起以及如何結合的關鍵所在。
(3)資料庫設計是信息系統開發和建設的重要組成部分。
(4)資料庫設計人員應該具備的技術和知識:
資料庫的基本知識和資料庫設計技術
計算機科學的基礎知識和程序設計的方法和技巧
軟體工程的原理和方法
應用領域的知識

二、資料庫設計的特點
資料庫建設是硬體、軟體和干件的結合
三分技術,七分管理,十二分基礎數據
技術與管理的界面稱之為「干件」
資料庫設計應該與應用系統設計相結合
結構(數據)設計:設計資料庫框架或資料庫結構
行為(處理)設計:設計應用程序、事務處理等
結構和行為分離的設計
傳統的軟體工程忽視對應用中數據語義的分析和抽象,只要有可能就盡量推遲數據結構設計的決策早期的資料庫設計致力於數據模型和建模方法研究,忽視了對行為的設計
如圖:

三、資料庫設計方法簡述
手工試湊法
設計質量與設計人員的經驗和水平有直接關系
缺乏科學理論和工程方法的支持,工程的質量難以保證
資料庫運行一段時間後常常又不同程度地發現各種問題,增加了維護代價
規范設計法
手工設計方
基本思想
過程迭代和逐步求精
規范設計法(續)
典型方法:
(1)新奧爾良(New Orleans)方法:將資料庫設計分為四個階段
S.B.Yao方法:將資料庫設計分為五個步驟
I.R.Palmer方法:把資料庫設計當成一步接一步的過程
(2)計算機輔助設計
ORACLE Designer 2000
SYBASE PowerDesigner

四、資料庫設計的基本步驟
資料庫設計的過程(六個階段)
1.需求分析階段
准確了解與分析用戶需求(包括數據與處理)
是整個設計過程的基礎,是最困難、最耗費時間的一步
2.概念結構設計階段
是整個資料庫設計的關鍵
通過對用戶需求進行綜合、歸納與抽象,形成一個獨立於具體DBMS的概念模型
3.邏輯結構設計階段
將概念結構轉換為某個DBMS所支持的數據模型
對其進行優化
4.資料庫物理設計階段
為邏輯數據模型選取一個最適合應用環境的物理結構(包括存儲結構和存取方法)
5.資料庫實施階段
運用DBMS提供的數據語言、工具及宿主語言,根據邏輯設計和物理設計的結果
建立資料庫,編制與調試應用程序,組織數據入庫,並進行試運行
6.資料庫運行和維護階段
資料庫應用系統經過試運行後即可投入正式運行。
在資料庫系統運行過程中必須不斷地對其進行評價、調整與修改
設計特點:
在設計過程中把資料庫的設計和對資料庫中數據處理的設計緊密結合起來將這兩個方面的需求分析、抽象、設計、實現在各個階段同時進行,相互參照,相互補充,以完善兩方面的設計

設計過程各個階段的設計描述:
如圖:

五、資料庫各級模式的形成過程
1.需求分析階段:綜合各個用戶的應用需求
2.概念設計階段:形成獨立於機器特點,獨立於各個DBMS產品的概念模式(E-R圖)
3.邏輯設計階段:首先將E-R圖轉換成具體的資料庫產品支持的數據模型,如關系模型,形成資料庫邏輯模式;然後根據用戶處理的要求、安全性的考慮,在基本表的基礎上再建立必要的視圖(View),形成數據的外模式
4.物理設計階段:根據DBMS特點和處理的需要,進行物理存儲安排,建立索引,形成資料庫內模式

六、資料庫設計技巧

1. 設計資料庫之前(需求分析階段)
1) 理解客戶需求,詢問用戶如何看待未來需求變化。讓客戶解釋其需求,而且隨著開發的繼續,還要經常詢問客戶保證其需求仍然在開發的目的之中。
2) 了解企業業務可以在以後的開發階段節約大量的時間。
3) 重視輸入輸出。
在定義資料庫表和欄位需求(輸入)時,首先應檢查現有的或者已經設計出的報表、查詢和視圖(輸出)以決定為了支持這些輸出哪些是必要的表和欄位。
舉例:假如客戶需要一個報表按照郵政編碼排序、分段和求和,你要保證其中包括了單獨的郵政編碼欄位而不要把郵政編碼糅進地址欄位里。
4) 創建數據字典和ER 圖表
ER 圖表和數據字典可以讓任何了解資料庫的人都明確如何從資料庫中獲得數據。ER圖對表明表之間關系很有用,而數據字典則說明了每個欄位的用途以及任何可能存在的別名。對SQL 表達式的文檔化來說這是完全必要的。
5) 定義標準的對象命名規范
資料庫各種對象的命名必須規范。

2. 表和欄位的設計(資料庫邏輯設計)
表設計原則
1) 標准化和規范化
數據的標准化有助於消除資料庫中的數據冗餘。標准化有好幾種形式,但Third Normal Form(3NF)通常被認為在性能、擴展性和數據完整性方面達到了最好平衡。簡單來說,遵守3NF 標準的資料庫的表設計原則是:「One Fact in One Place」即某個表只包括其本身基本的屬性,當不是它們本身所具有的屬性時需進行分解。表之間的關系通過外鍵相連接。它具有以下特點:有一組表專門存放通過鍵連接起來的關聯數據。
舉例:某個存放客戶及其有關定單的3NF 資料庫就可能有兩個表:Customer 和Order。Order 表不包含定單關聯客戶的任何信息,但表內會存放一個鍵值,該鍵指向Customer 表裡包含該客戶信息的那一行。
事實上,為了效率的緣故,對表不進行標准化有時也是必要的。
2) 數據驅動
採用數據驅動而非硬編碼的方式,許多策略變更和維護都會方便得多,大大增強系統的靈活性和擴展性。
舉例,假如用戶界面要訪問外部數據源(文件、XML 文檔、其他資料庫等),不妨把相應的連接和路徑信息存儲在用戶界面支持表裡。還有,如果用戶界面執行工作流之類的任務(發送郵件、列印信箋、修改記錄狀態等),那麼產生工作流的數據也可以存放在資料庫里。角色許可權管理也可以通過數據驅動來完成。事實上,如果過程是數據驅動的,你就可以把相當大的責任推給用戶,由用戶來維護自己的工作流過程。
3) 考慮各種變化
在設計資料庫的時候考慮到哪些數據欄位將來可能會發生變更。
舉例,姓氏就是如此(注意是西方人的姓氏,比如女性結婚後從夫姓等)。所以,在建立系統存儲客戶信息時,在單獨的一個數據表裡存儲姓氏欄位,而且還附加起始日和終止日等欄位,這樣就可以跟蹤這一數據條目的變化。

欄位設計原則
4) 每個表中都應該添加的3 個有用的欄位
dRecordCreationDate,在VB 下默認是Now(),而在SQL Server • 下默認為GETDATE()
sRecordCreator,在SQL Server 下默認為NOT NULL DEFAULT • USER
nRecordVersion,記錄的版本標記;有助於准確說明記錄中出現null 數據或者丟失數據的原因 •
5) 對地址和電話採用多個欄位
描述街道地址就短短一行記錄是不夠的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的靈活性。還有,電話號碼和郵件地址最好擁有自己的數據表,其間具有自身的類型和標記類別。
6) 使用角色實體定義屬於某類別的列
在需要對屬於特定類別或者具有特定角色的事物做定義時,可以用角色實體來創建特定的時間關聯關系,從而可以實現自我文檔化。
舉例:用PERSON 實體和PERSON_TYPE 實體來描述人員。比方說,當John Smith, Engineer 提升為John Smith, Director 乃至最後爬到John Smith, CIO 的高位,而所有你要做的不過是改變兩個表PERSON 和PERSON_TYPE 之間關系的鍵值,同時增加一個日期/時間欄位來知道變化是何時發生的。這樣,你的PERSON_TYPE 表就包含了所有PERSON 的可能類型,比如Associate、Engineer、Director、CIO 或者CEO 等。還有個替代辦法就是改變PERSON 記錄來反映新頭銜的變化,不過這樣一來在時間上無法跟蹤個人所處位置的具體時間。
7) 選擇數字類型和文本類型盡量充足
在SQL 中使用smallint 和tinyint 類型要特別小心。比如,假如想看看月銷售總額,總額欄位類型是smallint,那麼,如果總額超過了$32,767 就不能進行計算操作了。
而ID 類型的文本欄位,比如客戶ID 或定單號等等都應該設置得比一般想像更大。假設客戶ID 為10 位數長。那你應該把資料庫表欄位的長度設為12 或者13 個字元長。但這額外占據的空間卻無需將來重構整個資料庫就可以實現資料庫規模的增長了。
8) 增加刪除標記欄位
在表中包含一個「刪除標記」欄位,這樣就可以把行標記為刪除。在關系資料庫里不要單獨刪除某一行;最好採用清除數據程序而且要仔細維護索引整體性。

3. 選擇鍵和索引(資料庫邏輯設計)
鍵選擇原則:
1) 鍵設計4 原則
為關聯欄位創建外鍵。 •
所有的鍵都必須唯一。 •
避免使用復合鍵。 •
外鍵總是關聯唯一的鍵欄位。 •
2) 使用系統生成的主鍵
設計資料庫的時候採用系統生成的鍵作為主鍵,那麼實際控制了資料庫的索引完整性。這樣,資料庫和非人工機制就有效地控制了對存儲數據中每一行的訪問。採用系統生成鍵作為主鍵還有一個優點:當擁有一致的鍵結構時,找到邏輯缺陷很容易。
3) 不要用用戶的鍵(不讓主鍵具有可更新性)
在確定採用什麼欄位作為表的鍵的時候,可一定要小心用戶將要編輯的欄位。通常的情況下不要選擇用戶可編輯的欄位作為鍵。
4) 可選鍵有時可做主鍵
把可選鍵進一步用做主鍵,可以擁有建立強大索引的能力。

索引使用原則:
索引是從資料庫中獲取數據的最高效方式之一。95%的資料庫性能問題都可以採用索引技術得到解決。
1) 邏輯主鍵使用唯一的成組索引,對系統鍵(作為存儲過程)採用唯一的非成組索引,對任何外鍵列採用非成組索引。考慮資料庫的空間有多大,表如何進行訪問,還有這些訪問是否主要用作讀寫。
2) 大多數資料庫都索引自動創建的主鍵欄位,但是可別忘了索引外鍵,它們也是經常使用的鍵,比如運行查詢顯示主表和所有關聯表的某條記錄就用得上。
3) 不要索引memo/note 欄位,不要索引大型欄位(有很多字元),這樣作會讓索引佔用太多的存儲空間。
4) 不要索引常用的小型表
不要為小型數據表設置任何鍵,假如它們經常有插入和刪除操作就更別這樣作了。對這些插入和刪除操作的索引維護可能比掃描表空間消耗更多的時間。

4. 數據完整性設計(資料庫邏輯設計)
1) 完整性實現機制:
實體完整性:主鍵
參照完整性:
父表中刪除數據:級聯刪除;受限刪除;置空值
父表中插入數據:受限插入;遞歸插入
父表中更新數據:級聯更新;受限更新;置空值
DBMS對參照完整性可以有兩種方法實現:外鍵實現機制(約束規則)和觸發器實現機制
用戶定義完整性:
NOT NULL;CHECK;觸發器
2) 用約束而非商務規則強制數據完整性
採用資料庫系統實現數據的完整性。這不但包括通過標准化實現的完整性而且還包括數據的功能性。在寫數據的時候還可以增加觸發器來保證數據的正確性。不要依賴於商務層保證數據完整性;它不能保證表之間(外鍵)的完整性所以不能強加於其他完整性規則之上。
3) 強制指示完整性
在有害數據進入資料庫之前將其剔除。激活資料庫系統的指示完整性特性。這樣可以保持數據的清潔而能迫使開發人員投入更多的時間處理錯誤條件。
4) 使用查找控制數據完整性
控制數據完整性的最佳方式就是限制用戶的選擇。只要有可能都應該提供給用戶一個清晰的價值列表供其選擇。這樣將減少鍵入代碼的錯誤和誤解同時提供數據的一致性。某些公共數據特別適合查找:國家代碼、狀態代碼等。
5) 採用視圖
為了在資料庫和應用程序代碼之間提供另一層抽象,可以為應用程序建立專門的視圖而不必非要應用程序直接訪問數據表。這樣做還等於在處理資料庫變更時給你提供了更多的自由。

5. 其他設計技巧
1) 避免使用觸發器
觸發器的功能通常可以用其他方式實現。在調試程序時觸發器可能成為干擾。假如你確實需要採用觸發器,你最好集中對它文檔化。
2) 使用常用英語(或者其他任何語言)而不要使用編碼
在創建下拉菜單、列表、報表時最好按照英語名排序。假如需要編碼,可以在編碼旁附上用戶知道的英語。
3) 保存常用信息
讓一個表專門存放一般資料庫信息非常有用。在這個表裡存放資料庫當前版本、最近檢查/修復(對Access)、關聯設計文檔的名稱、客戶等信息。這樣可以實現一種簡單機制跟蹤資料庫,當客戶抱怨他們的資料庫沒有達到希望的要求而與你聯系時,這樣做對非客戶機/伺服器環境特別有用。
4) 包含版本機制
在資料庫中引入版本控制機制來確定使用中的資料庫的版本。時間一長,用戶的需求總是會改變的。最終可能會要求修改資料庫結構。把版本信息直接存放到資料庫中更為方便。
5) 編制文檔
對所有的快捷方式、命名規范、限制和函數都要編制文檔。
採用給表、列、觸發器等加註釋的資料庫工具。對開發、支持和跟蹤修改非常有用。
對資料庫文檔化,或者在資料庫自身的內部或者單獨建立文檔。這樣,當過了一年多時間後再回過頭來做第2 個版本,犯錯的機會將大大減少。
6) 測試、測試、反復測試
建立或者修訂資料庫之後,必須用用戶新輸入的數據測試數據欄位。最重要的是,讓用戶進行測試並且同用戶一道保證選擇的數據類型滿足商業要求。測試需要在把新資料庫投入實際服務之前完成。
7) 檢查設計
在開發期間檢查資料庫設計的常用技術是通過其所支持的應用程序原型檢查資料庫。換句話說,針對每一種最終表達數據的原型應用,保證你檢查了數據模型並且查看如何取出數據。

6. SQL的基本操作

1、說明:創建資料庫

CREATE DATABASE database-name

2、說明:刪除資料庫

drop database dbname

3、說明:備份sql server

--- 創建 備份數據的 device

USE master

EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'

--- 開始 備份

BACKUP DATABASE pubs TO testBack

4、說明:創建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

根據已有的表創建新表:

A:create table tab_new like tab_old (使用舊表創建新表)

B:create table tab_new as select col1,col2… from tab_old definition only

5、說明:

刪除新表:drop table tabname

6、說明:

增加一個列:Alter table tabname add column col type

註:列增加後將不能刪除。DB2中列加上後數據類型也不能改變,唯一能改變的是增加varchar類型的長度。

7、說明:

添加主鍵:Alter table tabname add primary key(col)

說明:

刪除主鍵:Alter table tabname drop primary key(col)

8、說明:

創建索引:create [unique] index idxname on tabname(col….)

刪除索引:drop index idxname

註:索引是不可更改的,想更改必須刪除重新建。

9、說明:

創建視圖:create view viewname as select statement

刪除視圖:drop view viewname

10、說明:幾個簡單的基本的sql語句

選擇:select * from table1 where 范圍

插入:insert into table1(field1,field2) values(value1,value2)

刪除:delete from table1 where 范圍

更新:update table1 set field1=value1 where 范圍

查找:select * from table1 where field1 like 』%value1%』 ---like的語法很精妙,查資料!

排序:select * from table1 order by field1,field2 [desc]

總數:select count * as totalcount from table1

求和:select sum(field1) as sumvalue from table1

平均:select avg(field1) as avgvalue from table1

最大:select max(field1) as maxvalue from table1

最小:select min(field1) as minvalue from table1

11、說明:幾個高級查詢運算詞

A: UNION 運算符

UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重復行而派生出一個結果表。當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。

B: EXCEPT 運算符

EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重復行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重復行。

C: INTERSECT 運算符

INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重復行而派生出一個結果表。當 ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重復行。

註:使用運算詞的幾個查詢結果行必須是一致的。

12、說明:使用外連接

A、left outer join:

左外連接(左連接):結果集幾包括連接表的匹配行,也包括左連接表的所有行。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

B:right outer join:

右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。

C:full outer join:

全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。

其次,大家來看一些不錯的sql語句

1、說明:復製表(只復制結構,源表名:a 新表名:b) (Access可用)

法一:select * into b from a where 1<>1

法二:select top 0 * into b from a

2、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)

insert into b(a, b, c) select d,e,f from b;

3、說明:跨資料庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)

insert into b(a, b, c) select d,e,f from b in 『具體資料庫』 where 條件

例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、說明:子查詢(表名1:a 表名2:b)

select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、說明:顯示文章、提交人和最後回復時間

select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、說明:外連接查詢(表名1:a 表名2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、說明:在線視圖查詢(表名1:a )

select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、說明:between的用法,between限制查詢數據范圍時包括了邊界值,not between不包括

select * from table1 where time between time1 and time2

select a,b,c, from table1 where a not between 數值1 and 數值2

9、說明:in 的使用方法

select * from table1 where a [not] in (『值1』,』值2』,』值4』,』值6』)

10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息

delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、說明:四表聯查問題:

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、說明:日程安排提前五分鍾提醒

SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5

13、說明:一條sql 語句搞定資料庫分頁

select top 10 b.* from (select top 20 主鍵欄位,排序欄位 from 表名 order by 排序欄位 desc) a,表名 b where b.主鍵欄位 = a.主鍵欄位 order by a.排序欄位

14、說明:前10條記錄

select top 10 * form table1 where 范圍

15、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)

select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重復行而派生出一個結果表

(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、說明:隨機取出10條數據

select top 10 * from tablename order by newid()

18、說明:隨機選擇記錄

select newid()

19、說明:刪除重復記錄

Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

20、說明:列出資料庫里所有的表名

select name from sysobjects where type='U'

21、說明:列出表裡的所有的

select name from syscolumns where id=object_id('TableName')

22、說明:列示type、vender、pcs欄位,以type欄位排列,case可以方便地實現多重選擇,類似select 中的case。

select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type

顯示結果:

type vender pcs

電腦 A 1

電腦 A 1

光碟 B 2

光碟 A 2

手機 B 3

手機 C 3

23、說明:初始化表table1

TRUNCATE TABLE table1

24、說明:選擇從10到15的記錄

select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc

隨機選擇資料庫記錄的方法(使用Randomize函數,通過SQL語句實現)

對存儲在資料庫中的數據來說,隨機數特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP「找個隨機數」然後列印出來。實際上常見的解決方案是建立如下所示的循環:

Randomize

RNumber = Int(Rnd*499) +1

While Not objRec.EOF

If objRec("ID") = RNumber THEN

... 這里是執行腳本 ...

end if

objRec.MoveNext

Wend

這很容易理解。首先,你取出1到500范圍之內的一個隨機數(假設500就是資料庫內記錄的總數)。然後,你遍歷每一記錄來測試ID 的值、檢查其是否匹配RNumber。滿足條件的話就執行由THEN 關鍵字開始的那一塊代碼。假如你的RNumber 等於495,那麼要循環一遍資料庫花的時間可就長了。雖然500這個數字看起來大了些,但相比更為穩固的企業解決方案這還是個小型資料庫了,後者通常在一個資料庫內就包含了成千上萬條記錄。這時候不就死定了?

採用SQL,你就可以很快地找出准確的記錄並且打開一個只包含該記錄的recordset,如下所示:

Randomize

RNumber = Int(Rnd*499) + 1

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber

set objRec = ObjConn.Execute(SQL)

Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")

不必寫出RNumber 和ID,你只需要檢查匹配情況即可。只要你對以上代碼的工作滿意,你自可按需操作「隨機」記錄。Recordset沒有包含其他內容,因此你很快就能找到你需要的記錄這樣就大大降低了處理時間。

再談隨機數

現在你下定決心要榨乾Random 函數的最後一滴油,那麼你可能會一次取出多條隨機記錄或者想採用一定隨機范圍內的記錄。把上面的標准Random 示例擴展一下就可以用SQL應對上面兩種情況了。

為了取出幾條隨機選擇的記錄並存放在同一recordset內,你可以存儲三個隨機數,然後查詢資料庫獲得匹配這些數字的記錄:

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3

假如你想選出10條記錄(也許是每次頁面裝載時的10條鏈接的列表),你可以用BETWEEN 或者數學等式選出第一條記錄和適當數量的遞增記錄。這一操作可以通過好幾種方式來完成,但是 SELECT 語句只顯示一種可能(這里的ID 是自動生成的號碼):

SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

注意:以上代碼的執行目的不是檢查資料庫內是否有9條並發記錄。

隨機讀取若干條記錄,測試過

Access語法:SELECT top 10 * From 表名 ORDER BY Rnd(id)

Sql server:select top n * from 表名 order by newid()

mysql select * From 表名 Order By rand() Limit n

Access左連接語法(最近開發要用左連接,Access幫助什麼都沒有,網上沒有Access的SQL說明,只有自己測試, 現在記下以備後查)

語法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...

使用SQL語句 用...代替過長的字元串顯示

語法:

SQL資料庫:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename

Access資料庫:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;

Conn.Execute說明

Execute方法

該方法用於執行SQL語句。根據SQL語句執行後是否返回記錄集,該方法的使用格式分為以下兩種:

1.執行SQL查詢語句時,將返回查詢得到的記錄集。用法為:

Set 對象變數名=連接對象.Execute("SQL 查詢語言")

Execute方法調用後,會自動創建記錄集對象,並將查詢結果存儲在該記錄對象中,通過Set方法,將記錄集賦給指定的對象保存,以後對象變數就代表了該記錄集對象。

2.執行SQL的操作性語言時,沒有記錄集的返回。此時用法為:

連接對象.Execute "SQL 操作性語句" [, RecordAffected][, Option]

•RecordAffected 為可選項,此出可放置一個變數,SQL語句執行後,所生效的記錄數會自動保存到該變數中。通過訪問該變數,就可知道SQL語句隊多少條記錄進行了操作。

•Option 可選項,該參數的取值通常為adCMDText,它用於告訴ADO,應該將Execute方法之後的第一個字元解釋為命令文本。通過指定該參數,可使執行更高效。

•BeginTrans、RollbackTrans、CommitTrans方法

這三個方法是連接對象提供的用於事務處理的方法。BeginTrans用於開始一個事物;RollbackTrans用於回滾事務;CommitTrans用於提交所有的事務處理結果,即確認事務的處理。

事務處理可以將一組操作視為一個整體,只有全部語句都成功執行後,事務處理才算成功;若其中有一個語句執行失敗,則整個處理就算失敗,並恢復到處里前的狀態。

BeginTrans和CommitTrans用於標記事務的開始和結束,在這兩個之間的語句,就是作為事務處理的語句。判斷事務處理是否成功,可通過連接對象的Error集合來實現,若Error集合的成員個數不為0,則說明有錯誤發生,事務處理失敗。Error集合中的每一個Error對象,代表一個錯誤信息。

資料引用:http://www.knowsky.com/398670.html

7. java自寫類調用SQL類

你寫個方法,不要寫在構造方法裡面,然後在自己定義的類裡面調用該對象的方法就行了啊。

8. 什麼是資料庫操作類

資料庫操作類是自己寫的一個類,主要功能是對資料庫進行增刪查改。
在其他地方調用這個類中的增刪查改方法即可以操作資料庫。

9. sqlserver怎麼操作自定義表類型

-- ================================
-- 創建和使用自定義表類型
-- ================================
USE master
GO
-- ================================
-- 創建測試資料庫
-- ================================
CREATE DATABASE demo
GO
-- ================================
-- 創建一個表
-- ================================
USE demo
GO
CREATE TABLE Customers
(
Id int NOT NULL,
Name char(10) NULL,
PRIMARY KEY (Id)
)
GO
USE demo
GO
-- ================================
-- 創建自定義表類型
-- ================================
CREATE TYPE dbo.CustomerTable AS TABLE
(
Id int NOT NULL,
Name char(10) NULL,
PRIMARY KEY (Id)
)
GO
-- =================================
-- 直接使用自定義表類型
-- =================================
DECLARE @c CustomerTable
INSERT INTO @c VALUES(1,'Xizhang')
SELECT * FROM @c
-- =================================
-- 在存儲過程中使用自定義表類型
-- =================================
CREATE PROC GetCustomers
(@c CustomerTable READONLY)
AS
INSERT Customers SELECT * FROM @c --將傳過來的參數(其實是一個表)的數據插入到Customers表裡面去
-- =================================
-- 調用該存儲過程,一次性插入4行數據
-- =================================
DECLARE @temp CustomerTable
INSERT INTO @temp VALUES(7,'Xizhang')
INSERT INTO @temp VALUES(2,'Xizhang')
INSERT INTO @temp VALUES(3,'Xizhang')
INSERT INTO @temp VALUES(4,'Xizhang')
EXEC GetCustomers @c=@temp
SELECT * FROM Customers
-- =================================
-- 清理資料庫
-- =================================
USE master
GO
DROP DATABASE demo
GO
看起來不錯對吧,但是你應該馬上想到一個問題,如果說這個存儲過程要在客戶端代碼中調用,那麼該怎麼提供這個參數值呢?
using System.Data.SqlClient;
using System.Data;
class Program
{
static void Main(string[] args)
{
DataTable tb = GetData();
using (SqlConnection conn = new SqlConnection("server=sql2008;database=demo;integrated security=true"))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "GetCustomers";
cmd.CommandType = CommandType.StoredProcere;
SqlParameter param = new SqlParameter("@c", SqlDbType.Structured);//這個類型很關鍵
param.Value = tb;
cmd.Parameters.Add(param);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
}
Console.WriteLine("完成操作");
Console.Read();
}
private static DataTable GetData()
{
DataTable tb = new DataTable();
tb.Columns.Add("Id",typeof(int));
tb.Columns.Add("Name", typeof(string));
//添加100個客戶資料
for (int i = 0; i < 100; i++)
{
DataRow row = tb.NewRow();
row[0] = i;
row[1] = "Name " + i.ToString();
tb.Rows.Add(row);
}
return tb;
}
}

10. sql數據類型有哪些

SQL數據類型有以下這些:

1、二進制數據類型。

二進制數據包括 Binary、Varbinary 和 Image

Binary 數據類型既可以是固定長度的(Binary),也可以是變長度的。

Binary[(n)] 是 n 位固定的二進制數據。其中,n 的取值范圍是從 1 到 8000。其存儲空間的大小是 n + 4 個位元組。

Varbinary[(n)] 是 n 位變長度的二進制數據。其中,n 的取值范圍是從 1 到 8000。其存儲空間的大小是 n + 4個位元組,不是n 個位元組。

2、字元數據類型。

字元數據類型包括char、varchar和text。

字元數據是由字母、符號和數字的任意組合組成的數據。

varchar是可變長度字元數據,其長度不超過8kb。char是最大長度為8kb的固定長度字元數據。超過8kb的ASCII數據可以使用文本數據類型存儲。

3、Unicode 數據類型。

Unicode數據類型包括nchar、nvarchar和ntext。

在Microsoft SQL Server中,傳統的非Unicode數據類型允許使用由特定字元集定義的字元。在安裝SQL Server期間,允許選擇字元集。

在Unicode標准中,包含由各種字元集定義的所有字元。使用Unicode數據類型佔用的空間是使用非Unicode數據類型的兩倍。

4、日期和時間數據類型。

日期和時間數據類型包括 Datetime 和 Smalldatetime兩種類型。

日期和時間數據類型由有效的日期和時間組成。

例如,有效的日期和時間數據包括「4/01/98 12:15:00:00:00 PM」和「1:28:29:15:01AM 8/17/98」。

前一個數據類型是日期在前,時間在後。後一個數據類型是時間在前,日期在後。

在 Microsoft SQL Server中,日期和時間數據類型包括Datetime 和 Smalldatetime 兩種類型時,所存儲的日期范圍是從 1753 年 1 月 1 日開始,到9999 年12 月 31 日結束(每一個值要求 8 個存儲位元組)。

5、數字數據類型。

數字數據只包含數字。數字數據類型包括正數和負數、小數(浮點)和整數。

整數由正整數和負整數組成,如39、25、0-2和33967。在Microsoft SQL Server中,存儲在整數中的數據類型是int、smallint和tinyint。

int數據類型存儲的數據多於smallint數據類型,而smallint數據類型存儲的數據多於tinyint數據類型。

使用int數據類型存儲數據的范圍從-2 147 483 648到2 147 483 647(每個值需要四個位元組的存儲空間)。

6、貨幣數據類型。

在 Microsoft SQL Server 中,貨幣數據的數據類型是Money 和 Smallmoney

Money數據類型要求 8 個存儲位元組,Smallmoney 數據類型要求 4 個存儲位元組。