truncate 與 delete 的區別 truncate table :刪除內容、不刪除定義、釋放空間。 delete table : 刪除內容、不刪除定義、不釋放空間。 drop table :刪除內容和定義,釋放空間。 1、truncate table 表名,只能刪除表中全部數據。 dele ...
truncate 與 delete 的區別
truncate table :刪除內容、不刪除定義、釋放空間。
delete table : 刪除內容、不刪除定義、不釋放空間。
drop table :刪除內容和定義,釋放空間。
1、truncate table 表名,只能刪除表中全部數據。
delete from 表名 where...,可以刪除表中的全部數據,也可以刪除部分數據。
2、delete from 記錄是一條條刪的,所刪除的沒行記錄都會進日誌,而truncate一次性刪掉整個頁,因此日誌裡面只記錄頁釋放。
3、truncate刪除後,不能回滾。delete可以回滾。
4、truncate的執行速度比delete快。
5、delete執行後,刪除的數據占用的存儲空間還在,還可以恢複數據。truncate刪除的數據占用的存儲空間不在,不可以恢複數據。
SQL的授權語句和收回許可權語句
grant 許可權 on 資料庫對象 to 用戶
grant insert on scott.Employees to user1,user2;
grant delete on scott.Employees to user1,user2;
grant select on scott.Employees to user1,user2;
grant update on scott.Employees to user1,user2;
revoke 許可權 on 資料庫對象 from 用戶
怎麼新加一行記錄、怎麼添加一個列欄位,修改列?
插入一行數據:
insert into stu(stuName,stuAge,stuSex)values('張三','20','男')
增加列:
alter table tableName add (column)columnName varchar(30)
刪除列:
alter table tableName drop (column) columnName
select Count(*) 和 Select Count(數字)以及Select Count(column)區別
count(*)跟count(1)的結果一樣,返回記錄的總行數,都包括對NULL的統計,而count(column)是不包括NULL的統計。
執行效果上:
count(*)包括了所有的列,相當於行數,在統計結果的時候,包含NULL;
count(1)包括了忽略所有列,用1代表代碼行,在統計結果的時候,包含NULL;
count(列名)只包括列名那一列,在統計結果的時候,不包含NULL;
執行效率上:
列名為主鍵,count(列名)會比count(1)快;列名不為主鍵,count(1)會比count(列名)快;
如果表多個列並且沒有主鍵,則count(1)的執行效率優於count(*);
如果有主鍵,則count(主鍵)的執行效率是最優的;如果表只有一個欄位,則count(*)最優。
exists關鍵字的使用方法
exists關鍵字表示存在。使用exists關鍵字時,內層查詢語句不返回查詢的記錄,而是返回一個真假值。
如果內層查詢語句查詢到符合條件的記錄,就返回一個真值(true),否則,將返回一個假值(false):
當返回的值為true時,外層查詢語句將進行查詢;
當返回的值為false時,外層查詢語句將不進行查詢或者查詢不出任何記錄。
實例1
如果department表中存在d_id取值為1003的記錄,則查詢employee表的記錄。select語句的代碼如下:
select * from employee
where exists
(select d_name from department where d_id=1003);
因為department表中存在d_id值為1003的記錄,內層查詢語句返回一個true,外層查詢語句接收true後,開始查詢employee表中的記錄。因為沒有設置查詢employee表的查詢條件,所以查詢了employee表的所有記錄。
實例 2
exists 關鍵字可以與其他的查詢條件一起使用。條件表達式與exists關鍵字之間用AND或者OR進行連接。
如果department表中存在d_id取值為1003的記錄,則查詢employee表中age大於24歲的記錄。select語句的代碼如下:
select * from employee
where age>24 AND exists
(select d_name from department where d_id=1003);
因為,當內層查詢語句從department表中查詢到記錄,返回一個true,外層查詢語句開始進行查詢,根據查詢條件,從employee 表中查詢出age大於24歲的兩條記錄。
實例 3
not exists 與 exists正好相反。使用 not exists關鍵字時,當返回的值是true時,外層查詢語句不進行查詢或查詢不到任何記錄;當返回值是false時,外層查詢語句將進行查詢。
如果department表中不存在d_id欄位取值為1003的記錄,則查詢employee表的記錄。select 語句的代碼如下:
select * from employee
where not exists
(select d_name from department where d_id=1003);
判斷表的欄位值是否為空
1、查詢欄位為空的語法:where<欄位名>is null
2、查詢欄位值不為空的語法:where <欄位名>is not null 或者 where NoT(<欄位名>IS NULL)
有一個學生表,有三個欄位:name、course、score,每一個學生都有三門課程,比如數學、語文、英語,寫SQL語句,查找出三門課程的成績都大於80的學生。
採用逆向思維。求三門成績都達於80的人,也可以是使先查出有成績小於80的人,再除去這些人就是三門成績都大於80的人了。
方法1:
select distinct A.name from Student A
where A.name not in
(select distinct S.name from student S where S.score<80);
方法2:
select S.name from Student S group by S.name Having MIN(S.score)>=80;
一個表只有一列name,有重覆的name,求出前十個name數最大的name。
select distinct name,count(name) a from user
group by name
order by a desc
limit 10