MySQL常用SQL语句

    xiaoxiao2024-11-21  1

    一、数据库操作

    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 ”
    转载请注明原文地址: https://ju.6miu.com/read-1293869.html
    最新回复(0)