mysql資料庫安裝
1.啟動和連結MySQL服務
檢視MySQL狀態:sudo service mysql status
啟動/停止/重啟:sudo service mysql start/stop/restart
連結資料庫:mysql -h 主機地址 -u 使用者名稱 -p
資料庫管理
檢視已有庫
show databases;
建立庫
create database 庫名 [character set utf8];
e.g. 建立stu資料庫,編碼為utf8 create database stu character set utf8; create database stu charset=utf8;
-
數字、字母、下劃線,但不能使用純數字
-
庫名區分字母大小寫
-
切換庫
use 庫名;
e.g. 使用stu資料庫 use stu;
檢視當前所在庫
select database();
刪除庫
drop database 庫名;
e.g. 刪除test資料庫 drop database test;
資料表管理
表的基本操作
建立表
create table 表名(欄位名 資料型別 約束,欄位名 資料型別 約束,...欄位名 資料型別 約束);
-
如果你想設定數字為無符號則加上 unsigned
-
如果你不想欄位為 NULL 可以設定欄位的屬性為 NOT NULL, 在操作資料庫時如果輸入該欄位的資料為NULL ,就會報錯。
-
DEFAULT 表示設定一個欄位的預設值
-
COMMENT 增加欄位說明
-
AUTO_INCREMENT定義列為自增的屬性,一般用於主鍵,數值會自動加1。
-
e.g. 建立班級表 create table class_1 (id int primary key auto_increment,name varchar(32) not null,age tinyint unsigned not null,sex enum('w','m'),score float default 0.0); e.g. 建立興趣班表create table interest (id int primary key auto_increment,name varchar(32) not null,hobby set('sing','dance','draw'),level char not null,price decimal(6,2),remark text);
檢視資料表
show tables;
查看錶結構
desc 表名;
檢視資料表建立資訊
show create table 表名;
刪除表
drop table 表名;
表資料基本操作
insert into 表名 values(值1),(值2),...; insert into 表名(欄位1,...) values(值1),...;
e.g. insert into class_1 values (2,'Baron',10,'m',91),(3,'Jame',9,'m',90); insert into class_1 (name,age,sex,score) values ('Lucy',17,'w',81);
select * from 表名 [where 條件]; select 欄位1,欄位2 from 表名 [where 條件];
e.g. select * from class_1;
select name,age from class_1;
e.g. select * from class_1 where age % 2 = 0;
e.g.
select * from class_1 where age > 8;
select * from class_1 where between 8 and 10;
select * from class_1 where age in (8,9);
e.g. select * from class_1 where sex='m' and age>9;
update 表名 set 欄位1=值1,欄位2=值2,... where 條件; 注意:update語句後如果不加where條件,所有記錄全部更新
e.g. update class_1 set age=11 where name='Abby';
delete from 表名 where 條件; 注意:delete語句後如果不加where條件,所有記錄全部清空
e.g. delete from class_1 where name='Abby';
語法 :alter table 表名 執行動作; * 新增欄位(add) alter table 表名 add 欄位名 資料型別; alter table 表名 add 欄位名 資料型別 first; alter table 表名 add 欄位名 資料型別 after 欄位名; * 刪除欄位(drop) alter table 表名 drop 欄位名; * 修改資料型別(modify) alter table 表名 modify 欄位名 新資料型別; * 修改欄位名(change) alter table 表名 change 舊欄位名 新欄位名 新資料型別; * 表重新命名(rename) alter table 表名 rename 新表名;
e.g. alter table hobby add tel char(11) after name; alter table hobby modify tel char(16); alter table hobby change tel phone char(16);
-
-
日期時間: DATETIME,TIMESTAMP
-
時間: TIME
-
時間格式
date :"YYYY-MM-DD" time :"HH:MM:SS" datetime :"YYYY-MM-DD HH:MM:SS" timestamp :"YYYY-MM-DD HH:MM:SS"
-
datetime :以系統時間儲存
-
e.g. create table marathon (id int primary key auto_increment,athlete varchar(32),birthday date,registration_time datetime,performance time);
-
-
now() 返回伺服器當前日期時間,格式對應datetime型別
-
-
時間操作
select * from marathon where birthday>='2000-01-01'; select * from marathon where birthday>="2000-07-01" and performance<="2:30:00";
LIKE用於在where子句中進行模糊查詢,SQL LIKE 子句中使用百分號%
來表示任意0個或多個字元,下劃線_
SELECT field1, field2,...fieldN FROM table_name WHERE field1 LIKE condition1
e.g. mysql> select * from class_1 where name like 'A%';
select name as 姓名,age as 年齡 from class_1; select * from class_1 as c where c.age > 17;
ORDER BY 子句來設定你想按哪個欄位哪種方式來進行排序,再返回搜尋結果。
SELECT field1, field2,...fieldN from table_name1 where field1 ORDER BY field1 [ASC [DESC]]
預設情況ASC表示升序,DESC表示降序
select * from class_1 where sex='m' order by age desc;
複合排序:對多個欄位排序,即當第一排序項相同時按照第二排序項排序
select * from class_1 order by score desc,age;
LIMIT 子句用於限制由 SELECT 語句返回的資料數量 或者 UPDATE,DELETE語句的運算元量
SELECT column1, column2, columnN FROM table_name WHERE field LIMIT [num] [OFFSET num]
查詢班級男生第三名 select * from cls where sex='m' order by score desc limit 1 offset 2;
UNION 操作符用於連線兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的資料。
SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions] UNION [ALL | DISTINCT] SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions];
select * from class_1 where sex='m' UNION ALL select * from class_1 where age > 9;
-
定義 : 當一個select語句中包含另一個select 查詢語句,則稱之為有子查詢的語句
-
from 之後 ,此時子查詢的內容作為一個新的表內容,再進行外層select查詢
select name from (select * from class_1 where sex='m') as s where s.score > 90;
注意: 需要將子查詢結果集重新命名一下,方便where子句中的引用操作
where字句中,此時select查詢到的內容作為外層查詢的條件值
select * from class_1 where age = (select age from class_1 where name='Tom');
-
子句結果作為一個值使用時,返回的結果需要一個明確值,不能是多行或者多列。
-
select * from cls where name in (select name from hobby);
通過之前的學習看到,一個完整的select語句內容是很豐富的。下面看一下select的執行過程:
(5)SELECT DISTINCT <select_list> (1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate> (2)WHERE <where_predicate> (3)GROUP BY <group_by_specification> (4)HAVING <having_predicate> (6)ORDER BY <order_by_list> (7)LIMIT <limit_number>
高階查詢練習 在stu下建立資料報表 sanguo 欄位:id name gender country attack defense create table sanguo( id int primary key auto_increment, name varchar(30), gender enum('男','女'), country enum('魏','蜀','吳'), attack smallint, defense tinyint ); insert into sanguo values (1, '曹操', '男', '魏', 256, 63), (2, '張遼', '男', '魏', 328, 69), (3, '甄姬', '女', '魏', 168, 34), (4, '夏侯淵', '男', '魏', 366, 83), (5, '劉備', '男', '蜀', 220, 59), (6, '諸葛亮', '男', '蜀', 170, 54), (7, '趙雲', '男', '蜀', 377, 66), (8, '張飛', '男', '蜀', 370, 80), (9, '孫尚香', '女', '蜀', 249, 62), (10, '大喬', '女', '吳', 190, 44), (11, '小喬', '女', '吳', 188, 39), (12, '周瑜', '男', '吳', 303, 60), (13, '呂蒙', '男', '吳', 330, 71); 查詢練習 1. 查詢所有蜀國人資訊,按照攻擊力排名 2. 將趙雲攻擊力設定為360,防禦設定為70 3. 吳國英雄攻擊力超過300的改為300,最多改2個 4. 查詢攻擊力超過200的魏國英雄名字和攻擊力並顯示為姓名, 攻擊力 5. 所有英雄按照攻擊力降序排序,如果相同則按照防禦生序排序 6. 查詢名字為3字的 7. 查詢攻擊力為魏國最高攻擊力的人還要高的蜀國英雄 8. 找到魏國排名2-3名的英雄 9. 查詢所有女性角色中攻擊力大於180的和男性中攻擊力小於250的
聚合操作指的是在資料查詢基礎上對資料的進一步整理篩選行為,實際上聚合操作也屬於資料的查詢篩選範圍。
方法 | 功能 |
avg(欄位名) | 該欄位的平均值 |
max(欄位名) | 該欄位的最大值 |
min(欄位名) | 該欄位的最小值 |
sum(欄位名) | 該欄位所有記錄的和 |
count(欄位名) | 統計該欄位記錄的個數 |
eg1 : 找出表中的最大攻擊力的值?
select max(attack) from sanguo;
eg2 : 表中共有多少個英雄?
select count(name) as number from sanguo;
eg3 : 蜀國英雄中攻擊值大於200的英雄的數量
select count(*) from sanguo where attack > 200;
注意: 此時select 後只能寫聚合函式,無法查詢其他欄位。
select country,avg(attack) from sanguo group by country;
e.g. : 對多個欄位建立分組,此時多個欄位都相同時為一組
select age,sex,count(*) from class1 group by age,sex;
e.g. : 所有國家的男英雄中 英雄數量最多的前2名的 國家名稱及英雄數量
select country,count(id) as number from sanguo where gender='M' group by country order by number DESC limit 2;
聚合篩選
having語句
對分組聚合後的結果進行進一步篩選
eg1 : 找出平均攻擊力大於105的國家的前2名,顯示國家名稱和平均攻擊力 select country,avg(attack) from sanguo group by country having avg(attack)>105 order by avg(attack) DESC limit 2;
-
having語句必須與group by聯合使用。
-
eg1 : 表中都有哪些國家 select distinct name,country from sanguo; eg2 : 計算一共有多少個國家 select count(distinct country) from sanguo;
注意: distinct和from之間所有欄位都相同才會去重
eg1: 查詢時顯示攻擊力翻倍 select name,attack*2 from sanguo; eg2: 更新蜀國所有英雄攻擊力 * 2 update sanguo set attack=attack*2 where country='蜀國';
索引操作
-
定義
索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。
-
優缺點
-
優點 : 加快資料檢索速度,提高查詢效率
-
缺點 :佔用資料庫物理儲存空間,當對錶中資料更新時,索引需要動態維護,降低資料寫入效率
-
注意 :
通常我們只在經常進行查詢操作的欄位上建立索引
索引分類
普通索引 :欄位值無約束,KEY標誌為 MUL
-
唯一索引(UNI)
唯一索引(unique) :欄位值不允許重複,但可為 NULL,KEY標誌為 UNI
-
主鍵索引(PRI)
一個表中只能有一個主鍵欄位, 主鍵欄位不允許重複,且不能為NULL,KEY標誌為PRI。通常設定記錄編號欄位id,能唯一鎖定一條記錄
create table 表名( 欄位名 資料型別, 欄位名 資料型別, index 索引名(欄位名), index 索引名(欄位名), unique 索引名(欄位名) );
在已有表中建立索引:
create [unique] index 索引名 on 表名(欄位名);
e.g. create unique index name_index on cls(name);
主鍵索引新增
alter table 表名 add primary key(id);
檢視索引
1、desc 表名; --> KEY標誌為:MUL 、UNI。 2、show index from 表名;
刪除索引
drop index 索引名 on 表名; alter table 表名 drop primary key; # 刪除主鍵
擴充套件: 藉助效能檢視選項去檢視索引效能
set profiling = 1; 開啟功能 (專案上線一般不開啟) show profiles 檢視語句執行資訊
外來鍵約束和表關聯關係
-
-
foreign key 功能 : 建立表與表之間的某種約束的關係,由於這種關係的存在,能夠讓表與表之間的資料,更加的完整,關連性更強,為了具體說明建立如下部門表和人員表。
-
# 建立部門表 CREATE TABLE dept (id int PRIMARY KEY auto_increment,dname VARCHAR(50) not null);
# 建立人員表 CREATE TABLE person ( id int PRIMARY KEY AUTO_INCREMENT, name varchar(32) NOT NULL, age tinyint DEFAULT 0, sex enum('m','w','o') DEFAULT 'o', salary decimal(8,2) DEFAULT 250.00, hire_date date NOT NULL, dept_id int ) ;
上面兩個表中每個人員都應該有指定的部門,但是實際上在沒有約束的情況下人員是可以沒有部門的或者也可以新增一個不存在的部門,這顯然是不合理的。
-
主表和從表:若同一個資料庫中,B表的外來鍵與A表的主鍵相對應,則A表為主表,B表為從表。
[CONSTRAINT symbol] FOREIGN KEY(外來鍵欄位) REFERENCES tbl_name (主表主鍵) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
該語法可以在 CREATE TABLE 和 ALTER TABLE 時使用
# 建立表時直接簡歷外來鍵 CREATE TABLE person ( id int PRIMARY KEY AUTO_INCREMENT, name varchar(32) NOT NULL, age tinyint DEFAULT 0, sex enum('m','w','o') DEFAULT 'o', salary decimal(10,2) DEFAULT 250.00, hire_date date NOT NULL, dept_id int , constraint dept_fk foreign key(dept_id) references dept(id));
# 建立表後增加外來鍵 alter table person add constraint dept_fk foreign key(dept_id) references dept(id);
注意: 1. 並不是任何情況表關係都需要建立外來鍵來約束,如果沒有類似上面的約束關係時也可以不建立。 2. 從表的外來鍵欄位資料型別與指定的主表主鍵應該相同。
通過外來鍵名稱解除外來鍵約束
alter table person drop foreign key dept_fk; # 檢視外來鍵名稱 show create table person;
注意:刪除外來鍵後發現desc檢視索引標誌還在,其實外來鍵也是一種索引,需要將外來鍵名稱的索引刪除之後才可以。
-
restrict(預設) : on delete restrict on update restrict
-
當主表刪除記錄時,如果從表中有相關聯記錄則不允許主表刪除
-
當主表更改主鍵欄位值時,如果從表有相關記錄則不允許更改
-
-
cascade :資料級聯更新 on delete cascade on update cascade
-
當主表刪除記錄或更改被參照欄位的值時,從表會級聯更新
-
-
set null : on delete set null on update set null
-
當主表刪除記錄時,從表外來鍵欄位值變為null
-
當主表更改主鍵欄位值時,從表外來鍵欄位值變為null
-
一對一關係
create table student(id int primary key auto_increment,name varchar(50) not null); create table record(id int primary key auto_increment, comment text not null, st_id int unique, constraint st_fk foreign key(st_id) references student(id) on delete cascade on update cascade );
一對多關係
create table person( id varchar(32) primary key, name varchar(30), sex char(1), age int ); create table car( id varchar(32) primary key, name varchar(30), price decimal(10,2), pid varchar(32), constraint car_fk foreign key(pid) references person(id) );
多對多關係
一對錶中(A)的一條記錄能夠對應另外一張表(B)中的多條記錄;同時B表中的一條記錄
也能對應A表中的多條記錄
舉例:一個運動員可以報多個專案,每個專案也會有多個運動員參加,這時為了表達多對多關係需要單獨建立關係表。
CREATE TABLE athlete ( id int primary key AUTO_INCREMENT, name varchar(30), age tinyint NOT NULL, country varchar(30) NOT NULL, description varchar(30) ); CREATE TABLE item ( id int primary key AUTO_INCREMENT, rname varchar(30) NOT NULL ); CREATE TABLE athlete_item ( id int primary key auto_increment, aid int NOT NULL, tid int NOT NULL, CONSTRAINT athlete_fk FOREIGN KEY (aid) REFERENCES athlete (id), CONSTRAINT item_fk FOREIGN KEY (tid) REFERENCES item (id) );
表連線
如果多個表存在一定關聯關係,可以多表在一起進行查詢操作,其實表的關聯整理與外來鍵約束之間並沒有必然聯絡,但是基於外來鍵約束設計的具有關聯性的表往往會更多使用關聯查詢查詢資料。
簡單多表查詢
select 欄位1,欄位2... from 表1,表2... [where 條件]
e.g. select * from dept,person where dept.id = person.dept_id;
內連線
SELECT 欄位列表 FROM 表1 INNER JOIN 表2 ON 表1.欄位 = 表2.欄位;
select * from person inner join dept on person.dept_id =dept.id;
笛卡爾積
笛卡爾積就是將A表的每一條記錄與B表的每一條記錄強行拼在一起。所以,如果A表有n條記錄,B表有m條記錄,笛卡爾積產生的結果就會產生n*m條記錄。
select * from person inner join dept;
左連線 :
左表全部顯示,顯示右表中與左表匹配的項
SELECT 欄位列表 FROM 表1 LEFT JOIN 表2 ON 表1.欄位 = 表2.欄位;
select * from person left join dept on person.dept_id =dept.id; # 查詢每個部門員工人數 select dname,count(name) from dept left join person on dept.id=person.dept_id group by dname;
右連線 :
右表全部顯示,顯示左表中與右表匹配的項
SELECT 欄位列表 FROM 表1 RIGHT JOIN 表2 ON 表1.欄位 = 表2.欄位;
select * from person right join dept on person.dept_id =dept.id;
綜合查詢練習 create table class(cid int primary key auto_increment, caption char(4) not null); create table teacher(tid int primary key auto_increment, tname varchar(32) not null); create table student(sid int primary key auto_increment, sname varchar(32) not null, gender enum('male','female','others') not null default 'male', class_id int, foreign key(class_id) references class(cid) on update cascade on delete cascade); create table course(cid int primary key auto_increment, cname varchar(16) not null, teacher_id int, foreign key(teacher_id) references teacher(tid) on update cascade on delete cascade); create table score(sid int primary key auto_increment, student_id int, course_id int, number int(3) not null, foreign key(student_id) references student(sid) on update cascade on delete cascade, foreign key(course_id) references course(cid) on update cascade on delete cascade); insert into class(caption) values('三年二班'),('三年三班'),('三年一班'); insert into teacher(tname) values('波多老師'),('蒼老師'),('小澤老師'); insert into student(sname,gender,class_id) values('鋼蛋','female',1),('鐵錘','female',1),('山炮','male',2),('彪哥','male',3); insert into course(cname,teacher_id) values('生物',1),('體育',1),('物理',2); insert into score(student_id,course_id,number) values(1,1,60),(1,2,59),(2,2,100),(3,2,78),(4,3,66); 1. 查詢每位老師教授的課程數量 2. 查詢學生的資訊及學生所在班級資訊 3. 查詢各科成績最高和最低的分數,形式 : 課程ID 課程名稱 最高分 最低分 4. 查詢平均成績大於85分的所有學生學號,姓名和平均成績 5. 查詢課程編號為2且課程成績在80以上的學生學號和姓名 6. 查詢各個課程及相應的選修人數
檢視
建立檢視
語法結構: CREATE [OR REPLACE] VIEW [view_name] AS [SELECT_STATEMENT]; 釋義: CREATE VIEW: 建立檢視 OR REPLACE : 可選,如果新增原來有同名檢視的情況下會覆蓋掉原有檢視 view_name : 檢視名稱 SELECT_STATEMENT :SELECT語句 e.g. create view c1 as select name,age from class_1;
檢視現有檢視
show full tables in stu where table_type like 'VIEW';
刪除檢視
drop view if exists c1;
alter view c1 as select name,age,score from class_1;
-
是對資料的一種重構,不影響原資料表的使用。
-
簡化高頻複雜操作的過程,就像一種對複雜操作的封裝。
-
提高安全性,可以給不同使用者提供不同的檢視。
-