資料庫整理

半夏~綰綰發表於2021-03-13

建立資料庫

建立資料庫需要指定字符集,不然容易在插入資料時發生錯誤。

create database 資料庫名  default  charset utf8 collate utf8_general_ci;

建立表

建立表很容易建立,但是值得注意的是,建立表時,有時候同樣需要指定字符集以及引擎。除此之外還有約束條件。

create table 表名(
    屬性1 資料型別 not null primary key auto_increment comment '屬性描述',  # 非空、主鍵、自增。
    屬性2 資料型別 default 1 comment '屬性描述',    # 預設值constraint `外來鍵名稱` foreign key (屬性) references 參照表(屬性),
)engine = InnoDB default charset =utf8;

 插入資料

插入資料有兩種方式,但我們一般選擇有列名的。

Insert into 表名(列1,……列n) values (值1,……值n);
Insert into 表名  values(值1,……值n);

複製資料也算是插入資料的一種,語法如下,但要注意的是表2必須事先存在,而且查詢出的欄位數目、資料型別、欄位順序要與插入列保持一致。

Insert into 表2 列名 select  列名 from 表1;

更新資料

更新資料的前提是要遵守約束。

update 表名 set 列1 = 新值1,列2 = 新值2 where expr

刪除資料

刪除資料用 delete from 表名 where expr。

刪除資料表 用 drop table;

查詢資料(單表查詢)

查詢分為單表查詢和多表查詢。

1. 簡單查詢,比如查詢某一列(行)或者多行(列)。

2. 去重:distinct關鍵字指示資料庫只返回不同的值。

3. where  條件 查詢,例如,查詢姓名為張三的學生資訊;select * from student where sname=‘張三’;

  3.1 where  常用的比較運算子;=、>、>=、<、<=、<>等。

  3.2 between……and     代表的意思是兩者之間且包括兩者。

  3.3 in、not in   判斷某個欄位的值是否在指定的集合中。

  3.4 like  選擇類似的值,例如:姓劉的:like  '劉%'。 如果說是姓名為兩個字,且姓為張  : like  '張_'。

  3.5  is  nul:判斷為空  not null  : 判斷不為空

  3.6  邏輯運算: and    or    not  

4. group by    分組查詢

  4.1 分組函式作用於一組資料,並對一組資料返回一個值。

  4.2    avg函式返回滿足where條件的一列的平均值。聚合函式之一

  4.3    count(列名)返回某一列,行的總數。聚合函式之一

  4.4 Max/Min函式返回滿足where條件的一列的最大/最小值。聚合函式之一

  4.5 sum函式返回滿足where條件的行的和。聚合函式之一

SELECT  聚合函式和group by後存在的欄位  FROM .. WHERE ….  GROUP BY 欄位1[,欄位2,欄位3];
舉個例子:查詢學號範圍在1001~1010之間的這10位學生的總成績,
select sum(degree),sno  from score where sno between 1001 and 1010 group by sno;

5. having  篩選

having 和 where 的區別:

  1. having與where類似,可篩選資料,where 後的表示式怎麼寫,having就怎麼寫

  2. having 針對查詢結果中的列發揮作用,篩選資料。where針對表中的列發揮作用,查詢資料

  3. gruop by 是在where條件後執行的。having是在group by 後執行的。

  4. having 後可以使用聚合函式,where不可以。

6. order by 排序

  order by  指定排序的列,排序的列即可以是表中的列名,也可以是select 語句後指定的列名。

  order by 預設是asc即升序。降序為desc

  order by子句應該位於select 語句的結尾。order by後面可以跟多個排序條件。

7. limit  限制結果條數

  Limit [offset , N] 從offset開始,限制結果取N條。經常用於分頁。

其中的3~7被合稱為select的5種子句。

查詢語句的編寫順序:SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …

查詢語句的執行順序:WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

 常用函式

1. 時間日期相關函式:

current_Date() 當前日期
current_Time()  當前時間
datediff(date1,date2) 兩個日期差多少天
timediff(date1,date2) 兩個時間差多少時多少分多少秒
now() 當前時間
Year()、Month()、Date() 獲取年、獲取月。獲取日

2. 字串相關函式:

 

 3. 數學相關函式

 

 4. 流程控制函式

舉個簡單的例子:例如:SELECT scoid,socre,IF(socre>=60,'及格','不及格') AS 等級 from score;

5. 其他函式

 

 舉幾個例子:

# 獲取當前使用者 
select user() as s1;

#加密函式
select md5(name) from student;

#改變欄位資料型別的函式
select cast'123' as unsigned int+1
select convert('123',unsigned int) +1

 

 多表查詢

