MySQL常用SQL語句


一、數據庫操作

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 ”

見:

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語法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM