1. 程式人生 > 實用技巧 >資料庫基本語句

資料庫基本語句

請問什麼是資料庫事物

參考回答:

資料庫事務是資料庫管理系統執行過程中的一個邏輯單位,由一個有限的資料庫操作序列構成。一個數據庫事務通常包含了一個序列的對資料庫的讀/寫操作。它的存在包含有以下兩個目的:

1.為資料庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使在異常狀態下仍能保持一致性的方法。

2.當多個應用程式在併發訪問資料庫時,可以在這些應用程式之間提供一個隔離方法,以防止彼此的操作互相干擾。

當事務被提交給了DBMS(資料庫管理系統),則DBMS(資料庫管理系統)需要確保該事務中的所有操作都成功完成且其結果被永久儲存在資料庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要被回滾,回到事務執行前的狀態;同時,該事務對資料庫或者其他事務的執行無影響,所有的事務都好像在獨立的執行。

資料庫事務擁有以下四個特性,被稱之為ACID特性:

原子性(Atomicity):事務作為一個整體被執行,包含在其中的對資料庫的操作要麼全部被執行,要麼都不執行。

一致性(Consistency):事務應確保資料庫的狀態從一個一致狀態轉變為另一個一致狀態。一致狀態的含義是資料庫中的資料應滿足完整性約束。

隔離性(Isolation):多個事務併發執行時,一個事務的執行不應影響其他事務的執行。

永續性(Durability):已被提交的事務對資料庫的修改應該永久儲存在資料庫中。

● 請你說一下資料庫連線洩露的含義

參考回答:

資料庫連線洩露指的是如果在某次使用或者某段程式中沒有正確地關閉Connection、Statement和ResultSet資源,那麼每次執行都會留下一些沒有關閉的連線,這些連線失去了引用而不能得到重新使用,因此就造成了資料庫連線的洩漏。資料庫連線的資源是寶貴而且是有限的,如果在某段使用頻率很高的程式碼中出現這種洩漏,那麼資料庫連線資源將被耗盡,影響系統的正常運轉。

● 請你寫一下mysql刪除語句

參考回答:

1.drop語句。可以用來刪除資料庫和表。

用drop語句來刪除資料庫:drop database db;

用drop語句來刪除表:drop table tb;

2.delete語句。用來刪除表中的欄位。

delete from tb where id=1;

如果delete語句中沒有加入where就會把表中的所有記錄全部刪除:

3.用truncate來刪除表中的所有欄位:

truncate table tb;

● 請你說一下資料庫mysql中CHAR和VCHAR的區別

參考回答:

1、char(n)型別

char型別是定長的型別,即當定義的是char(10),輸入的是"abc"這三個字元時,它們佔的空間一樣是10個位元組,包括7個空位元組。當輸入的字元長度超過指定的數時,char會擷取超出的字元。而且,當儲存char值時,MySQL是自動刪除輸入字串末尾的空格。 char是適合儲存很短的、一般固定長度的字串。例如,char非常適合儲存密碼的MD5值,因為這是一個定長的值。對於非常短的列,char比varchar在儲存空間上也更有效率。取資料的時候,char型別的要用trim()去掉多餘的空格,而varchar是不需要。

2、varchar(n)型別

varchar(n)型別用於儲存可變長的,長度為n個位元組的可變長度且非Unicode的字元資料。n必須是介於1和8000之間的數值,儲存大小為輸入資料的位元組的實際長度+1/2. 比如varchar(10), 然後輸入abc三個字元,那麼實際儲存大小為3個位元組。除此之外,varchar還需要使用1或2個額外位元組記錄字串的長度,如果列的最大長度小於等於255位元組(是定義的最長長度,不是實際長度),則使用1個位元組表示長度,否則使用2個位元組來表示。取資料的時候,不需要去掉多餘的空格。

● 請你寫兩個sql語句,統計XX人數、選出課程編號不為XX的學生學號

參考回答:

select sClass 班級,count(*) 班級學生總人數,

SELECT 學號,

FROM S

WHERE NOT EXISTS (SELECT *

FROM SC

WHERE SC.課程號 = 'XX'

AND S.學號 = SC.學號);

● 請你說一下SQL左連線以及使用場景

參考回答:

left join(左連線) 返回包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。

使用場景:可以保持左表完整加入另一表中的資料。

● 請你寫一下SQL查詢、更新的某一列語句

