1. 程式人生 > >深入淺出MySQL筆記(一)

深入淺出MySQL筆記(一)

本筆記為學習該書所記,便於複習。
包含第一、二章筆記。

第一部分 基礎篇

第1章 mysql的安裝與配置

MySQL的下載 :

分為windows平臺,Linux平臺兩種

MySQL的安裝

MySQL的配置

啟動和關閉MySQL

第2章 SQL基礎

SQL簡介

Structure Query Language(結構化查詢語言)

(My)SQL使用入門

SQL分類

DDL—(Data Definition Languages)語句—(資料定義語言)
DML—(Data Manipulation Language)語句—(資料操作語句)
DCL—(Data Control Language)語句—(資料控制語句)

DDL語句

1 建立資料庫

1.1 連線到mysql伺服器
在安裝好Mysql後,要建立資料庫,首先要連線到MySQL伺服器。
在MAC中開啟終端,輸入

mysql -u root -p

然後輸入密碼,即可連線。
這時候會顯示一些資訊。包括:
命令結束符”;”或者”\g”
客戶連結ID,記錄了到目前為止的連線次數
版本
顯示幫助

1.2 建庫

CREATE DATABASE dbname;

1.3檢視資料庫

show databases;

1.4 選擇資料庫

USE dbname

1.5 檢視資料庫中的表

show tables;

必須先選擇資料庫後才能看錶。

2 刪除資料庫
drop database dbname;
3 建立表

3.1 建表
語法

CREATE TABLE tablename(
column_name_1 column_type_1 constraints,
column_name_n column_type_n constraints);

案例

create table emp(
ename varchars(10),
hiredate date,
sal decimal(10,2),
deptno int(2)
);

3.2 查看錶定義

DESC tablename

3.3 檢視建立表的SQL語句

show create table emp \G;
4 刪除表
DROP TABLE tablename
5 修改表

5.1 修改表型別

ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST|AFTER col_name]

例子

alter table emp modify ename varchar(20);

5.2 增加表字段

ALTER TABLE  tablename ADD [COLUMN] column_definition [FIRST|AFTER col_name]

例子

alter table emp add column age int(3);

5.3 刪除表字段

ALTER TABLE tablename Drop [COLUMN] col_name

例子

alter table emp drop column age;

5.4 欄位改名

ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]

例子

alter table emp change age age1 int(4)

注意,change和modify都可以修改表定義,不同的是change修改表名,所以需要寫兩次表名,modify不能修改表名。

5.5 修改欄位排列順序
ADD/CHANGE/MODIFY都有可選項first|after column
ADD增加的新欄位預設加在最後位置。
用FIRST可以放在最前面
例如

alter table emp modify age int(3) first;

用after放在某個欄位之後
例如

alter table emp add birth data after ename;

CHANGE/FIRST|AFTER COLUMN 這些關鍵字都屬於Mysql在標準SQL上的擴充套件,其他資料庫不一定適用。

5.6 更改表名

ALTER TABLE tablename RENAME[TO] new_tablename

例子

alter table emp rename emp1;

DML語句

1插入記錄

insert

INSERT INTO tablename(field1,field2..) VALUES(value1,value2..)

也可以不指定欄位名

insert into emp
values('lisa','2003-03-03','3000',2);

一次性插入多條記錄

INSERT INTO tablename (field1,field2..)
VALUES
(record1_value1,record1_value2...record1_valuen),
...
(recordn_value1,recordn_value2...recordn_valuen)
;
2更新記錄

update

UPDATE tablename SET field1=values,field2=value2..fieldn=valuen[WHERE CONDITION]

可以同時更新多個表中的資料

UPDATE t1,t2..tn SET t1.field1=expr1...tn.fieldn=exprn [WHERE CONDITION]

例子

update emp a,dept b set a.sal=a.sal*b.deptno,b.deptname=a.ename
where a.deptno=b.deptno;

注意,多表更新的語法更多地用在了根據一個表的欄位來動態地更新另外一個表的欄位

3刪除記錄

delete

DELETE FROM tablename [WHERE CONDITION]

例子

delete from emp where ename='dony';

一次刪除多個表的記錄

DELETE t1,t2...tn FROM t1,t2...tn [WHERE CONDITION]

如果from後面的表名用別名,則delete後面也要用相應的別名。
例子

delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;

不管單表還是多表,不加where條件將會把所有表的所有記錄刪除,因此操作小心。

4 查詢記錄

4.1 select

