1. 程式人生 > 其它 >MYSQL資料庫設計的一些小技巧[轉載]

MYSQL資料庫設計的一些小技巧[轉載]

常用資料操作語言DML筆記(select insert update delete)

select 語句 高階的查詢功能,見下面的詳細內容

select 列名1,列名2 ... from 表名1,表名2...
[where 條件] like
[group by...]
[having ...]
[order by...] 以特定的順序顯示 例:order by name asc;以名字顯示,為降序排列

insert 語句 MySQL 當記錄不存在時插入 insert if not exists.在 MySQL 中,插入(insert)一條記錄很簡單,但是一些特殊應用,在插入記錄前,需要檢查這條記錄是否已經存在,只有當記錄不 存在時才執行插入操作,本文介紹的就是這個問題的解決方案.

insert into 表名(列名1,列名2,... )values(值1,值2,...)

update 語句

update 表名 set 列名1=值1,列名2=值2 ... [where 條件]

delete 語句

delete from 表名 [where 條件] 注:條件時會刪除整個表名

truncate 語句

truncate tables 表名 
# 注:相當刪除整個表名,在重建.非常快

從一個檔案載入資料到 MYSQL

load data infile '檔案' into tables 表名 [fields terminated by '字元']

匯出 MYSQL 資料成一個檔案

select * from 表名 into outfile '檔案'

DDL資料定義語言(vreate tabe,drop table,altre table)

MYSQL 的字元型別要注意 CHAR VARCHAR TEXT 不分大小寫,只能存字元 ,BLOB可以存二進位制的內容,如果聲音,檔案. CHAR主要是定長,VARCHAR是變長,所以VARCHAR更加節約空間.

查看錶結構欄位

desc tablesname;

新增新的表字段

alter table test add name varchar(20);  #新增一個name的欄位
alter table test add f_name varchar(20) after id;  #在id之後新增一個name的欄位
alter table test add sid int first;           #在最前面加入一個欄位
alter table test add primary key(id);  #新增一個primary主鍵

刪除表中的欄位

alter table test drop name; #刪除
alter table test add primary key; #刪除主鍵

設定表中欄位的預設值

alter table test alter name set default '不知道';

修改欄位名

alter table test change name l_anme varchar(10);  #修改欄位名,資料型別要寫上

資料庫插入

insert  #表名 values
insert into tmp values(default,'kate',0,20);#可以使用default.
insert into tmp(name,sex,age) values('katess',0,20);

表的匯入匯出

insert tmp2 select name,sex from tmp where id<4;  #可以給select 中得到的內容放到tmp2的新表中

更新 MYSQL 表中的欄位

UPDATE <表名> SET <列名 = 更新值> [WHERE <更新條件>]
update tmp set address='北京' where id between 4 and 5

刪除表中特定的內容

DELETE FROM tmp WHERE id >5  #刪除id大於5的內容
DELETE FROM ss1,ss2 using ss1,ss2  where ss1.id=ss2.id and  ss1.name='alex' #二張表ss1和ss2相同的id中內容有alex的內容刪除

高階查詢

常用查詢函式 concat(字元連線) distinct(去掉重複資料) as(別名) limit 3,2 (控制顯示數,如前現示從第三個起,拿二個數據)

集函式 count(統計) sun age

查詢(條件內容查詢)

select 'abc' like 'abc%';     
# %任意字元  _單個字元最少要出現一次

MYSQL 中使用正則來查詢資料

select 'abc' regexp '^a.*c$';

排序查詢結果 使用排序功能,和使用別名功能

SELECT * FROM student ORDER BY sage DESC ; #降排序order by要放在最後<
SELECT * FROM student ORDER BY  sdept in('資訊系','美術系')  #同時二個條件
SELECT sno AS '學號', sname AS '姓名' FROM student;

分組

select cid,avg(grad) from sc group by cid;
# 在分組中 group by要放在最後,要是要加條件的話,集函式要使用having來換where.放在group by後

多表查詢

select s.sname,g.grade form sc as g, student as s where s.sname='扶%' and s.sno=g.sid;
select s.sname,g.grade from sc as g inner join student as s on s.sno=g.sid;
# 內連線,同連線顯示相同的內容,要加inner給whereis 改成on
# 如果有的資料沒有,可以換left,和right以第一個表為基礎來排資料,inner join是二個表都有的內容.

子查詢

select sname,sage from student where sno not in (select sid from sc) ;
select sname from student where sno in (select)

在 MYSQL 中查詢,要先轉義

#name=mysql_escape_string($name); mysql_escape_string

FAQ:

1. 檢視和修改設定 MYSQL 預設編碼

