MySQL資料庫學習
MySQL安裝:
①安裝之前的檢查
sudo service mysql start
②ubuntu Linux安裝配置MySQL
#安裝MySQL服務端核心程式
sudo apt-get install mysql-server
#安裝MySQL客戶端
sudo apt-get install mysql-client
#安裝結束後,用命令驗證是否安裝並啟動成功
sudo netstat -tap | grep mysql
sudo gedit /etc/mysql/my.cnf # 修改MySQl的配置檔案
③開啟MySQL
#啟動MySQL服務 sudo service mysql start #使用root使用者登入 mysql -u root
一、初識MySQL
1、認識MySQL
MySQL是一個真正的多使用者執行緒SQL資料庫伺服器。
2、建立資料庫
create database test;
3、建立資料庫表:所有的資料操作都是針對表的
create table test01_01(name varchar(40), age int(5));
4、新增資料
insert into test01_01 values('wangwu', 21);
5、查詢資料
select * from test01_01;
6、修改資料
update test01_01 set name='zhangsan',age=10 where name='wangwu';
7、刪除資料
delete from test01_01 where name='zhangsan';
8、載入檔案中的資料
source /home/shiyanlou/Desktop/SQL4/MySQl-04-01.sql
二、資料庫操作
1、建立資料庫
create database [if not exists] db_name;
2、顯示資料庫
show databases [like wild];
①有時知道資料庫的部分名字
show databases like 'te%'; //關鍵字like配合萬用字元一起使用 show databases like '%st';
SQL萬用字元_和%:_代表一個未指定的字元,%代表不定個未指定字元
②顯示全部資料庫
show database;
3、選用資料庫
use database;
4刪除資料庫
drop database [if exists] db_name;
查出當前選擇了那個database:select database();
三、資料表操作
1、建立資料表
create table tb1_name(create_definition,...) [type=table_type]
create_definition:col_name type[not null|null] [default_value] [auto_increment] [primary_key]
內容可選:是否為空,是否有預設值,是否為主鍵,是否自增長等
增加自增:(初始忘新增)
alter table course change id id int not null auto_increment;
例如:
create table test01_02(id varchar(50) not null auto_increment primary key, name varchar(40) null default "002",
age int(5) null default 44);
create table animals(id int(5) not null Auto_increment,name char(20) not null, primary key(id));
2、select建立資料庫表
create table tb_new_name select * from tb_old_name;
上述語句表示,從後者的表中複製一份新增新的資料庫表中,前面的表是新的,之前是不存在的。
eg:create table test01_03 select * from test01_01;
3、顯示資料庫資訊
show tables [from db_name] [like wild]
show columns from tbl_name [from db_name] [like wild]
show index from tbl_name [from db_name]
{describe|desc} tbl_name {col_name | wild}
4、修改表結構
①增加列
alter table tbl_name add col_name type constraint(約束)
eg:alter table test01_01 add weight int; //增加一個weight列
②修改列
alter table test01_01 modify weight varchar(50); //修改type
③刪除列
alter table test01_01 drop weight;
④給列更名
alter table test01_01 change weight wei int; //型別不能省略,否則更名失敗
⑤給表更名
alter table test01_01 rename (to) test01_04;
或 rename table test01_01 to test01_04;
5、刪除資料庫表
drop table [if exists] tbl_name [,tbl_name, ...]
eg: drop table if exists test01_04;
三、插入資料
1、新增資料
insert [into] tbl_name [(col_name,...)] values(pression,...)
insert [into] tbl_name set col_name=expression
①可指定所有列的值
insert test01_01 values(null, 'jack', '23', 'beijing');
②使用多個值表,可以一次提供多行資料
insert test01_01 values('jack', '23', 'beijing'),('grep','34','ah');
③可以給出要賦值的那個列,然後再列出值
insert test01_01(name) values('grep');
insert test01_01(name) values('grep'),('rose');
insert test01_01 set name='sara'; //不能插入多行
2、insert ... select新增資料
基本語法:
insert into tbl_name select * from tbl_name1;
insert into tbl_name(col) select col from tbl_name1;
eg:
insert into test01_03 select * from test01_01;
insert into test01_03(name) select name from test01_01;
SQL約束:
約束型別 | 主鍵 | 預設值 | 唯一 | 外來鍵 | 非空 |
關鍵字 | PRIMARY KEY | DEFAULT | UNIQUE | FOREIGN KEY | NOTNULL |
四、查詢記錄
1、認識select:幫助取出資料
基本語法:
select selection_list //選擇那些列
from table_list //從何處現在行
where primary_constraint //行必須滿足什麼條件
group by grouping_columns //怎樣對結果分組
having secondary_constraint //行必須滿足的第二條件
order by sorting_columns //怎樣對結果排序(ASC升序,DESC降序)
limit count //結果限定 count=2顯示前兩條資料
一個having句子必須跟在group by之後和order by之前
select * from employee limit 1(起始位置),2(數目) ; // 顯示第二條,第三條記錄
2、普通查詢
select columns from tbl_name;
eg: select * from test01_01;
select name,age,sex from test01_01;
3、條件查詢
select columns from tb_name where expression,...;
eg: select * from test01_01 where name="tom"; //刪選出當前表中name為tom的所有資料
4、查詢排序
order by column_name [asc|desc] [,...]
eg:select * from test01_01 order by age asc; //按年齡升序輸出
5、查詢分組與行計數
group by 從句根據所給的列名返回分組的查詢結果
語法:
group by col_name,...
eg:單獨使用group by沒有任何意義
select name,count(*) from test01_01 group by name; //按name分組,並統計數量
6、多表查詢
select t1.name,t2.name from tbl_name as t1, tb_name2 as t2 where t1.name=t2.name;
上述程式碼表示,從t1和t2中取出兩張表name相同的值。as表示為這個表取別名。
或使用join on:
select t1.name,t2.name from tbl_name as t1 join tb_name2 as t2 on t1.name=t2.name;
五、修改& 刪除資料
1、update更新資料
update tbl_name set 要更改的列 where 要更新的記錄
eg:update test01_03 set name='tom' where age='20'; //將名字為tom的年齡改為20
2、delete刪除資料
delete from tbl_name where 要刪除的記錄(一行記錄)
where子句指定哪些記錄應該刪除。如果不選where,將刪除所有記錄。
eg:delete from test01_01 where age=10; //刪除年齡為10的資料
六、資料型別
1、資料型別
資料型別大致分為兩類:一個整數,一個是浮點數或小數。整數型別常用int型別,浮點型別float,double型別。
2、字串型別
常用的字串型別有:char,varchar,text和blob型別。
3、日期時間型別
date和year型別描述簡單的日期值,使用time型別描述時間值。
4、資料型別選擇
MySQL選取資料型別需要牢記的幾個標準:
①允許值
②儲存效率
③格式和顯示要求
④資料處理要求
⑤排序,索引和比較要求
七、運算子
1、算數運算子(+,-,*,%,/)
2、比較運算子(<>,=,<=>安全等號,in, not in, between ... and ...,not between ... and ...),結果總是1(真),0(假)或null(不確定)
3、邏輯運算子(not,and,or,xor)
4、位運算子(|,&,<<,>>,~, ^) ^執行xor操作
八、函式
1、數學函式
select ABS(-123); //123
select GREATEST(100,88,33,256); //獲取陣列中的最大值256
2、聚合函式
MySQL有一組函式是特意為求和或者對錶中的資料進行集中概括而設計的,這些函式經常用在包含group by從句的select查詢中。
AVG(col); //返回指定的平均值
COUNT(col); //返回指定列表中非null值的個數
SUM(col); //返回指定列的所有值的標準差
select count(*) from menbers;
select min(quantity) from inventory; //返回最小值
select max(return) from inventory; //返回最大值
3、字串函式
①通過length()函式可以獲得一個字串的長度
②通過trim()函式可以在我們剪下時指定去除格式
③concat()函式將提供的引數連線成一個字串
select concat('red','hot'); //返回redhot
4、日期時間函式
①使用now()函式獲得當前的日期和時間將以YYYY-MM-DD HH:MM:SS的格式返回當前的日期和時間
select now(); //返回當前的日期和時間
②單獨獲取日期和時間,可以使用curdate()和curtime()函式。
select curtime(); //當前時間
select curdate(); //當前日期
③week()函式返回指定的日期是一年的第幾個星期,而yearweek()函式返回指定的日期是那一年的哪一個星期
select week('2004-03-01'); //返回9
select yearweek(20040301); //返回200409
④函式TIMESTAMPDATE()計算當前時間與出生日期的差
TIMESTAMPDATE(YEAR,birth,curdate()) as age
5、加密函式
AES_ENCPYPT(str,key); //返回金鑰key對字串str加密後的字串
AES_DECPYPT(str,key); //解密後的字串
6、控制流函式
IFNULL(expr1,expr2)
如果 expr1 為非 NULL 的,IFNULL() 返回 expr1,否則返回 expr2。IFNULL() 返回一個數字或字串值
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
如果 expr1 = expr2 為真,返回 NULL,否則返回 expr1。 它等同於 CASE WHEN x = y THEN NULL ELSE x END:
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
--------------------------------------------------------------------------------
NULLIF(expr1,expr2)
如果 expr1 = expr2 為真,返回 NULL,否則返回 expr1。 它等同於 CASE WHEN x = y THEN NULL ELSE x END:
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
--------------------------------------------------------------------------------
IF(expr1,expr2,expr3)
如果expr1為真,那麼將返回expr2的值,否則返回expr3的值
mysql> SELECT IF(1>2,2,3);
-> 3
mysql> SELECT IF(1<2,'yes','no');
-> 'yes'
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
-> 'no'
如果expr2和expr3明確的指為null,那麼將返回非NULL的型別..
--------------------------------------------------------------------------------
CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
mysql> SELECT CASE 1 WHEN 1 THEN "one"
WHEN 2 THEN "two" ELSE "more" END;
-> "one"
mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
-> "true"
mysql> SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;
-> NULL
7、格式化函式
DATE_FORMAT(date,fmt) 依照字串fmt格式化日期date值
FORMAT(x,y) 把x格式化為以逗號隔開的數字序列,y是結果的小數位數
INET_ATON(ip) 返回IP地址的數字表示
INET_NTOA(num) 返回數字所代表的IP地址
TIME_FORMAT(time,fmt) 依照字串fmt格式化時間time值
8、資料轉換函式
MySQL提供了CAST()函式,它可以把一個值轉化為指定的資料型別。型別有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED
示例:
SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);
9、系統資訊函式
DATABASE() 返回當前資料庫名
CONNECTION_ID() 返回當前客戶的連線ID
USER()或SYSTEM_USER() 返回當前登陸使用者名稱
VERSION() 返回MySQL伺服器的版本
示例:
SELECT DATABASE(),VERSION(),USER();
九、連線
1、交叉連線
select * from color,attribute; //返回兩張表的結合體
2、內連線/外連線
3、自連線與聯合
十、子查詢
1、where/having查詢
MySQL可以在where子句或having子句中包含子查詢。包含在圓括號內的子查詢,優先順序高於比較和邏輯操作符in操作符或者exists操作符。
2、in/exists/from查詢
十一、事務處理
1、什麼是事務
一個事務由作為一個單獨單元的一個或多個sql語句組成。
事務的四個特性:原子性、一致性、孤立性、永續性
2、生命週期
3、控制事務行為
MySQL提供了兩個變數來控制事務行為:autocommit變數和transaction isolation level變數。
4、事務和效能
使用小事務兩個普通的策略:
①保證所有要求的使用者輸入在發出start transaction命令之前都是可行的。
②嘗試把大的事務分成小的事務然後分別執行。
十二、效能優化
1、索引
索引指向資料庫中具體資料所在的一個位置,同時在列上建立一個索引可以排列該列上的資訊。當伺服器需要訪問該資訊進行查詢時,就會知曉在什麼地方進行查詢,因為索引指向有關位置。
如果一個列設計查詢,分組,排序,索引將可以達到提高效能的效果。
2、查詢快取記憶體
在執行select查詢時,MySQL4.x會記錄下查詢和返回結果。這是通過select每次進行查詢時,在一個特殊的快取記憶體中儲存結果集實現的。
3、查詢分析
在select查詢開始出加上一個explain關鍵字,將告訴MySQL返回一個圖示,說明這個查詢如果進行處理,在這個圖表裡涉及了查詢將訪問哪個表的資訊以及查詢希望返回行數的資訊。
4、優化多表查詢
子查詢是潛逃在另一個select語句中的select語句。子查詢經常用來把一個複雜的查詢拆分為一些列的邏輯步驟,或者使用其他查詢結果回答一個查詢。
5、使用臨時表
MySQL還允許使用create temporary table命令建立臨時表。
6、優化表設計
7、調整伺服器設定
匯入操作:
load DATA infile '檔案路徑和檔名' into table 表名字;
匯出操作:
select 列1,列2 into outfile '檔案路徑和檔名' from 表名字;
eg:select * intp outfile '/tmp/out.txt' from employee;
檢視:
create view 檢視名(列a,列b,列c) as select 列1,列2,列3 from表名字
備份:
$mysqldump -u root dbname > 備份檔名 //備份整個資料庫
$mysqldump -u root dbname 表名字>備份檔名 //備份整個表
恢復:
$mysql -u root test < bak.sql //把備份的bak.sql恢復到test