1. 程式人生 > 實用技巧 >mysql資料庫安裝

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;

注意:庫名的命名

  1. 數字、字母、下劃線,但不能使用純數字

  2. 庫名區分字母大小寫

  3. 不要使用特殊字元和mysql關鍵字

切換庫

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。

  • PRIMARY KEY 關鍵字用於定義列為主鍵。主鍵的值不能重複,且不能為空。

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)

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)

select * from 表名 [where 條件];
select 欄位1,欄位2 from 表名 [where 條件];
e.g. 
select * from class_1;
select name,age from class_1;

where子句

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)

update 表名 set 欄位1=值1,欄位2=值2,... where 條件;

注意:update語句後如果不加where條件,所有記錄全部更新
e.g.
update class_1 set age=11 where name='Abby';

刪除表記錄(delete)

delete from 表名 where 條件;

注意:delete語句後如果不加where條件,所有記錄全部清空
e.g.
delete from class_1 where name='Abby';

表字段的操作(alter)

語法 :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);

時間型別資料

  • 日期 : DATE

  • 日期時間: DATETIME,TIMESTAMP

  • 時間: TIME

  • 年份 :YEAR

時間格式

date :"YYYY-MM-DD"
time :"HH:MM:SS"
datetime :"YYYY-MM-DD HH:MM:SS"
timestamp :"YYYY-MM-DD HH:MM:SS"

注意:

  1. datetime :以系統時間儲存

  2. timestamp :以標準時間儲存但是檢視時轉換為系統時區,所以表現形式和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%';

as 用法

在sql語句中as用於給欄位或者表重新命名

 select name as 姓名,age as 年齡 from class_1;
 select * from class_1 as c where c.age > 17;

排序

ORDER BY 子句來設定你想按哪個欄位哪種方式來進行排序,再返回搜尋結果。

使用 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語句的運算元量

帶有 LIMIT 子句的 SELECT 語句的基本語法如下:

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 語句會刪除重複的資料。

UNION 操作符語法格式:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

預設UNION後衛 DISTINCT表示刪除結果集中重複的資料。如果使用ALL則返回所有結果集, 包含重複資料。

 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');

注意:

  1. 子句結果作為一個值使用時,返回的結果需要一個明確值,不能是多行或者多列。

  2. 如果子句結果作為一個集合使用,即where子句中是in操作,則結果可以是一個欄位的多個記錄。

 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 後只能寫聚合函式,無法查詢其他欄位。

聚合分組

group by

  給查詢的結果進行分組

e.g. : 計算每個國家的平均攻擊力

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;

注意

  1. having語句必須與group by聯合使用。

  2. having語句存在彌補了where關鍵字不能與聚合函式聯合使用的不足,where只能操作表中實際存在的欄位。

去重語句

distinct語句

  不顯示欄位重複值

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='蜀國';

索引操作

概述

  • 定義

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。

  • 優缺點

    • 優點 : 加快資料檢索速度,提高查詢效率

    • 缺點 :佔用資料庫物理儲存空間,當對錶中資料更新時,索引需要動態維護,降低資料寫入效率

注意 :

  1. 通常我們只在經常進行查詢操作的欄位上建立索引

  2. 對於資料量很少的表或者經常進行寫操作而不是查詢操作的表不適合建立索引

索引分類

  • 普通(MUL)

普通索引 :欄位值無約束,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);

檢視索引

1desc 表名;  --> 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表為從表。

  • foreign key 外來鍵的定義語法:

[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;

視圖表的增刪改查操作

檢視的增刪改查操作與一般表的操作相同,使用insert update delete select即可,但是原資料表的約束條件仍然對檢視產生作用。

檢視現有檢視

show full tables in stu where table_type like 'VIEW';

刪除檢視

drop view [IF EXISTS] 檢視名;

IF EXISTS 表示如果存在,這樣即使沒有指定檢視也不會報錯。

drop view if exists c1;

修改檢視

參考建立檢視,將create關鍵字改為alter

alter view  c1 as select name,age,score from class_1;

檢視作用

  1. 是對資料的一種重構,不影響原資料表的使用。

  2. 簡化高頻複雜操作的過程,就像一種對複雜操作的封裝。

  3. 提高安全性,可以給不同使用者提供不同的檢視。

  4. 讓資料更加清晰。

缺點

  1. 檢視的效能相對較差,從資料庫檢視查詢資料可能會很慢。