SHOW CHARACTER SET;檢視支援的所有字
show variables like 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

讓 MYSQL 重起也可以使用utf8

[mysqld]
default-character-set=utf
[mysql]
default-character-set=utf8

2. 怎麼樣進行 MYSQL 備份

MYSQL 的備份可用命令mysqldump ,使用方法很簡單,

$ mysqldump -u 使用者名稱 -p (密碼) -h 主機名 資料庫名 >路徑/備份名.bak

同時也可以是用mysqldump備份資料結構(tablename.sql)和資料(tablename.txt)

$ mysqldump -u 使用者名稱  -p (密碼)  -h 主機名 資料庫名 tablename1 tablename2 > back.sql

mysqldump -u 使用者名稱 -p (密碼) -h 主機名 資料庫名 –tab 路徑 –opt 資料庫名. EXA:

$ mysqldump -u xxxx -p xxxxt databases  > ./news.sql

3. 改變mysql管理員的密碼

方法1: 在/usr/local/mysql/bin/下:

$ mysqladmin -u root password 'new_password'

一般安裝時用此方法設定.

方法2: 在mysql狀態下:

mysql>UPDATE user SET password=PASSWORD('new_password') WHERE user='root';
mysql>FLUSH PRIVILEGES;

Method 3:

mysql>SET PASSWORD FOR root=PASSWORD('new_password');

4. 什麼情況下會導致 MYSQL 資料庫損壞和怎麼修復 MYSQL

mysql 正在執行的時候,伺服器突然斷電或者直接按reset鍵重啟,硬碟空間不夠,導致資料寫不進去,也很有可能導致資料表損壞,物理硬碟有損壞.主要是這幾個原因,mysql修復方法如下

可以把mysql停掉,用mysql的命令myisamchk來修復,這種修復方法是最好的.

具體命令如下:

$ myisamchk -r database/*.MYI
$ myisamchk -o database/*.MYI
$ myisamchk -f database/*.MYI

引數 -r, -o , -f 是遞進關係,一般首先用-r修復,然後-o , -f

5. mysql的匯出匯入

$ mysqldump -uroot -p mysql >pcti15.sql
$ mysql -uroot -p pcti >pcti15.sql

使用source命令,後面引數為指令碼檔案(如這裡用到的.sql)

mysql>source d:backup_db.sql

6. 設定進入時的預設編碼

mysql -uroot -p --default-character-set=utf8

問題:我建立了一個表來存放客戶資訊,我知道可以用 insert 語句插入資訊到表中,但是怎麼樣才能保證不會插入重複的記錄呢? 答案:可以通過使用 EXISTS 條件句防止插入重複記錄. 示例一:插入多條記錄 假設有一個主鍵為 client_id 的 clients 表,可以使用下面的語句: Code:

INSERT INTO clients 

(client_id, client_name, client_type) 
SELECT supplier_id, supplier_name, ‘advertising’ 
FROM suppliers 
WHERE not exists (select * from clients 
where clients.client_id = suppliers.supplier_id); 

示例一:插入單條記錄 Code:

INSERT INTO clients 
(client_id, client_name, client_type) 
SELECT 10345, ‘IBM’, ‘advertising’ 
FROM dual 
WHERE not exists (select * from clients 
where clients.client_id = 10345); 

使用 dual 做表名可以讓你在 select 語句後面直接跟上要插入欄位的值,即使這些值還不存在當前表中.

MySQL 連線的狀態資訊

我們常常需要看一些連線的資訊,如下可以顯示相關的資訊:

mysql> show status like '%onnect%'; 
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Aborted_connects         | 8960  |
| Connections              | 31530 |
| Max_used_connections     | 111   |
| Ssl_client_connects      | 0     |
| Ssl_connect_renegotiates | 0     |
| Ssl_finished_connects    | 0     |
| Threads_connected        | 73    |
+--------------------------+-------+

Aborted_connects 嘗試已經失敗的MySQL伺服器的連線的次數。 Connections 試圖連線MySQL伺服器的次數。 Threads_connected 當前開啟的連線的數量. 設定的連線數可以通過下面這個檢視

show variables like 'max_connections';

如果想修改的話,修改 /etc/my.cnf 找到max_connections一行,修改為(如果沒有,則自己新增)

max_connections = 1000

臨時修改此引數的值, 注意大小寫

set GLOBAL max_connections=1000;

查詢表的格式

SHOW TABLE STATUS WHERE ROW_FORMAT LIKE 'Compact'

查詢 binlog 轉換成可讀 mysqlbinlog mysql-bin.000002 -vvvv –base64-output=DECODE-ROWS