1. 交叉連線:交叉連線會返回被連線的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積。

 交叉連線的三種語法:

select  * from table1 cross join table2 where 條件;
select * from table1 join table2 where 條件;
select * from table1,table2 where 條件;

 

2. 等值連線:where條件後是‘=’則為等值連線;

3. 內連線:合併具有同一列的兩個以上的表的行,結果集中不包含一個表與另一個表不匹配的行。

語法:SELECT <列名> FROM 表1 INNER JOIN 表2 ON 表1.列名 條件運算子 表2.列名 [WHERE 條件] [ORDER BY 排序列]

舉個例子:查詢小王所考科目的平均成績,顯示成績,平均成績

select name,avg(score) from score inner join student on score.stuid = student.stuid where name = '小王'

3. 外連線:外連線分為左外連線和右外連線。

  3.1外連線和普通連線的區別:普通連線操作只輸出滿足連線條件的元組。外連線操作以指定表為連線主體,將主體表中不滿足連線條件的元組一併輸出。

  3.2 左外連線:左外連線使用LEFT JOIN連線兩表,連線時左表為主表,左表中的每條記錄必定出現在結果集中,而在右表中沒有對應的記錄,將以NULL值進行填充。

SELECT * FROM TABLE_A LEFT JOIN TABLE_B ON 連線條件 [WHERE 條件]

舉個例子:查詢所有學生課程的考試成績,查詢結果保留學生ID、姓名、性別、課程ID、成績

select student.sno,name,sex,sno,scorre from student left join score on student .sno = score.sno;

   3.3 右外連線 :右外連線與左外連線相似,不同的是右表為主表,右表中的每條記錄必定出現在結果集中,而在左表中沒有對應的記錄,將以NULL值進行填充。

  語法:SELECT * FROM TABLE_A RIGHT JOIN TABLE_B ON 連線條件 [WHERE 條件]

4. 內外連線的區別:

 

 子查詢

子查詢就是在原有的查詢語句中, 嵌入新的查詢,來得到我們想要的結果集。 也叫巢狀查詢。

子查詢分為:比較子查詢,IN/NOT IN子查詢,EXISTS/NOT EXISTS子查詢

IN/NOT IN 與 EXISTS/NOT EXISTS的區別:

  IN/NOT IN先執行子查詢,子查詢返回的是一個集合,然後再將子查詢的結果作為外層查詢的條件進行過濾。

  EXISTS/NOT EXISTS先執行外層查詢,再將外層查詢的每一條記錄作為條件進行子查詢,子查詢返回的只是返回一個TRUE或FALSE,因此一般情況 下子查詢中直接使用SELECT 1提高效率。

檢視

什麼是檢視:檢視是一張虛擬表,檢視中不存放資料,資料存放在檢視所引用的原始表中。

如何建立:create  view  檢視名   as   select  語句

如何檢視檢視:select * from 檢視名

如何刪除檢視:drop  view 檢視名

檢視檢視表結構:desc 檢視名

檢視檢視:show create view 檢視名

修改檢視:alter view 檢視名  as  select 語句

注意點:當表發生改變,檢視也會發生改變。同樣的當檢視發生資料的增刪改,那麼同樣也會影響到表。

檢視的優點:定製資料、聚焦資料。簡化資料操作,原表中的資料有一定的安全性,合併分離的資料,建立分割槽檢視。

索引:

索引是以表列為基礎建立的資料庫物件,它儲存著表中排序的索引列,並且記錄了索引列在資料表中的物理儲存位置,實現了表中資料的邏輯排序

使用索引,加快了查詢速度。但降低了曾、刪、改的速度,增大了表的檔案大小。

索引的型別有以下六種:

 普通索引僅僅加快了查詢的速度,主鍵索引:加上主鍵的列的值不能重複。

唯一索引:加上唯一索引的列的值不能重複,它和主鍵索引的區別是:主鍵必須唯一,但索引不一定是主鍵,一張表中只能有一個主鍵,但是可以有一個或多個唯一索引。

索引的建立:

# 建表時直接宣告索引
create
table tableName ( 列1 列型別 列屬性, .... 列N 列型別 列屬性, primary key(列名), index (列名), unique(列名), fulltext(列名) )engine xxxxx charset xxxx

# 通過修改表建立索引:
alter table add index (列名); alter table add unique (列名); alter table add primary key(列名); alter table add fulltext (列名);

 索引的刪除:

刪除主鍵索引:alter  table drop  primary  key

刪除其他索引:alter   table  drop  index  索引名

索引的檢視:show index from tableName

 

相關文章