SELECT * FROM tablename [WHERE CONDITION]

4.2 查詢不重複的記錄
distinct

select distinct deptno from emp;

4.3 條件查詢
where

select * from emp where deptno=1;
select * from emp where deptno=1 and sal<3000;

4.4 排序和限制
排序order by
DESC降序ASC升序

SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DES|ASC]...fieldn[DESC|ASC]]

限制limit

SELECT...[LIMIT offset_start,row_count]
##其中offset_start表示記錄的起始偏移量,row_count表示顯示的行數

例子

select * from emp oeder by sal limit 1,3;
輸出排序後從第二條記錄開始的3條記錄

limit經常和order by一起配合使用來進行記錄的分頁顯示
limit屬於Mysql擴充套件sql92後的語法,在其他資料庫上並不能通用

4.5 聚合

SELECT [field1,field2...fieldn] fun_name   ##fun_name表示聚合函式
FROM tablename
[WHERE where_contition]
GROUP BY field1,field2...fieldn     ##GROUP BY後是待聚合欄位
[WITH ROLLUP]     ##可選,表示對聚合後結果進行再彙總
[HAVING where_condition]   #表示對結果再進行條件過濾

注意,having和where的區別在於,where在聚合前對記錄進行過濾,having是對聚合後的結果進行條件過濾。
儘可能先用where先過濾記錄,這樣結果集減小,對聚合效率大大提高
例子

select deptno,count(1) from emp group by deptno with rollup
##統計各部門人數後彙總統計總人數

4.6 表連線
內連線
關鍵字
where…=…
from…inner join…on
from…left join…on

select ename,deptname from emp,dept where emp.deptno=dept.deptno;
select field1...fieldn from tablename inner join table on join_condition;

外連線
左連線
查詢emp中所有使用者名稱和所在部門名稱

select ename,deptname from emp left join dept on emp.deptno=dept.deptno;

右連線

select ename,deptname from dept right join emp on dept.deptno=emp.deptno;

4.7 子查詢
關鍵字
in,
not in,
=,
!=,
exists,
not exists

select * from emp where deptno in(select deptno from dept);

某些條件下,子查詢可轉化為表連線,條件的、外連線、內連線都可以使用

select emp.* from emp,dept where emp.deptno=dept.deptno;

書上說表關聯的效率要高於子查詢,因為子查詢走的是笛卡爾積。而培訓班老師所子查詢效率高於表連線。。。
表關聯可能有多條記錄,子查詢只有一條記錄,如果需要唯一的列,最好走子查詢。

4.8 記錄聯合
關鍵字,union,union all
union是將union all結果去重DISTINCT

SELECT * FROM t1
UNION|UNION ALL
SELECT * FROM t2

例子

select deptno from emp
union all
select deptno from dept;

DCL語句

用的比較少,簡單寫下
建立一個數據庫使用者z1,具有對sakila資料庫中所有表的SELECT/INSERT許可權
關鍵詞grant

grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';

許可權變更,需要收回z1的INSERT許可權
關鍵詞revoke

revoke insert on sakila.* from 'z1'@'localhost';

幫助的使用

按照層次看幫助

?contents

?+類別名稱
例如

? data types

快速查閱幫助

? 關鍵字

例如

? show;
? create table;

常用的網路資源

查詢元資料資訊

information_schema資料庫

元資料資訊,資料的資料,虛擬資料庫,物理上並不存在相關目錄檔案。庫裡show tables顯示的表全部是檢視

常見場景

1刪除資料庫test1下所有字首為tmp的表
select concat ('drop table test1.,'table_name,';') from tables
where table_schema = 'test1' and table_name like 'tmp%';
## concat 將多個數組組合成新的陣列
2將資料庫test1下所有儲存引擎為mysiam的表改為innodb
select concat ('alter table test1.',table_name,'engine = innodb;') from tables
where table_schema = 'test1' and engine = 'MyISAM';
3常用檢視

SCHEMATA:
提供了當前mysql例項中所有資料庫的資訊
show databases的結果取自此表
TABLES:
提供了關於資料庫中表的資訊(包括檢視),詳述了某個表屬於哪個schema、表型別、表引擎、建立時間等資訊
show tables from schemaname的結果取之此表
COLUMNS:
提供了表中的列資訊,詳述了某張表的所有列以及每個列的資訊
show columns from schemaname.tablename的結果取自此表
STATISTICS:
該表提供了關於表索引的資訊
show index from schemaname.tablename的結果取自此表