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的是怎樣彙總的
表結構如下
統計每個學生的各科的總分
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
在一個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
4. Limit 字句
Limit 【起始行(從0行開始的),】行數
eg.輸出第6-10行,第六行是5行(從0行開始的),到第十行是第六行的後面5行,limit 5,5
5.索引
5.1 一個表中 最多有16個索引,一個索引最多有15個列構成
5.2 索引類型
查看索引: show index from table_name;
刪除索引:drop index index_name on table_name;
5.3 constraint 用以指定完整性約束的名字
在不符合完整性約束下會帶有約束名的錯誤信息,也在刪除時方便引用。
eg. 表級定義主鍵
constraint pk1 primary key(sno)
6.多表連接
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相同值進行連接,不要求相同值所在的列有相同的字段名
自然連接:在等值連接基礎上,要求連接列的字段名必須相同,會將兩個相同的連接列自然合併到一列
外連接:是能顯示不滿足條件的記錄,其一方或兩方不滿足的記錄會顯示出來,
一方的是左連接、右連接。兩方的是全外連接
內連接: 是相對外連接而言,它是滿足條件的結果集
內連接與等值連接:內連接語句中可以設置不等的條件,而等值連接的條件只是相等條件,
所以在結果集上看,內連接可以查到不等的情況下的結果,內連接結果範圍更大,等值連接的結果是內連接結果的子集。