Author:相忠良
Email: ugoood@163.com
起始於:May 16, 2018
最後更新日期:May 26, 2018mysql
聲明:本筆記依據傳智播客方立勳老師 Java Web 的授課視頻內容記錄而成,中間加入了本身的理解。本筆記目的是強化本身學習所用。如有疏漏或不當之處,請在評論區指出。謝謝。
涉及的圖片,文檔寫完後,一次性更新。sql
參照MySQL安裝圖解,下載後,把rar改成doc便可。https://files.cnblogs.com/files/ZhongliangXiang/MySQL%E5%AE%89%E8%A3%85%E5%9B%BE%E8%A7%A3.rar數據庫
練習下面內容便可:服務器
mysql管理員的用戶名和密碼:root root 建立一個名稱爲mydb1的數據庫 create database mydb1; show databases; 建立一個使用utf-8字符集的mydb2數據庫。 create database mydb2 character set utf8; 建立一個使用utf-8字符集,並帶校對規則的mydb3數據庫。 create database mydb3 character set utf8 collate utf8_general_ci; 查看前面建立的mydb2數據庫的定義信息 show create database mydb2; 刪除前面建立的mydb1數據庫 drop database mydb1; 查看服務器中的數據庫,並把其中某一個庫的字符集修改成gb2312; alter database mydb2 character set gb2312; show create database mydb2; 演示恢復和備份 create database tt; use tt; create table a ( name varchar(20) ); insert into a(name) values('aaaa'); select * from a; -----看到a表有數據 對tt做備份操做,啓動一個window命令行窗口,執行以下命令 mysqldump -uroot -p tt>c:\tt.sql 演示恢復 1.先刪除庫 drop database tt; 2.恢復tt庫(1) 2.1 爲恢復庫,要先建立庫 create database tt; 2.2 再恢復tt庫 use tt; source c:\tt.sql (source:能夠執行一個 sql腳本) 3.恢復tt庫(2) 2.1 爲恢復庫,要先建立庫 create database tt; 2.2 恢復庫 mysql -uroot -proot tt<c:\1.sql; (window命令)
建立一個員工表 use mydb2; create table employee ( id int, name varchar(40), sex varchar(4), birthday date, entry_date date, job varchar(40), salary decimal(8,2), resume text ); show tables; 查看庫的全部表 show create table employee; 查看錶的建立細節 desc employee; 看錶結構 在上面員工表的基本上增長一個image列。 alter table employee add image blob; 修改job列,使其長度爲60。 alter table employee modify job varchar(60); 刪除sex列 alter table employee drop sex; 表名改成user。 rename table employee to user; 修改表的字符集爲utf-8 alter table user character set utf8; 列名name修改成username alter table user change column name username varchar(40); 刪除表 drop table user;
使用insert語句向表中插入三個員工的信息。 rename table user to employee; insert into employee(id,username,birthday,entry_date,job,salary,resume) values(1,'aaa','1980-09-09','1980-09-09','bbb',90,'aaaaa'); select * from employee; 插入數據的細節1 insert into employee values(1,'aaa','1980-09-09','1980-09-09','bbb',90,'aaaaa'); 插入數據的細節2 insert into employee values('1','aaa','1980-09-09','1980-09-09','bbb','90','aaaaa'); 插入數據的時候都用單引號引發來,省的數據報錯,若是ID引發來的話,mysql會自動轉換類型的。 插入數據的細節3(插入中文) 要告訴mysql客戶端採用gb2312編碼 show variables like 'chara%'; set character_set_client=gb2312; insert into employee(id,username) values('3','張三'); 要想查看時不亂碼 show variables like 'chara%'; set character_set_results=gb2312; select * from employee; 將全部員工薪水修改成5000元。 update employee set salary=5000; 將姓名爲’bbb’的員工薪水修改成3000元。 update employee set salary=3000 where username='bbb'; 將姓名爲’bbb的員工薪水修改成4000元,job改成ccc。 update employee set salary=4000,job='ccc' where username='bbb'; 將bbb的薪水在原有基礎上增長1000元。 update employee set salary=salary+1000 where username='bbb'; 更新要注意的問題 update employee set username='ccc',salary=9000,birthday='1980-09-09',..................... update where id=1; 這個地方忘記寫where,後果是很嚴重的。 刪除表中名稱爲’zs’的記錄。 delete from employee where username='bbb'; 刪除表中全部記錄。 delete from employee; 使用truncate刪除表中記錄。 truncate table employee;
試驗所需材料:
建立1個 student.sql 文件,並寫入以下內容:數據結構
create table student( id int, name char(20), chinese float, english float, math float ); insert into student(id,name,chinese,english,math) values(1,'張小明',89,78,90); insert into student(id,name,chinese,english,math) values(2,'李進',67,98,56); insert into student(id,name,chinese,english,math) values(3,'王五',87,78,77); insert into student(id,name,chinese,english,math) values(4,'李一',88,98,90); insert into student(id,name,chinese,english,math) values(5,'李來財',82,84,65); insert into student(id,name,chinese,english,math) values(6,'張進寶',55,85,45); insert into student(id,name,chinese,english,math) values(7,'黃蓉',75,65,30);
將該文件導入某數據庫,如:數據庫設計
use tt source e:\student.sql
處理mysql客戶端輸入和顯示時的亂碼問題,下面代碼在mysql客戶端執行:函數
要告訴mysql客戶端採用gb2312編碼 show variables like 'chara%'; set character_set_client=gb2312; 要想查看時不亂碼 show variables like 'chara%'; set character_set_results=gb2312;
上述準備工做做完後,進行下面的查詢練習:學習
查詢表中全部學生的信息。 select * from student; 查詢表中全部學生的姓名和對應的英語成績。 select name,english from student; 過濾表中重複的英語數據。 select distinct english from student; 在全部學生總分上加10分特長分。 select name,(chinese+english+math)+10 from student; 統計每一個學生的總分。 select name,(chinese+english+math) from student; 使用別名表示學生分數。 select name as 姓名,(chinese+english+math)+10 as 總分 from student; select name 姓名,(chinese+english+math)+10 總分 from student; 查詢姓名爲王五的學生成績 select * from student where name='王五'; 查詢英語成績大於90分的同窗 select * from student where english>'90'; 查詢總分大於200分的全部同窗 select name from student where (chinese+english+math)>200; 查詢英語分數在 80-90之間的同窗。 select name from student where english>80 and english<90; select name from student where english between 80 and 90; == select name from student where english>=80 and english<=90; 查詢數學分數爲89,90,91的同窗。 select * from student where math in(89,90,91); 查詢全部姓李的學生成績。 select * from student where name like '李%'; select * from student where name like '李_'; 查詢數學分>80,語文分>80的同窗。 select * from student where math>80 and chinese>80; 對數學成績排序後輸出。 select name,math from student order by math; 對總分排序後輸出,而後再按從高到低的順序輸出 select name 姓名,(chinese+english+math) 總分 from student order by (chinese+english+math) desc; select name 姓名,(chinese+english+math) 總分 from student order by 總分 desc; 對姓李的學生成績排序輸出 select * from student where name like '李%' order by (chinese+english+math) desc; 統計一個班級共有多少學生? select count(name) from student; select count(*) from student; 統計數學成績大於90的學生有多少個? select count(*) from student where math>80; 統計總分大於250的人數有多少? select count(*) from student where (chinese+english+math)>250; 關於 count的函數的細節 (count只統有值的行) 統計一個班級數學總成績? select sum(math) from student; 統計一個班級語文、英語、數學各科的總成績 select sum(chinese),sum(english),sum(math) from student; 統計一個班級語文、英語、數學的成績總和 select sum(chinese+english+math) from student; 統計一個班級語文成績平均分 select sum(chinese)/count(*) from student; 統計一個班級語文成績平均分 select avg(chinese) from student; 求一個班級總分平均分 select avg(chinese+math+english) from student; 求班級最高分和最低分 select max(chinese+math+english),min(chinese+math+english) from student; 對訂單表中商品歸類後,顯示每一類商品的總價 select product,sum(price) from orders group by product; 查詢購買了幾類商品,而且每類總價大於100的商品 select product from orders group by product having sum(price)>100;
定義主鍵約束(每個表必須有一個主鍵列) create table student ( id int primary key, name varchar(40) ); 定義主鍵自動增加 create table student ( id int primary key auto_increment, name varchar(40) ); 定義惟一約束 drop table student; create table student ( id int primary key auto_increment, name varchar(40) unique ); 定義非空約束 drop table student; create table student ( id int primary key auto_increment, name varchar(40) unique not null ); 定義外鍵約束 create table husband ( id int primary key, name varchar(40) ); create table wife ( id int primary key, name varchar(40), husband_id int, constraint husband_id_FK foreign key(husband_id) references husband(id) );
從應用程序創建對象後,需將 複雜對象 存入數據庫的這種迫切需求開始,理解本節內容。
複雜對象: 就是對該象中的屬性,存放着其餘類型對象。後面的列子中對象多數均爲複雜對象。簡單對象的話,直接用 mysql 建表存儲就完事了。編碼
數據庫表的 1:n 或 n:1 的設計原則:命令行
示例場景,以下圖:
創建表的sql語句:
一對多或多對一的對象存到數據庫時,表的設計方案 部門和員工 create table department ( id int primary key, name varchar(40) ); create table employee ( id int primary key, name varchar(40), salary decimal(8,2), department_id int, constraint department_id_FK foreign key(department_id) references department(id) );
多對多關係的話,就需創建一箇中間表。
示例場景,以下圖:
創建表的sql語句:
多對多對象的表的設計(老師和學生) create table teacher ( id int primary key, name varchar(40), salary decimal(8,2) ); create table student ( id int primary key, name varchar(40) ); create table teacher_student ( teacher_id int, student_id int, primary key(teacher_id,student_id), constraint teacher_id_FK foreign key(teacher_id) references teacher(id), constraint student_id_FK foreign key(student_id) references student(id) ); 不過, teacher_student 表中的主鍵是值得商榷的。一般應該單獨創建 id 主鍵列,而不建議用雙列作主鍵。
1對1案例,人和身份證。 1對1通常是有 主從關係 的。
人爲主,身份證爲從。既人能夠沒身份證,但身份證不能沒有人與之對應。
示例場景,以下圖:
身份證外鍵列不只要加外鍵約束,還要加惟一性約束和非空約束,保證了1:1的關係。下圖也表達了1:1關係中的一種主從關係特性。
上圖中,把身份證表的id列設爲主鍵約束和外鍵約束,剛好表達了身份證外鍵列還要加惟一性和非空這兩種約束,故不必單獨設計1個列爲外鍵約束列了。
創建表的sql語句:
一對一的對象的數據庫設計 create table person ( id int primary key, name varchar(40) ); create table idcard ( id int primary key, city varchar(40), constraint id_FK foreign key(id) references person(id) );
案例:家族管理系統
每一個人都有1個爸爸,有好多孩子。 爸爸,孩子,包括你,都是 Person 對象。
創建表的sql語句:
自鏈接的表 create table person ( id int primary key, name varchar(40), parent_id int, constraint parent_id_FK foreign key(parent_id) references person(id) );
設計一個無限制分類的表:
該表理論上可存無限制分類,實際操做中涉及到遞歸,遞歸有層數限制,故實際中該表沒法實現無限制分類。需用數據結構中的二叉樹來實現。