Mac終端操作Mysql,以及Mysql的操作
首先手動啟動Mysql應用程式
開啟終端輸入如下命令: /usr/local/mysql/bin/mysql -u root -p
(注意:Windows下的是: mysql -u root -p)
其中root為使用者名稱。這時會出現如下命令:Enter password: 123456這樣就可以訪問你的資料庫伺服器了。
資料庫操作
下面介紹一些關於從資料庫建立到使用的一些簡單的方法;
建立一個名字為mydatabase資料庫: create database mydatabase ;
可以用以下地命令來檢視建立的資料庫是否成功:
更改資料庫名字 : alter databases Hdatabase ;
更改資料庫mydatabase的字符集 : alter database mydatabase charset GBK ;
進入資料庫:use mydatabase ;用下面的命令來檢視該資料庫中的表:show tables ;
表操作
用下面的命令來建立表:create table student (
name varchar(10) ,
gender varchar(10) ,
sno int primary key(id)
)charset utf8;
用下面的命令來檢查表的建立是否成功: show tables;
檢視該表結構,表中欄位的資訊: desc 表名 ; describe 表名; show columns from 表名;
修改表名:
alter table 舊錶名 rename 新表名; alter table student rename my_student;
修改欄位,欄位操作很多:新增(add)、修改(modify)、重名(change)、刪除(drop)
--給學生表增加ID放到第一個位置。 alter table 表名 add 欄位名 資料型別[位置];
alter table my_student add id int first;
---將學生表中的number學號欄位變成固定長度,且放到第二位。 alter table 表名 modify 欄位名 資料型別 [位置];
alter table my_student modify number char(10) after id;
---修改學生表中的gender欄位為sex。 alter table 表名 change 舊欄位名 新欄位名 資料型別 ; alter table my_student change gender sex varchar(10);
---刪除學生表中的欄位age。 alter table 表名 drop 欄位名;
alter table my_student drop age;
刪除資料表: drop table 表名1,表名2,……; 一次性刪除多個表
資料操作
---新增資料(插入全表字段資料) insert into my_student values('Jim','female',1106101);
---新增資料(指定欄位列表) insert into my_student(number,sex) values(1106,'male');
---檢視所有的資料 select *
from 表名
[where 條件];
---更新資料 alter是操作資料庫,表,欄位。 update更新資料
--更新名字叫Jim的性別。 update 表名 set 欄位 = 值[where 條件];
update my_student set sex = 'female' where name = 'Jim';
---刪除資料
--刪除表中性別男的 delete from 表名 [where 條件];
delete from my_student where sex = 'male';
中文資料問題本質是字符集問題,set names gbk; 一定要設定字符集。
外來鍵:如果一張表中有一個字鍵段(非主鍵)指向另外一張表的主鍵,那麼將該欄位稱之為外來鍵。
主鍵問題
主鍵直接在欄位之後,可以有多個欄位作為主鍵,這樣的主鍵稱為複合主鍵。
沒有主鍵,追加主鍵 alter table my_database modify course char(10) primary key;
沒有主鍵,追加複合主鍵 alter table my_student add primary key (sno,cno);
更新主鍵 & 刪除主鍵 alter table 表名 drop primary key;
正規化:終極目標為了減少資料的冗餘,凡是通過關係尋找出來的資料,堅決不再重複儲存。
第一正規化:在設計表儲存資料時,資料具有原子性。
如表(姓名,性別,教課時間(開始,結束)) 此表的教課時間仍可拆分,不具備原子性。
解決辦法(姓名,性別,開始,結束)
第二正規化:解決表設計出現的部分依賴,部分依賴就是存在欄位依賴主鍵中某個欄位(主鍵的部分)。只要不存在複合主鍵,表的設計就一定滿足2NF
如一張表中有(講師,性別,班級,教室,帶課時間,開始時間,結束時間) 因為講師沒辦法作為主鍵,需要結合講師班級才能作為主鍵(一個老師在一個班只帶一個階段的課,性別並不依賴班級,只依賴講師;教室不依賴講師,只依賴班級,因此出現了性別和教室依賴主鍵中的一部分)
解決方案: 可以將性別與講師單獨成表,班級與教室也單獨成表,以此取消複合主鍵。
有人也認為可以使用邏輯主鍵,例如增加IDP。這樣真的可以嗎? 不可以,如下,會出現傳遞依賴。
第三正規化:理論上講,應該一張表中的所有欄位都直接依賴主鍵,如果表設計中存在一個欄位,並不直接依賴主鍵,而是通過某個非主鍵欄位依賴,最終實現依賴主鍵,如一張表中有(主鍵IDP,講師,性別,班級,教室,帶課時間,開始時間,結束時間) 性別依賴於講師,講師依賴於主鍵IDP;教室依賴班級,班級依賴主鍵IDP。性別和教師都存在傳遞依賴。
解決方案:將存在傳遞依賴的欄位,以及依賴的欄位本身單獨取出,形成一個單獨的表,然後在需要對應的資訊的時候,使用對應的實體表的主鍵加進來。一句話就是實體單獨建表。
查詢資料完整語法
select 欄位名/*
from 資料來源
[where 條件子句]
[group by 子句]
[having 子句]
[order by 子句]
[limit 子句];
select * from my_student;
---去重
select distinct * from my_student;
--插入資料
insert into my_student values(null,'itcast01','張三','男'),(null,'itcast02','李四','男'),(null,'itcast03','王五','女'),(null,'itcast03','男');
--欄位別名
select id,number as 學號,name as 姓名, sex 性別
from my_student;
where子句
原理:where是唯一一個直接從磁盤獲取資料的時候就開始判斷的條件:從磁碟取出一條記錄,開始進行where判斷,判斷的結果如果成立儲存到記憶體,反之放棄。
---找學生id為1,3,5的學生
select * from my_student where id =1 || id =3 || id =5;
或者select * from my_student where id in(1,3,5);
group by 欄位 [asc/desc]; 分組 根據某個欄位進行分組,相同的放一組,不同的分到不同的組。統計的是資料,不是記錄
--按性別分組
select * from my_student group by sex; 這是絕對錯誤的,分組是為了統計資料,按分組欄位進行資料統計
SQL提供了一系列統計函式
Count(); 統計分組後的記錄數,每一相同的組有多少行記錄
Max(); 統計每組最大的值
Min(); 統計每組最小的值
Avg(); 統計每組的平均值
Sum(); 統計每組的和
---身高高矮,平均年齡,和總年齡
select sex,count(*),max(height),min(height),avg(age),sun(age) from my_student group by sex;
注意使用group by卻不使用統計函式,沒意義!
多欄位分組:先根據一個欄位進行分組,然後對分組後的結果再次按照其他欄位分組。
having子句
與where子句一樣進行條件判斷,思考:為什麼是group by……having…… 而不是group by……where???
進行資料統計時,是資料進入記憶體之後,會進行分組-》統計-》having條件判斷。而where是針對從磁碟讀取資料時進行判斷,此刻還沒分組,進行統計就判斷了。所以錯誤!!!
---求出所有班級人數大於等於2的學生人數
order by 子句
order by根據某個欄位進行升序或降序排序,依賴校對集
基本語法: order by 欄位名 [asc/desc]; asc升序 可不寫 desc降序
limit子句是一種限制結果的語句
1)用來限制數量
--查詢學生前兩個 select * from my_student limit 2;
2)限制起始位置 limit 起始位置,長度
--查從編號4開始,詢找兩個學生
select * from my_student limit 4,2;
內連線,外連線,自然連線,交叉連線
內連線,從左表中取出每一條記錄,和右表中所有的記錄進行匹配,匹配必須是左表中與右表中某個條件相同,最終會保留結果,否則不保留。
基本語法: 左表 [inner] join 右表 on 左表.欄位 = 右表.欄位;
select * from my_student inner join my_class on my_student.C_id = mu_class.id;
左外連線:左表為主,然後每條記錄與右表進行連線,不管能不能匹配的上,左表都會保留。能匹配,右表某條記錄保留,不能匹配,某條記錄置為NULL,最終記錄數至少不少於左表已有的記錄。
基本語法: 左表 left join 右表 on 左表.欄位 = 右表.欄位;
a表 id name b表 id job parent_id
1 張3 1 23 1
2 李四 2 34 2
3 王武 3 34 4
a.id同parent_id 存在關係
--------------------------------------------------
1) 內連線
select a.*,b.* from a inner join b on a.id=b.parent_id
結果是
1 張3 1 23 1
2 李四 2 34 2
2)左連線
select a.*,b.* from a left join b on a.id=b.parent_id
結果是
1 張3 1 23 1
2 李四 2 34 2
3 王武 null
3) 右連線
select a.*,b.* from a right join b on a.id=b.parent_id
結果是
1 張3 1 23 1
2 李四 2 34 2
null 3 34 4
4) 完全連線
select a.*,b.* from a full join b on a.id=b.parent_id
結果是
1 張3 1 23 1
2 李四 2 34 2
null 3 34 4
3 王武 null