一、數據庫操作
1.創建數據庫:
Mysql> CREATE DATABASE databaseName;
Mysql數據庫的數據文件默認存放在/usr/local/mysql/var/目錄下,每個數據庫對應一個子目錄,用於存儲數據表文件;
新建的空數據庫在/usr/local/mysql/var/目錄下會自動生成一個與新建的庫名相同的空文件夾。
例:mysql> create database testdb;
mysql> create database if not exists testdb;
mysql> create schema if not exists student characterset 'gbk' collate 'gbk_chinese_ci';
2.刪除數據庫
Mysql>DROP DATABASE databseName;
例: mysql> drop database testdb;
3.更改表名
命令:alter table 原表名rename to 新表名;
mysql>alter table tb1 rename to tb11;數據庫進行改名。
4.改變數據表引擎
mysql>alter table tb1 engine="MyISAM";
5.壞庫掃描修復
cd /var/lib/mysql/xxx && myisamchk playlist_block
二、數據表操作
1.創建數據表
Mysql>CREATE TABLE [if not exists] tableName (字段1名稱 類型,字段2名稱 類型,… ,PRIMARY kEY (主鍵名))
mysql> create table table_name(column_name datatype {identity |null|not null},f_time TIMESTAMP(8),…) ENGINE=MyISAM AUTO_INCREMENT=3811 DEFAULT CHARSET=utf8;
例:
mysql> create table tb (id int unsigned not null auto_increment primary key, Name char(20) not null, Age tinyint not null);
mysql> create table tb (id int unsigned not null auto_increment, Name char(20) not null, Age tinyint not null, primary key(id));
mysql> create database mydb;
mysql> use mydb;
mysql> create table students(name char(20) not null, age tinyint unsigned, gender char(1) not null);
mysql> create table courses(ID tinyint unsigned not null auto_increment primary key, Couse varchar(50) not null);
mysql> create table courses(name char(20) not null, age tinyint unsigned, gender char(1) not null);
復制數據表:從一張表中查出需要的數據並創建為一個新表:
create [temporary] table 新表名 select * from 舊表名;
例: mysql> create table testcourses select * from courses where CID <=2;
如果很多字段的屬性沒有存在,則需要自己重新定義:select組合成需要的語句。
例:create table teststu(id int not null auto_increment, primary key(id) ) select name, age from students;
復制數據表:以其它表為模板,創建一個新表,字段的屬性還會存在 ,復制數據庫結構,創建一個結構完全相同的表:
create [temporary] table [if not exists] 表名like 已存在的表名;
例: mysql> create table test like courses;
mysql> SHOW CREATE TABLE tableName #顯示創建tableName表的語句
2.刪除表
Mysql>DROP TABLE databaseName.tableName;
等同於:
Mysql>user databaseName;
Mysql>DROP TABLE tableName;
mysql> drop table testcourses;
3.修改表
ALTER TABLE tableName;
增加字段,例:
mysql>alter table students add course varchar(100);
mysql> alter table tb1 add sex enum('M','F') default 'M' not null after id;#新增sex字段為enum類型,放在id的后面.
修改字段屬性:
mysql>alter table tb1 modify name char(30) not null; #改變vip的username為char(30);
改變字段,並設置在最前面字段:如:
mysql>alter table tb1 modify name mediumtext first; #改變name,並將它設在最前面字段,還有一個是after 字段,是指放在某字段后,
修改字段,並移動字段到第一個字段后:
mysql>alter table students change course Course varchar(100) after name;
修改表結構中的數據類型,例:
mysql>alter table courses modify id smallint default 1; #更改數據記錄為1. 或default NULL;
設置自動增長列,例:
mysql> create table tb1 (id int unsigned not null, Name char(20) not null, Age tinyint not null);
mysql>#alter table tb1 modify id smallint auto_increment;#執行一下這句會提示錯誤,因為mysql中要求自動增長的列設為主鍵
mysql>alter table tb1 add primary key (id);#設主鍵id,執行這條語句后再執行上面語句就沒問題了。
對已有字段改名,如:
mysql>alter table tb1 change sex usersex tinyint default 0 not null after Age; #改名字段sex為usersex並改變類型和位置。
注:僅alter中modify, change很相似,但是modify不能改名只能改結構,但change即可以改名,也可以改類型。
刪除字段
mysql>alter table tb1 drop usersex;#刪除 usersex字段,警告,所有的該字段數據都會丟失。
注意,修改數據結構是一個很危險的事,最好做好備份,以防不側。
小結:
• 查看列:desc 表名;
• 修改表名:alter table t_book rename to bbb;
• 添加列:alter table 表名 add column 列名 varchar(30);
• 刪除列:alter table 表名 drop column 列名;
• 修改列名MySQL: alter table bbb change nnnnn hh int;
• 修改列名SQLServer:exec sp_rename't_student.name','nn','column';
• 修改列名Oracle:lter table bbb rename column nnnnn to hh int;
• 修改列屬性:alter table t_book modify name varchar(22);
4.創建索引
MYSQL常用的索引類型主要有以下幾種:普通索引、唯一索引、主鍵索引、組合索引。
可以在建表的時候加入index indexname (列名)創建索引,也可以手工用命令生成:
1)CREATE INDEX可對表增加普通索引或UNIQUE索引。
CREATE INDEX index_name ON table_name (col_name[(length)],… )
如果索引字段是CHAR,varchar類型,length可以指定小於字段實際長度;如果是BLOB和TEXT類型,必須指定length。
在表上創建一個唯一的索引。唯一的索引意味着兩個行不能擁有相同的索引值、但允許有空值。
CREATE UNIQUE INDEX index_name ON table_name (column_name)
例:mysql> CREATE INDEX age_index ON tb (Age(10));
如果您希望以降序索引某個列中的值,您可以在列名稱之后添加保留字 DESC:
CREATE INDEX age_index ON tb (Age DESC)
組合索引:假如您希望索引不止一個列,您可以在括號中列出這些列的名稱,用逗號隔開:
CREATE INDEX idx_name ON table_name(table_col_1,table_col_2,...,table_col_n);
它允許使用多個列作為索引列。
例: CREATE INDEX age_index ON tb (Age, name)
2)ALTER TABLE也可用來創建普通索引、UNIQUE索引或PRIMARY KEY索引。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
注:在創建索引時,可以規定索引能否包含重復值。如果不包含,則索引應該創建為PRIMARY KEY或UNIQUE索引。對於單列惟一性索引,這保證單列不包含重復的值。對於多列惟一性索引,保證多個值的組合不重復。
PRIMARY KEY索引和UNIQUE索引非常類似。事實上,PRIMARY KEY索引僅是一個具有名稱PRIMARY的UNIQUE索引,即一種特殊的唯一索引,且不允許有空值。這表示一個表只能包含一個PRIMARY KEY,因為一個表中不可能具有兩個同名的索引,即一個表只能有一個主鍵索引。
5.顯示現有索引
SHOW INDEX FROM tbname [FROM db_name] #顯示現有索引
SHOW KEYS FROM tbname
· Table 表的名稱。
· Non_unique 如果索引不能包括重復詞,則為0。如果可以,則為1。
· Key_name 索引的名稱。
· Seq_in_index 索引中的列序列號,從1開始。
· Column_name 列名稱。
· Collation 列以什么方式存儲在索引中。在MySQL中,有值‘A’(升序)或NULL(無分類)。
· Cardinality 索引中唯一值的數目的估計值。通過運行ANALYZE TABLE或myisamchk -a可以更新。基數根據被存儲為整數的統計數據來計數,所以即使對於小型表,該值也沒有必要是精確的。基數越大,當進行聯合時,MySQL使用該索引的機會就越大。
· Sub_part 如果列只是被部分地編入索引,則為被編入索引的字符的數目。如果整列被編入索引,則為NULL。
· Packed 指示關鍵字如何被壓縮。如果沒有被壓縮,則為NULL。
· Null 如果列含有NULL,則含有YES。如果沒有,則該列含有NO。
· Index_type 用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
· Comment 更多評注。
例: mysql>SHOW INDEX FROM tb;
mysql> repair TABLE date QUICK; #索引列相關變量變化后自動重建索引
6.刪除索引
可利用ALTER TABLE或DROP INDEX語句來刪除索引。類似於CREATE INDEX語句,DROP INDEX可以在ALTER TABLE內部作為一條語句處理,語法如下。
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
其中,前兩條語句是等價的,刪除掉table_name中的索引index_name。
第3條語句只在刪除PRIMARY KEY索引時使用,因為一個表只可能有一個PRIMARY KEY索引,因此不需要指定索引名。如果沒有創建PRIMARY KEY索引,但表具有一個或多個UNIQUE索引,則MySQL將刪除第一個UNIQUE索引。
如果從表中刪除了某列,則索引會受到影響。對於多列組合的索引,如果刪除其中的某列,則該列也會從索引中刪除。如果刪除組成索引的所有列,則整個索引將被刪除。
使用索引的注意事項
1)、索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,復合索引中只要有一列含有NULL值,那么這一列對於此復合索引就是無效的。所以在數據庫設計時盡量不要讓字段的默認值為NULL。
2)、使用短索引
對列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字符內,多數值是惟一的,那么就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。
3)、不要在列上進行運算
在列上進行運算,將導致索引失效而進行全表掃描。
4)、不使用NOT和<>操作
5)、索引列排序
MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那么order by中的列是不會使用索引的。因此數據庫默認排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列創建復合索引。
7.約束條件
可以在創建表的時候同時創建約束,如:
create table person
(
id smallint not null auto_increment,
name varchar(10) not null,
company_id smallint,
//主鍵約束
primary key(id),
//唯一約束,也可以指定約束的名稱: unique key constraint_name (name),
unique key(name),
//外鍵約束,也可以指定約束的名稱:constraint constraint_name foreign key(company_id) references company(company_id)
foreign key(company_id) references company(company_id)
)
也可創建表以后,再創建約束
create table person
(
id smallint not null,
name varchar(10) not null,
company_id smallint
)
//創建主鍵約束
alter table person add primary key(id);
或alter table person add constraint primary_k primary key(id);
//再將主鍵列設為auto_increment:
alter table person modify id smallint auto_increment;
//刪除主鍵約束
alter table person drop primary key;
刪除主鍵約束的時候,如果主鍵已經是auto_increment型,則無法刪除,因為只有鍵才能是auto_increment型的
外鍵關系(Foreign Key relationships)討論的是父表(categories)與子表(articles)的關系,通過引入外鍵(Foreign Key)這個概念來保證參照完整性(Referential integrity)。
//創建外鍵約束
alter table person add foreign key(company_id) references company(company_id);
alter table person add constraint foreing_k foreign key(company_id) references company(company_id);
創建外鍵約束以后,系統自動為外鍵列創建了一個key,用下面的方式刪除外鍵約束后,這個key仍然存在。
如果不能在“被reference的表”里找到包含“被reference字段”的索引,或者是兩個關聯字段類型不匹配,則會出現ERROR 1005 (HY000): Can't create table … (errno: 150)錯誤
//刪除外鍵約束
alter table person drop foreign key foreign_k;
//創建唯一約束
alter table person add unique key(name);
alter table person add constraint unique_k unique key(name);
//刪除唯一約束
因為創建unique約束后,系統會自動給此列創建索引
alter table person drop index name;
約束名稱可以用 show create table tablename 命令查看
小結:
添加主鍵約束:alter table 表名 add constraint 主鍵 (形如:PK_表名) primary key 表名(主鍵字段);
添加外鍵約束:alter table 從表 add constraint 外鍵(形如:FK_從表_主表) foreign key 從表(外鍵字段) references 主表(主鍵字段);
刪除主鍵約束:alter table 表名 drop primary key;
刪除外鍵約束:alter table 表名 drop foreign key 外鍵(區分大小寫);
查看約束,可以從information_schema架構下的系統表查看:
SELECT * FROM information_schema.`TABLE_CONSTRAINTS`;
查看觸發器
SELECT * FROM information_schema.`TRIGGERS`;
三.數據操作
1.插入數據: INSERT INTO 表名(字段1,字段2,…) VALUES(字段1的值,字段2的值,…)
insert into tb_name (col,col2,....) values (val1,val2,....);
insert into tutors (Tname,Gender,Age) values ('jerry','M',24); -----批量插入方式
insert into tutors set Tname='Tom',Genser='F',Age=30; -----只能實現單個字段插入
insert into tutors (Tname,Gender,Age) selectName,Genser,Age from students where Age >=20
2.修改數據記錄:UPDATE表名SET字段名1=字段值1[,字段名2=字段值2]WHERE 條件表達式
mysql>update students set Course='wg'whereName='j'; -----更改j的課程為wg
3.刪除數據:mysql> DELETE FROM 表名 WHERE 條件表達式
mysql>deletefrom students where Course='wg';
4.查詢:
select * from tutors orderby TID desc limit 1; -----查看降序的第一行
select last_insert_ID(); -----查詢插入的最后一個序列號
* 查詢及常用函數
mysql> select t1.name, t2.salary from employee AS t1, info AS t2 where t1.name = t2.name;
mysql> select college, region, seed from tournament ORDER BY region, seed;
mysql> select col_name from tbl_name WHERE col_name > 0;
mysql> select DISTINCT …… [DISTINCT關鍵字可以除去重復的記錄]
mysql> select DATE_FORMAT(NOW(),’%m/%d/%Y’) as DATE, DATE_FORMAT(NOW(),’%H:%m:%s’) AS TIME;
mysql> select CURDATE(),CURTIME(),YEAR(NOW()),MONTH(NOW()),DAYOFMONTH(NOW()),HOUR(NOW()),MINUTE(NOW());
mysql> select UNIX_TIMESTAMP(),UNIX_TIMESTAMP(20080808),FROM_UNIXTIME(UNIX_TIMESTAMP()); mysql> select PASSWORD(”secret”),MD5(”secret”); #加密密碼用
mysql> select count(*) from tab_name order by id [DESC|ASC]; #DESC倒序/ASC正序
* 函數count, AVG, SUM, MIN, MAX, LENGTH字符長度, LTRIM去除開頭的空頭, RTRIM去尾部空格, TRIM(str)去除首部尾部空格, LETF/RIGHT(str,x)返回字符串str的左邊/右邊x個字符, SUBSTRING(str,x,y)返回str中的x位置起至位置y的字符
mysql> select BINARY ‘ross’ IN (’Chandler’,’Joey’, ‘Ross’); #BINARY嚴格檢查大小寫
* 比較運算符IN, BETWEEN, IS NULL, IS NOT NULL, LIKE, REGEXP/RLIKE
mysql> select count(*),AVG(number_xx),Host,user from mysql.user GROUP by user [DESC|ASC] HAVING user=root; #分組並統計次數/平均值
* 將wp_posts表中post_content字段中文字”old”替換為”new”
mysql> update wp_posts set post_content=replace(post_content,’old’,’new’)
5.表鎖定相關
mysql> LOCK TABLE users READ; # 對user表進行只讀鎖定
mysql> LOCK TABLES user READ, pfolios WRITE #多表鎖控制
mysql> UNLOCK TABLES; #不需要指定鎖定表名字, MySQL會自動解除所有表鎖定
6.事務操作
新表:create TABLE table-name (field-definitions) TYPE=INNODB; --- innodb支持事務
舊表: alter TABLE table-name TYPE=INNODB;
mysql> start transaction #標記一個事務的開始
mysql> insert into….. #數據變更
mysql> ROLLBACK或commit #回滾或提交
mysql> SET AUTOCOMMIT=1; #設置自動提交
mysql> select @@autocommit; #查看當前是否自動提交
7.刪除表后,讓新增ID自動承接存在的最大ID。
刪除自動ID(auto_increment)表下的內容,會出現ID空檔。
例如刪除ID=6 ID=7
1 2 3 4 5 8....
這樣ID就從8開始記錄.
這樣需要1個方法讓他從6來繼續
執行sql語句.
ALTER TABLE `表` AUTO_INCREMENT = 6
8.union可以對同一個表的兩次查詢聯合起來。UNION在進行表鏈接后會篩選掉重復的記錄,所以在表鏈接后會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。如果表數據量大的話可能會導致用磁盤進行排序。
實際大部分應用中是不會產生重復的記錄,最常見的是過程表與歷史表UNION。比如在blog應用中,可以利用一條sql語句實現置頂blog和普通blog的分頁顯示。
( SELECT * FROM `blog` WHERE top=1 ORDER BY created DESC )
UNION ( SELECT * FROM `blog` WHERE top = 0 ORDER BY created DESC ) LIMIT 2 , 3
注:union要求聯合的兩個表所要查找的數據列要一樣多,如果一個表中沒有另一個表的字段,可以用NULL代替。
UNION ALL只是簡單的將兩個結果合並后就返回。這樣,如果返回的兩個結果集中有重復的數據,那么返回的結果集就會包含重復的數據了。從效率上說,UNION ALL 要比UNION快很多
9.SHELL提示符下運行SQL命令
$ mysql -e “show slave status\G ”
見: