MySQL經常使用SQL語句

1、數據庫操做

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

2、數據表操做

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 」

見:

13.1. 數據定義語句

13.1.1. ALTER DATABASE語法
13.1.2. ALTER TABLE語法
13.1.3. CREATE DATABASE語法
13.1.4. CREATE INDEX語法
13.1.5. CREATE TABLE語法
13.1.6. DROP DATABASE語法
13.1.7. DROP INDEX語法
13.1.8. DROP TABLE語法
13.1.9. RENAME TABLE語法

13.2. 數據操做語句

13.2.1. DELETE語法
13.2.2. DO語法
13.2.3. HANDLER語法
13.2.4. INSERT語法
13.2.5. LOAD DATA INFILE語法
13.2.6. REPLACE語法
13.2.7. SELECT語法
13.2.8. Subquery語法
13.2.9. TRUNCATE語法
13.2.10. UPDATE語法
相關文章
相關標籤/搜索