參考回答:

SELECT 要查詢的資料型別 FROM 表名 WHERE 條件

UPDATE 表名 SET 列名=更新的值 WHERE 條件

● 請你寫一下SQL語句的多表查詢

參考回答:

例如:按照department_id 查詢 employees(員工表)和 departments(部門表) 的資訊。 SELECT ... FROM ... WHERE SELECT e.last_name,e.department_id,d.department_name FROM employees e,departments d where e.department_id = d.department_id

● 請你說說redis

參考回答:

redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set --有序集合)和hash(雜湊型別)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是快取在記憶體中。區別的是redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。

● 請你寫一些基本的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

● 某個表格中有10條一模一樣的資料,現在要刪掉其中的9條,請你寫一下sql語句

參考回答:

1 delete * from table_name limit9

● 某個表格存著s_name subject score 三個欄位,比如某一行是 張三 數學 76,現在要選取出所有科目成績都大於80分的學生名字,請寫出sql語句

參考回答:

1 select s_name from table_name where s_name not in (select s_name from table_name where score <80)

● 請你說一說資料庫中的聚類查詢

參考回答:

聚集索引中鍵值的邏輯順序決定了表中相應行的物理順序。聚集索引確定表中資料的物理順序。聚集索引類似於電話簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。聚集索引對於那些經常要搜尋範圍值的列特別有效。使用聚集索引找到包含第一個值的行後,便可以確保包含後續索引值的行在物理相鄰。例如,如果應用程式執行的一個查詢經常檢索某一日期範圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。這樣有助於提高此類查詢的效能。同樣,如果對從表中檢索的資料進行排序時經常要用到某一列,則可以將該表在該列上聚集(物理排序),避免每次查詢該列時都進行排序,從而節省成本。當索引值唯一時,使用聚集索引查詢特定的行也很有效率。例如,使用唯一僱員ID 列 emp_id 查詢特定僱員的最快速的方法,是在 emp_id 列上建立聚集索引或 PRIMARY KEY 約束。

如果不建立索引,系統會自動建立一個隱含列作為表的聚集索引。

1.建立表的時候指定主鍵(注意:SQL Sever預設主鍵為聚集索引,也可以指定為非聚集索引,而MySQL裡主鍵就是聚集索引)

create table t1(
id int primary key,
name nvarchar(255)
)

2.建立表後新增聚集索引

1 2 3 4 SQL Server: create clustered index clustered_index on table_name(colum_name) MySQL: alter table table_name add primary key(colum_name)

● 請問如果mysql中使用者密碼丟了怎麼辦,建一個數據庫表,授權命令是什麼

參考回答:

對於普通使用者的密碼丟失,直接用root超級管理員登入修改密碼即可

若是root密碼丟失,可通過mysqlld_saft方式找回

1、停止mysql:service mysqld stop

2、安全模式啟動:mysql_safe-skip-grant-tables&

3、無密碼回車鍵登入:mysql –uroot –p;

4、重置密碼:use mysql update user set password=password(“)where user=’root’ and host=’localhost’;flush privileges

5、正常啟動:service mysql restart

6、再使用mysqladmin:mysqladmin password ‘123456’

Mysql建立資料庫

Create database demodb default character set utf8 collate utf8_general_ci;

授權

Grant all privileges on demodb. * [使用者名稱稱]@’%’

立即啟動修改

Flush privileges

● 寫出sql語句:資料庫統計總成績取前十名的學生

參考回答:

1 2 3 4 SELECT*FROM( selectT.*,ROW_NUMBER()OVER(PARTITIONBY班級orderby成績desc)RN FROMT )WHERERN<=10

● 請你說一下資料庫事務、主鍵與外來鍵的區別?

參考回答:

資料庫的事務:事務即使用者定義的一個數據庫操作序列,這些操作要麼全做要全不做,是一個不可分割的工作單位,它具有四個特性,ACID,原子性,一致性,隔離性,持續性

主鍵和外來鍵的區別:
1.主鍵是能確定一條記錄的唯一標識,比如,一條記錄包括身份正號,姓名,年齡。

身份證號是唯一能確定你這個人的,其他都可能有重複,所以,身份證號是主鍵。
2.外來鍵用於與另一張表的關聯。是能確定另一張表記錄的欄位,用於保持資料的一致性。

● 請問對快取技術瞭解嗎

參考回答:

