實用數據庫教程mysql期末-1

1.DDL

建立數據庫

create {database|schema} database_name [[default] character set 字符集名|
[default] collate 校對規則名]

建表方式:

drop table if exists tb1;
create tb1 as select * from tb2;--表數據和表結構都創建了

drop table if exists tb1;
create tb1 like  tb2; --只創建了與tb2表結構相同表,tb1爲空表
insert into tb1 select * from tb2;--插入數據

2.DML

(1)insert 三種方式:

insert into table_name (column1,column2...) values(value1,value2...);
insert into table_name(column1,column2...) 
	select column1,column2...from table_name where 條件;
insert into table_name set column1=value1,column2=value2.....

update:

update table_name set column1 = vaule1,column2=value2...where condition

delete:

delete from table_name where condition 

truncate table table_name;--清除表中所有數據等同於 delete from table_name;
--參與索引和視圖的表不能用truncate 

3. group by

使用with rollup 進行對每個分組進行彙總。
【若是使用mysql5.7.需要修改@@sql_mode系統全局配置變量,因5.7默認設置sql模式中對group by 實行的是ONLY_FULL_GROUP_BY,它要求 select columns from table_name group by list 中 column 必須在list中或是聚集函數,否則過不了ONLY_FULL_GROUP_BY檢測,報“ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘testdatabase.student.Sno’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by”或“Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘testdatabase.student.Sname’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by”這樣的錯誤】–> 修改session級別的sql_mode系統變量

SET sql_mode
='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
--- 就是把原來sql_mode的值中去掉了ONLY_FULL_GROUP_BY

用以下例子分析rollup的是怎樣彙總的

表結構如下
course.png

student.png
sc.png
表結構下載提取碼 :0dut

統計每個學生的各科的總分

	SELECT student.`Sname`, SUM(sc.`score`) 
	FROM sc, course,student 
	WHERE sc.`Cno` = course.`Cno` AND sc.`Sno`=student.`Sno` 
	GROUP BY student.Sname  WITH 	ROLLUP
QAC[MB[S_(8PZ]5~8AQJ~87.png

在一個group By 條件下,rollup是對每個分組結果進行了彙總,並且在後一行添加彙總結果,分組條件那列是null。在group by多條件下也是類似的。只是先彙總最內層的分組,就像雙重循環,內循環執行完畢後,外循環纔會進入一次循環。在這裏,內分組統計一次,外分組再彙總統計。group by c1,c2;現在按c1組內按c2分組,在c1內,會根據c2產生不同組,在這些不同的組間rollup會進行一次分組。按c1全部分組完後,按c1分組也會有不同的分組產生彙總統計。
比如

SELECT student.`Sname`,course.`Cname` , SUM(sc.`score`) 
FROM sc, course,student 
WHERE sc.`Cno` = course.`Cno` AND sc.`Sno`=student.`Sno` 
GROUP BY student.Sname,course.`Cname`  WITH ROLLUP
OB91@6PCN)_BM2HU2R4Q4{5.png

4. Limit 字句

Limit 【起始行(從0行開始的),】行數
eg.輸出第6-10行,第六行是5行(從0行開始的),到第十行是第六行的後面5行,limit 5,5

5.索引

5.1 一個表中 最多有16個索引,一個索引最多有15個列構成
5.2 索引類型
83Z`M7XA2HP57HDY_{PW[38.png

   查看索引: show index from table_name;
   刪除索引:drop index index_name on table_name;

5.3 constraint 用以指定完整性約束的名字

在不符合完整性約束下會帶有約束名的錯誤信息,也在刪除時方便引用。

eg. 表級定義主鍵
constraint pk1 primary key(sno)

6.多表連接

2%)TJPSEAKM1%DWBRWO0O3K.png

join連接語法:from + tb1 [inner|cross] {left|right}[outer] join tb2 on 條件

join 多表連接:from + (tb1 join tb2 on tb1.no = tb2.no) join tb3 on tb3.no = tb2.no

eg. select * from (xs join xs_kc on xs.學號= xs_kc.學號)join kc on xs_kc.課程號=kc.課程號


S表:

A B
1 2
3 3
5 9

R表:

B C
2 1
7 2
3 5

s.A=R.c等值連, 等值連接不要求列有相同的字段名,列的數據類型同即可

A S.B R.B C
1 2 2 1
5 9 3 5

s.B=R.B等值連, 嘗試相同的

A S.B R.B C
1 2 2 1
3 3 3 5

自然連接 S.B=R.B 兩列的字段名必須相同,這樣纔會將兩個同列自然合併到一列

A B C
1 2 1
1 3 5

連接方式區分:

	等值連接:根據表S和表R相同值進行連接,不要求相同值所在的列有相同的字段名
	
	自然連接:在等值連接基礎上,要求連接列的字段名必須相同,會將兩個相同的連接列自然合併到一列
	
	外連接:是能顯示不滿足條件的記錄,其一方或兩方不滿足的記錄會顯示出來,
	一方的是左連接、右連接。兩方的是全外連接
	
	內連接: 是相對外連接而言,它是滿足條件的結果集
	
	內連接與等值連接:內連接語句中可以設置不等的條件,而等值連接的條件只是相等條件,
	所以在結果集上看,內連接可以查到不等的情況下的結果,內連接結果範圍更大,等值連接的結果是內連接結果的子集。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章