1.建立數據庫:html
Mysql> CREATE DATABASE databaseName;mysql
Mysql數據庫的數據文件默認存放在/usr/local/mysql/var/目錄下,每一個數據庫對應一個子目錄,用於存儲數據表文件;ios
新建的空數據庫在/usr/local/mysql/var/目錄下會自動生成一個與新建的庫名相同的空文件夾。sql
例: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;ide
例: 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 」
見: