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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/64424.html
標籤:MySQL
