重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
需要用的資料以鏈接的形式給需要的同學。
目前成都創新互聯已為1000多家的企業提供了網站建設、域名、網絡空間、網站運營、企業網站設計、寶坻網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。
我用的mysql版本為: Mysql-5.5.45-win64.msi 密碼是:26zw
圖形化工具 Navicat(前期不推薦用,直接手動敲): Navicat 密碼:c7fs
開始我的MySQL之旅吧 始于2016.12.04
--WH
一、數據庫的安裝
這個就不在這里過多闡述了,因為網上實在是太多安裝mysql的教程了,有了我給的mysql,在按照這個安裝教程(MySQL安裝教程)去看,就能夠安裝完好。
安裝好mysql后,如果需要使用windows命令窗口(也就是cmd)來操作mysql,那么就需要配置環境變量,在安裝好的mysql下找到bin,將其目錄放到環境變量path中去,就行了,檢測成功與否的方法是在cmd命令窗口中輸入mysql,就會出現一大段英文,就說明成功了,反之失敗,如果不會的話就去百度搜教程。
二、數據庫的基本操作
1、開啟mysql服務命令
net start mysql
2、進入mysql的兩種方式
明文進入:mysql -uroot -proot格式:mysql -u帳號 -p密碼
密文進入:mysql -uroot -p 按enter會提示你輸入密碼(Enter pssword:),此時你寫的密碼就會顯示為***這樣。
3、查看mysql中所有的數據庫(一般在固定的單詞命令就會是用大寫,這個要習慣,看多了敲多了就認識了)
前面四個數據庫是mysql中自帶的,也就是必須的.
SHOW DATABASES;
4、創建名為test_1的數據庫
格式:CREATE DATABASE 數據庫名
CREATE DATABASE test_1;
5、刪除名為test_1的數據庫
格式:DROP DATABASE 數據庫名
DROP DATABASE test_1;
總結:學習了對數據庫的三個操作,1、查看所有數據庫 2、創建數據庫 3、刪除數據庫
三、數據表的基本操作
數據表和數據庫還有Mysql三者的關系
mysql中保存了很多數據庫、一個數據庫中可以保存很多表。
對數據表的增(創建表)刪(刪除表)改(修改表字段)查(查詢表結構)。 注意:這里的操作對象是表,對表的操作也就是表的結構,和表中的字段的操作(字段和記錄要分清楚)
前提:表是在數據庫下的,所以要先確實使用哪個數據庫。
USE test_1;
1、創建數據表
格式:CREATE TABLE 數據表名(
字段名1數據類型[列級別約束條件],
字段名2數據類型[列級別約束條件],
字段名3數據類型[列級別約束條件]
);
注意:格式不一定需要這樣隔著寫,完全可以全部寫成一行。但是那樣寫可觀性非常差。我這樣寫只是為了可以看的更清晰。
解釋:
1、[]中括號中的內容表示可以有可以沒有,
2、列級別這個“列”一定要搞清楚說的是什么,一張表中有行有列,列表示豎,行表示橫
3、約束條件后面會講到
1.1、創建沒有約束的student表
CREATE TABLE student( idINT(11), nameVARCHAR(12), ageINT(11) );
注釋:SHOW TABLES 查詢數據庫底下的所有表。
1.2、創建有約束的student表
六大約束:主鍵約束、外鍵約束、非空約束、唯一約束、默認約束、自動增加
1.2.1:主鍵約束
PRIMARY KEY(primary key):獨一無二(唯一)和不能為空(非空),通俗的講,就是在表中增加記錄時,在該字段下的數據不能重復,不能為空,比如以上面創建的表為例子,在表中增加兩條記錄,如果id字段用了主鍵約束。則id不能一樣,并且不能為空。一般每張表中度有一個字段為主鍵,唯一標識這條記錄。以后需要找到該條記錄也可以同這個主鍵來確認記錄,因為主鍵是唯一的,并且非空,一張表中每個記錄的主鍵度不一樣,所以根據主鍵也就能找到對應的記錄。而不是多條重復的記錄。如果沒有主鍵,那么表中就會存在很多重復的記錄,那么即浪費存儲空間,在查詢時也消耗更多資源。
一般被主鍵約束了的字段度習慣性的稱該字段為該表的主鍵
單字段主鍵約束
兩種方式都可以
CREATE TABLE student(CREATE TABLE student(
idINT(11) PRIMARY KEY,idINT(11),
nameVARCHAR(12),nameVARCHAR(12),
ageINT(11) ageINT(11),
); PRIMARY KEY(id) );
多字段主鍵約束(復合主鍵)
這個id和name都市主鍵,說明在以后增加的插入的記錄中,id和name不能同時一樣,比如說可以是這樣。一條記錄為id=1,name=yyy、另一條記錄為:id=1,name=zzz。 這樣是可以的。并不是你們所理解的兩個字段分別度不可以相同。
CREATE TABLE student(CREATE TABLE student(
idINT(11) PRIMARY KEY,idINT(11),
nameVARCHAR(12) PRIMARY KEY, nameVARCHAR(12),
ageINT(11) ageINT(11),
);PRIMARY KEY(id,name) );
1.2.2:外鍵約束
什么是外鍵舉個例子就清楚了,有兩張表,一張表是emp(員工)表,另一張表是dept(部門)表,一個員工屬于一個部門,那么如何通過員工能讓我們自己他在哪個部門呢?那就只能在員工表中增加一個字段,能代表員工所在的部門,那該字段就只能是存儲dept中的主鍵了(因為主鍵是唯一的,才能確實是哪個部門,進而代表員工所在的部門,如果是部門名稱,有些部門的名稱可能是同名。就不能區分了。),像這樣的字段,就符合外鍵的特點,就可以使用外鍵約束,使該字段只能夠存儲另一張表的主鍵。如果不被外鍵約束,那么該字段就無法保證存儲進來的值就一定是另一張表的主鍵值。
外鍵約束的特點:
1、外鍵約束可以描述任意一個字段(包括主鍵),可以為空,并且一個表中可以有多個外鍵。但是外鍵字段中的值必須是另一張表中的主鍵。
2、這樣被外鍵關聯的兩種表的關系可以稱為父子表或者主從表。子表(從表)擁有外鍵字段的表,父表(主表)被外鍵字段所指向的表。
3、子表被外鍵約束修飾的字段必須和父表的主鍵字段的類型一樣。
注意:一個表中有被外鍵修飾的字段,就稱該表有外鍵(是“有外鍵”。而不是“是外鍵”),并會給該表中的外鍵約束取一個名稱,所以我們常說的這個表有沒有外鍵,指的不是被外鍵約束修飾的字段名,而是指這個表是否有存在外鍵約束。也就是說,不能說這個表的外鍵是xxx(該表中被外鍵約束修飾的字段名),這種說法是錯誤的,但是大多數人已經習慣了這樣,雖然影響不大,但是在很多時候需要理解一個東西時,會造成一定的困擾。
格式:CONSTRAINT外鍵名稱FOREIGN KEY(被外鍵約束的字段名稱)REFERENCES 主表名(主鍵字段)
英文解釋:CONSTRAINT:約束REFERENCES:參考
CREATE TABLE tableA
(
id INT(11),
name VARCHAR(22),
location VARCHAR(50),
PRIMARY KEY(id)
);
CREATE TABLE tableB
(
id INT(11),
name VARCHAR(22) NOT NULL,
deptId INT(11),
PRIMARY KEY(id),
CONSTRAINT tableA_tableB_1 FOREIGH KEY(deptId) REFERENCES tableA(id)
);
解釋:tableB中有一個名為tableA_tableB_1的外鍵關聯了tableA和tableB兩個表,被外鍵約束修飾的字段為tableB中的deptId,主鍵字段為tableA中的id
1.2.3:非空約束
NOT NULL. 被該約束修飾了的字段,就不能為空,主鍵約束中就包括了這個約束
CREATE TABLE tableA
(
id INT(11),
name VARCHAR(22) NOT NULL,
location VARCHAR(50),
PRIMARY KEY(id)
);
1.2.4:唯一約束
UNIQUE 被唯一約束修飾了的字段,表示該字段中的值唯一,不能有相同的值,通俗點講,就好比插入兩條記錄,這兩條記錄中處于該字段的值不能是一樣的。
CREATE TABLE tableA
(
id INT(11),
name VARCHAR(22) UNIQUE,
location VARCHAR(50),
PRIMARY KEY(id)
);
也就是說在插入的記錄中,每條記錄的name值不能是一樣的。
1.2.5:默認約束
Default 指定這一列的默認值為多少,比如,男性同學比較多,性別就可以設置為默認男,如果插入一行記錄時,性別沒有填,那么就默認加上男
CREATE TABLE table
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
deptId INT(11) DEFAULT 1111,
salary FLOAT
);
1.2.6:自動增加
AUTO_INCREMENT 一個表只能一個字段使用AUTO_INCREMENT,并且使用這個約束的字段只能是整數類型(任意的整數類型 TINYINT,SMALLIN,INT,BIGINT),默認值是1,也就是說從1開始增加的。一般就是給主鍵使用的,自動增加,使每個主鍵的值度不一樣,并且不用我們自己管理,讓主鍵自己自動生成
CREATE TABLE table ( id INT(11) PRIMARY KEY AUTO_INCREMENT, name VARCHAR(22) NOT NULL );
2、查詢表結構
2.1、查看表基本結構語句
格式1:DESCRIBE 表名/DESC 表名這兩個的功能是一樣的,簡寫了單詞describe
DESCRIBE student;
2.2、查看創建表的語句
格式:SHOW CREATE TABLE 表名
SHOW CREATE TABLE student;
這樣顯示的格式很不好,看不清楚,所以有了下面這個語句
格式:SHOW CREATE TABLE 表名\G
SHOW CREATE TABLE student\G;
3、修改數據表
修改數據表包括:對表中字段的增加、刪除、修改。 在這個里面用的關鍵字為 ALTER
3.1、修改表名
格式:ALTER TABLE舊表名 RENAME[TO]新表名;
將student表名改為student1(改完后在改回來)
ALTER TABLE student RENAME TO student1;
3.2、修改表中的字段名
格式:ALTER TABLE表名 CHANGE舊字段名新字段名新數據類型
將student表中的name字段名改為 username
ALTER TABLE student CHANGE name username VARCHAR(30);
3.3、修改表中的數據類型
格式:ALTER TABLE表名 MODIFY字段名數據類型
ALTER TABLE student MODIFY username VARCHAR(20);
解釋:只能修改字段名的數據類型,但是其原理跟上面change做的事情一樣,這里也有修改字段名的過程,只不過修改后的字段名和修改前的字段名相同,但是數據類型不一樣。
3.4、修改字段的排列位置
方式1:ALTER TABLE表名 MODIFY字段1數據類型 FIRST|AFTER字段2
解釋:將字段1的位置放到第一,或者放到指定字段2的后面
ALTER TABLE student MODIFY username VARCHAR(20) AFTER age;
方式2:ALTER TABLE表名 CHANGE字段1字段2數據類型 FIRST|AFTER字段3
解釋:其實是一樣的,將是字段2覆蓋字段1,然后在進行排序
ALTER TABLE student CHANGE username username VARCHAR(20) AFTER age;
總結
CHANGE和MODIFY的區別?
原理都市一樣的,MODIFY只能修改數據類型,但是CHANGE能夠修改數據類型和字段名,也就是說MODIFY是CHANGE的更具體化的一個操作。可能覺得用CHANGE只改變一個數據類型不太爽,就增加了一個能直接改數據類型的使用關鍵字MODIFY來操作。
3.5、添加字段
格式:ALTER TABLE表名稱 ADD新字段名數據類型[約束條件][FIRST|AFTER已存在的表名]
解釋:在一個特定位置增加一個新的字段,如果不指定位置,默認是最后一個。
ALTER TABLE student ADD sex VARCHAR(11);
3.6、刪除字段
格式:ALTER TABLE表名稱 DROP字段名;
ALTER TABLE student DROP sex;
3.7、刪除表的外鍵約束
格式:ALTER TABLE表名稱 DROP FOREIGN KEY外鍵約束名
注意:外鍵約束名 指的不是被外鍵約束修飾的字段名,切記,而是我們在創建外鍵約束關系時取的名字。
3.8、更改表的存儲引擎
格式:ALTER TABLE表名 ENGINE=更改后的存儲引擎名
這個存儲引擎目前我自己也不太清楚,雖然知道有哪幾種引擎,但是稍微深入一點就不清楚了,所以打算留到日后在說。
4、刪除表
4.1、刪除無關聯表
格式:DROP TABLE表名;
ALTER TABLE student;
4.2、刪除被其他表關聯的主表
這個是比較重要的一點,在有外鍵關聯關系的兩張表中,如果刪除主表,那么是刪不掉的,并且會報錯。因為有張表依賴于他。那怎么辦呢?針對這種情況,總共有兩種方法
1、先刪除你子表,然后在刪除父表,這樣就達到了刪除父表的目的,但是子表也要被刪除
2、先解除外鍵關系,然后在刪除父表,這樣也能達到目的,并且保留了子表,只刪除我們不需要的父表。在3.7中就講解了如何刪除外鍵關系。
一、熟悉MySQL的運行環境
MySQL數據庫是在Linux環境下運行的,建議先熟練Linux系統。選定好架構模式之后就可以開始進入程序開發和數據處理的環節。
二、有扎實的數據庫理論知識
MySQL作為關系型數據庫,在實際的應用中也要學會分析存儲數據的關系型數據結構,關系操作集合等。只有對這些內容有一個明確的認識,在設計數據庫字段、表與表的關系才能考慮周全,避免出現錯誤。
三、熟練的SQL語言運用
任何一種數據庫的學習,包括MySQL,SQL語句都是位于核心部分的內容。需要注意的是SQL語言的使用要力求簡明扼要,能用一個select搞定的問題并不需要寫更多的union。所以在SQL語言的應用方面要注意高效。
數據庫(Database):
是按照數據結構來組織、存儲和管理數據的倉庫,每個數據庫都有一個或多個不同的API用于創建,訪問,管理,搜索和復制所保存的數據
關系型數據庫管理系統(RDBMS):
是建立在關系模型基礎上的數據庫,借助于集合代數等數學概念和方法來處理數據庫中的數據,存儲和管理的大數據量。
RDBMS即關系數據庫管理系統(Relational Database Management System)的特點:
(1)數據以表格的形式出現
(2)每行為各種記錄名稱
(3)每列為記錄名稱所對應的數據域
(4)許多的行和列組成一張表單
(5)若干的表單組成database
RDBMS 術語:
數據庫: 數據庫是一些關聯表的集合。.
數據表: 表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
列: 一列(數據元素) 包含了相同的數據, 例如郵政編碼的數據。
行:一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
冗余:存儲兩倍數據,冗余降低了性能,但提高了數據的安全性。
主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據。
外鍵:外鍵用于關聯兩個表。
復合鍵:復合鍵(組合鍵)將多個列作為一個索引鍵,一般用于復合索引。
索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。類似于書籍的目錄。
參照完整性: 參照的完整性要求關系中不允許引用不存在的實體。與實體完整性是關系模型必須滿足的完整性約束條件,目的是保證數據的一致性。
MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB公司開發,目前屬于Oracle公司。MySQL是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性。
MYSQL特點:
(1)Mysql是開源的,所以你不需要支付額外的費用。
(2)Mysql支持大型的數據庫。可以處理擁有上千萬條記錄的大型數據庫。
(3)MySQL使用標準的SQL數據語言形式。
(4)Mysql可以允許于多個系統上,并且支持多種語言。這些編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等
UPDATE worker_view4 SET name='hi';
ERROR............The target table worker_view4 of the UPDATE is not updatable.
(4)視圖中的SELECT中包含子查詢。
CREATE VIEW worker_view5(name)
AS SELECT (SELECT name FROM worker);
UPDATE worker_view5 SET name = '劉佳';
該視圖中包含了子查詢,因此也是不能更新的。
(5)由不可更新的視圖導出的視圖。
CREATE VIEW worker_view6
AS SELECT * FROM worker_view5;
UPDATE worker_view6 SET name = '王仔';
因為worker_view6是不可更新的視圖,所以worker_view6也不可以更新的視圖。使用UPDATE語句更新時,會出現系統報錯。
(6)創建視圖時,ALGORITHM為TEMPTABLE類型。
CREATE ALGORITHM=TEMPTABLE
VIEW worker_view7
AS SELECT * FROM worker;
UPDATE worker_view7 SET name = '王仔';
因為該視圖ALGORITHM為TEMPTABLE類型,所以worker_view7不可以更新的視圖。TEMPTABLE類型就是臨時表類型。系統默認臨時表是不能更新的。
(7)視圖對應的表上存在沒有默認值的列,而且該列沒有包含在視圖里。例如,表中包含的name字段沒有默認值,但是視圖中不包含該字段。那么這個視圖是不能更新的。因為,在更新視圖時,這個沒有默認值的記錄將沒有值插入,也沒有NULL值插入。數據庫系統是不會允許這樣的情況出現的,數據庫系統將會阻止這個視圖更新。
注意:視圖中雖然可以更新數據,但是有很多的限制。一般情況下,最好將視圖作為查詢數據的虛擬表,而不要通過視圖來更新數據。因為,使用視圖更新數據時,如果沒有全面考慮在視圖中更新數據的限制,可能會造成數據更新失敗。
除了上述條件不能更新視圖以外,WITH[CASCADED|LOCAL]CHECK OPTION也將決定視圖能否更新。"LOCAL"參數表示更新視圖時要滿足該視圖本身的定義的條件即可;
8.6 刪除視圖
刪除視圖是指刪除數據庫中已經存在的視圖。刪除視圖時,只能刪除視圖的定義,不會刪除數據。MYSQL中,使用DROP VIEW語句來刪除視圖,不會刪除數據。MySQL中,使用DROP VIEW語句來刪除視圖。但是,用戶必須擁有DROP權限。
DROP VIEW[IF EXISTS] 視圖名列表 [RESTRICT|CASCADE]
實例一:
SELECT Drop_priv
FROM mysql.user
WHERE user='root';
CREATE VIEW worker_view_del1
AS SELECT * FROM worker;
CREATE VIEW worker_view_del2
AS SELECT * FROM worker;
CREATE VIEW worker_view_del3
AS SELECT * FROM worker;
DROP VIEW IF EXISTS worker_view_del2, worker_view_del3;
8.7 本章實例
在test數據庫中work_info表上進行視圖操作。
1. 在test數據庫中work_info表
2. 插入記錄
3. 創建視圖info_view
4. 查看視圖info_view的基本結構和詳細結構
5. 查看視圖info_view的所有記錄
6. 修改視圖info_view
7. 更新視圖
8. 刪除視圖
work_info表的結構
字段名 字段描述 數據類型 主鍵 外鍵 非空 唯一 自增
id 編號 INT(10) 是 否 是 是 否
name 姓名 VARCHAR(20) 否 否 是 否 否
gender 姓別 VARCHAR(4) 否 否 是 否 否
age 年齡 INT(5) 否 否 否 否 否
address 家庭住址 VARCHAR(50) 否 否 否 否 否
tel 電話號碼 VARCHAR(20) 否 否 否 否 否
work_info表中的內容
id name gender age address tel
1 張三 M 18 北市市海淀區 01-155151
2 李四 M 22 北京市昌平區 01-215151
3 王五 F 17 湖南省永州市 025-545845
4 趙六 F 25 遼寧省阜新市 0625-514545
(1) 創建work_info表
USE test;
CREATE TABLE IF NOT EXISTS work_info (
id INT(10) NOT NULL UNIQUE PRIMARY KEY,
name VARCHAR(20) NOT NULL,
gender VARCHAR(4) NOT NULL,
age INT(5),
address VARCHAR(50),
tel VARCHAR(20)
) DEFAULT CHARSET=utf8;
(2)向work_info表中插入幾條記錄。
INSERT INTO work_info VALUES
(1, '張三', 'M', 18, '北市市海淀區','01-155151'),
(2,'李四', 'M', 22, '北京市昌平區', '01-215151'),
(3,'王五','F',17,'湖南省永州市','025-545845'),
(4,'趙六','F',25,'遼寧省阜新市','0625-514545');
(3) 創建視圖info_view。從work_info表中選出age20的記錄來創建視圖。視圖的字段包括id、name、gender和address。ALGORITHM設置為MERGE類型。加上WITH LOCAL CHECK OPTION條件。
CREATE ALGORITHM=MERGE
VIEW info_view(id, name, gender, address)
AS SELECT id, name, gender, address
FROM work_info
WHERE age20
WITH LOCAL CHECK OPTION;
(4)查看視圖info_view的基本結構和詳細結構。
SHOW CREATE VIEW info_view \G
(5)查看視圖info_view的所有記錄。
SELECT * FROM info_view;
(6)修改視圖info_view,使其顯示age20的信息,其他條件不變。
ALTER ALGORITHM=MERGE
VIEW info_view(id, name, gender, address)
AS SELECT id, name, gender, address
FROM work_info
WHERE age20
WITH LOCAL CHECK OPTION;
(7)更新視圖,將id為3的記錄進行更新。設置其gender為M。
UPDATE info_view SET gender='M' WHERE id=3;
(8)刪除視圖。
DROP VIEW info_view;
8.8 上機實踐
題目要求:
(1)在數據庫example下創建college表。
(2)在college表上創建視圖college_view。視圖的字段包括student_num、student_name、student_age和department。ALGORITHM設置為UNDEFINED類型。加上WITH LOCAL CHECK OPTION條件。
(3)查看視圖college_view的詳細結構。
(4)更新視圖。向視圖中插入三條記錄。
(5)修改視圖,使其顯示專業為"計算機"的信息,其他條件不變。
(6)刪除視圖college_view。
college表的結構
字段名 字段描述 數據類型 主鍵 外鍵 非空 唯一 自增
number 學號 INT(10) 是 否 是 是 否
name 姓名 VARCHAR(20) 否 否 是 否 否
major 專業 VARCHAR(20) 否 否 是 否 否
age 年齡 INT(5) 否 否 否 否 否
college_view表的內容
student_num student_name student_age department
0901 張三 20 外語
0902 李四 22 計算機
0903 王五 19 計算機
USE example;
CREATE TABLE college(
number INT(10) NOT NULL UNIQUE PRIMARY KEY,
name VARCHAR(20) NOT NULL,
major VARCHAR(20) NOT NULL,
age TINYINT(3)
) DEFAULT CHARSET=utf8;
CREATE ALGORITHM=UNDEFINED
VIEW college_view(student_num, student_name, student_age, department)
AS SELECT number, name, age, major
FROM college
WITH LOCAL CHECK OPTION;
SHOW CREATE VIEW college_view \G
INSERT INTO college_view VALUES
(0901, '張三', 20, '外語'),
(0902, '李四', 22, '計算機'),
(0903, '王五', 19, '計算機');
CREATE OR REPLACE ALGORITHM=UNDEFINED
VIEW college_view(student_num, student_name, student_age, department)
AS SELECT number, name, age, major
FROM college
WHERE major='計算機'
WITH LOCAL CHECK OPTION;
如果是初學的不建議使用命令行模式使用,建議使用navicat mysql或者phpmyadmin等可視化客戶端來學習,其中的函數就跟大多數語言一樣,什么數學函數,日期函數,字符串處理等大同小異的