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语法
相关文章
相关标签/搜索