Redis可以實現快取機制,Redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、 list(連結串列)、set(集合)和zset(有序集合)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是快取在記憶體中。區別的是redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步,當前 Redis的應用已經非常廣泛,國內像新浪、淘寶,國外像Flickr、Github等均在使用Redis的快取服務。

Redis工作方式分析

Redis作為一個高效能的key-value資料庫具有以下特徵:

1、多樣的資料模型

2、持久化

3、主從同步

Redis支援豐富的資料型別,最為常用的資料型別主要由五種:String、Hash、List、Set和SortedSet。Redis通常將資料儲存於記憶體中,或被配置為使用虛擬記憶體。Redis有一個很重要的特點就是它可以實現持久化資料,通過兩種方式可以實現資料持久化:使用RDB快照的方式,將記憶體中的資料不斷寫入磁碟;或使用類似MySQL的AOF日誌方式,記錄每次更新的日誌。前者效能較高,但是可能會引起一定程度的資料丟失;後者相反。 Redis支援將資料同步到多臺從資料庫上,這種特性對提高讀取效能非常有益。

● 請問count和sum的區別,以及count(*)和count(列名)的區別

參考回答:

Count和sum區別:求和用累加sum(),求行的個數用累計count

Count(*)包括了所有的列,在統計結果的時候不會忽略列值為null

Count(列名)只包括列名那一項,會忽略列值為空的計數

● 請問你資料庫是用的MySQL嗎?平常資料庫的語句都是怎麼寫的? join作用,想刪除一行怎麼做

參考回答:

Mysql和oracle都用過,mysql為主,join作用是連線兩個表,假設有2個表——Student表和SC表(選課表):

內連線(自然連線):當使用內連線時,如果Student中某些學生沒有選課,則在SC中沒有相應元組。最終查詢結果捨棄了這些學生的資訊

外連線:如果想以Student表為主體列出每個學生的基本情況及其選課情況。即使某個學生沒有選課,依然在查詢結果中顯示(SC表的屬性上填空值)。就需要使用外連線

例子:

//內連線:查詢每個學生及其選修課程的情況(沒選課的學生不會列出)

1 2 3 SELECT Student.*, SC.* FROM Student , SC WHERE Student.Sno=SC.Sno;

//外連線:查詢每個學生及其選修課程的情況(沒選課的學生也會列出)

1 2 SELECT Student.*, SC.* FROM Student LEFT JOIN SC ON(Student.Sno=SC.Sno);

● 請問如何對資料庫作優化

參考回答:

1、調整資料結構的設計,對於經常訪問的資料庫表建立索引

2、調整SQL語句, ORACLE公司推薦使用ORACLE語句優化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調整優化SQL語句。

3、調整伺服器記憶體分配。記憶體分配是在資訊系統執行過程中優化配置的,資料庫管理員可以根據資料庫執行狀況調整資料庫系統全域性區(SGA區)的資料緩衝區、日誌緩衝區和共享池的大小;還可以調整程式全域性區(PGA區)的大小。

4、調整硬碟I/O,DBA可以將組成同一個表空間的資料檔案放在不同的硬碟上,做到硬碟之間I/O負載均衡。

● 請問什麼是幻讀

參考回答:

髒讀就是指當一個事務正在訪問資料,並且對資料進行了修改,但是還沒有來得及提交到資料庫中,這時,另一個事務也訪問這個資料,然後使用了這個資料

● 請你說一下MyBatis有什麼優勢,他如何做事務管理

參考回答:

MyBatis優點:

1.易於上手和掌握

2. sql寫在xml裡,便於統一管理和優化。

3. 解除sql與程式程式碼的耦合。

4. 提供對映標籤,支援物件與資料庫的orm欄位關係對映

5. 提供物件關係對映標籤,支援物件關係組建維護

6. 提供xml標籤,支援編寫動態sql。

Mybatis管理事務是分為兩種方式:

(1)使用JDBC的事務管理機制,就是利用java.sql.Connection物件完成對事務的提交

(2)使用MANAGED的事務管理機制,這種機制mybatis自身不會去實現事務管理,而是讓程式的容器(JBOSS,WebLogic)來實現對事務的管理

● 請你說一下事務的隔離級別,以及你一般使用的事務是哪種

參考回答:

事務的隔離性及時同一時間只允許一個事務請求同一資料,不同事物之間彼此沒有任何干擾,

事務隔離級別如下: