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语法
posted @ 2013-08-20 09:01  Jevo  阅读(10424)  评论(0编辑  收藏  举报