您的位置:首页 > 数据库 > MySQL

MySQL数据库创建和表操作

2013-10-30 07:42 253 查看
MySQL数据库创建和表操作

简要:

1.显示所所有的库

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| csdn |

| mysql |

| performance_schema |

| test |

+--------------------+

5 rows in set (0.15 sec)

2.创建库

mysql> create database news;

Query OK, 1 row affected (0.20 sec)

3.使用某个库

mysql> use news;

Database changed

4.创建表

新闻类型:类型的名称 父类型 自关联

电器

风扇

笔记本

hp类型

hp6325

mysql> create table newType(id int auto_increment primary key,name varchar(20));

Query OK, 0 rows affected (0.41 sec)

5.插入语句

mysql> insert into newType(name) values('guojixinwen');

Query OK, 1 row affected (0.09 sec)

6.更新语句

mysql> update newType set name='guojixinwens' where id=1;

Query OK, 1 row affected (0.07 sec)

Rows matched: 1 Changed: 1 Warnings: 0

7.查询语句

mysql> select id,name from newType;

+----+--------------+

| id | name |

+----+--------------+

| 1 | guojixinwens |

+----+--------------+

1 row in set (0.00 sec)

8.删除语句

mysql> delete from newType where id=1;

Query OK, 1 row affected (0.57 sec)

9.删除表

mysql> drop table newType;

Query OK, 0 rows affected (0.12 sec)

10.删除库

mysql> DROP DATABASE NEWS;

Query OK, 0 rows affected (0.40 sec)

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(IN `rid` int,INOUT `rname` varchar(50))

BEGIN

#Routine body goes here...

select name into rname from admin where id=rid;

END

详细:

1、MySQL数据库的创建

(1)创建数据库:CREATE DATABASE或CREATE SCHEMA

语法格式:

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name

[create_specification [, create_specification] ...]

其中create_specification:

[DEFAULT] CHARACTER SET charset_name

| [DEFAULT] COLLATE collation_name

说明:语句中“[ ]”内为可选项。

● db_name:数据库名。在文件系统中,MySQL的数据存储区将以目录方式表示MySQL数据库。因此,命令中的数据库名字必须符合操作系统文件夹命名规则。值得注意的是:在MySQL中是不区分大小写的。

● IF NOT EXISTS:在建数据库前进行判断,只有该数据库目前尚不存在时才执行CREATE DATABASE操作。用此选项可以避免出现数据库已经存在而再新建的错误。

例如:create database studentdb;

(2)显示数据库信息:Show databases;

(3)修改数据库:ALTER DATABASE

数据库创建后,如果需要修改数据库的参数,可以使用ALTER DATABASE命令。

语法格式:

ALTER {DATABASE | SCHEMA} [db_name]

alter_specification [, alter_specification] ...

其中alter_specification:

[DEFAULT] CHARACTER SET charset_name

| [DEFAULT] COLLATE collation_name

说明:

ALTER DATABASE用于更改数据库的全局特性,这些特性储存在数据库目录中的db.opt文件中。用户必须有对数据库进行修改的权限,才可以使用 ALTER DATABASE。修改数据库的选项与创建数据库相同,功能不再重复说明。如果语句中数据库名称忽略,则修改当前(默认)数据库。

ALTER DATABASE studentdb;

DEFAULT CHARACTER SET gb2312

DEFAULT COLLATE gb2312_chinese_ci;

修改编码也可用:set names gb2312;相当于:

set character_set_client=gb2312;

set character_set_results=gb2312;

set character_set_connection=gb2312;

(4)删除数据库:DROP DATABASE

已经创建的数据库需要删除,使用DROP DATABASE命令。

语法格式:

DROP DATABASE [IF EXISTS] db_name

其中,db_name是要删除的数据库名。可以使用IF EXISTS子句以避免删除不存在的数据库时出现的MySQL错误信息。

例如:

drop table studentdb;

(5)打开数据库为当前数据库:use db_name;

说明:这个语句也可以用来从一个数据库“跳转”到另一个数据库,在用CREATE DATABASE语句创建了数据库之后,该数据库不会自动成为当前数据库,需要用这条USE语句来指定

2.MySQL表的创建和修改

(1)创建表:CREATE TABLE

语法格式:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

[ ( [column_definition] , ... | [index_definition] ) ]

[table_option] [select_statement];

说明:

● TEMPORARY:该关键字表示用CREATE命令新建的表为临时表。不加该关键字创建的表通常称为持久表,在数据库中持久表一旦创建将一直存在,多个用户或者多个应用程序可以同时使用持久表。有时候需要临时存放数据,例如,临时存储复杂的SELECT语句的结果。此后,可能要重复地使用这个结果,但这个结果又不需要永久保存。这时,可以使用临时表。用户可以像操作持久表一样操作临时表。只不过临时表的生命周期较短,而且只能对创建它的用户可见,当断开与该数据库的连接时,MySQL会自动删除它们。

● IF NOT EXISTS:在建表前加上一个判断,只有该表目前尚不存在时才执行CREATE TABLE操作。用此选项可以避免出现表已经存在无法再新建的错误。

● table_name:要创建的表的表名。该表名必须符合标志符规则,如果有MySQL保留字必须用单引号括起来。

● column_definition:列定义,包括列名、数据类型,可能还有一个空值声明和一个完整性约束。

● index_definition:表索引项定义,主要定义表的索引、主键、外键等 table_option:用于描述表的选项。

● select_statement:可以在CREATE TABLE语句的末尾添加一个SELECT语句,在一个表的基础上创建表。

列定义column_definition格式如下:

col_name type [NOT NULL | NULL] [DEFAULT default_value]

[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

[COMMENT 'string'] [reference_definition]

说明:

● col_name:表中列的名字。列名必须符合标志符规则,长度不能超过64个字符,而且在表中要唯一。如果有MySQL保留字必须用单引号括起来。

● type:列的数据类型,有的数据类型需要指明长度n,并用括号括起,MySQL支持的数据类型在附录C中介绍。

● AUTO_INCREMENT:设置自增属性,只有整型列才能设置此属性。当插入NULL值或0到一个AUTO_INCREMENT列中时,列被设置为value+1,在这里value是此前表中该列的最大值。AUTO_INCREMENT顺序从1开始。每个表只能有一个AUTO_INCREMENT列,并且它必须被索引。

● NOT NULL | NULL:指定该列是否允许为空。如果不指定,则默认为NULL。

● DEFAULT default_value:为列指定默认值,默认值必须为一个常数。其中,BLOB和TEXT列不能被赋予默认值。如果没有为列指定默认值,MySQL自动地分配一个。如果列可以取NULL值,默认值就是NULL。如果列被声明为NOT NULL,默认值取决于列类型:

(1)对于没有声明AUTO_INCREMENT属性的数字类型,默认值是0。对于一个AUTO_INCREMENT列,默认值是在顺序中的下一个值。

(2)对于除TIMESTAMP以外的日期和时间类型,默认值是该类型适当的“零”值。对于表中第一个TIMESTAMP列,默认值是当前的日期和时间。

(3)对于除ENUM的字符串类型,默认值是空字符串。对于ENUM,默认值是第一个枚举值。

● UNIQUE KEY | PRIMARY KEY:PRIMARY KEY和UNIQUE KEY都表示字段中的值是唯一的。PRIMARY KEY表示设置为主键,一个表只能定义一个主键,主键一定要为NOT NULL。

● COMMENT 'string':对于列的描述,string是描述的内容。

● reference_definition:指定参照的表和列,具体定义在第5章参照完整性中介绍。

type定义如下:

例题:

create table student

(

学号 int NOT NULL PRIMARY KEY AUTO_INCREMENT,

姓名 char(8) NOT NULL ,

专业名 char(10) NOT NULL ,

性别 char(1) NOT NULL DEFAULT ‘男’,

出生日期date NOT NULL ,

总学分 double NULL ,

照片 blob NULL

(2)修改表:ALTER TABLE

LTER TABLE用于更改原有表的结构。例如,可以增加或删减列,创建或取消索引,更改原有列的类型,重新命名列或表,还可以更改表的评注和表的类型。

语法格式:

ALTER [IGNORE] TABLE tbl_name

alter_specification [, alter_specification] ...

alter_specification:

ADD [COLUMN] column_definition [FIRST | AFTER col_name ]/*添加列*/

| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} /*修改默认值*/

| CHANGE [COLUMN] old_col_name column_definition /*对列重命名*/

[FIRST|AFTER col_name]

| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name] /*修改列类型*/

| DROP [COLUMN] col_name /*删除列*/

| RENAME [TO] new_tbl_name /*重命名该表*/

| ORDER BY col_name /*排序*/

| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]

/*将字符集转换为二进制*/

| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] /*修改默认字符集*/

| table_options

说明:

● tb1_name:表名。

● col_name:指定的列名。

● IGNORE:是MySQL相对于标准SQL的扩展。若在修改后的新表中存在重复关键字,如果没有指定IGNORE,当重复关键字错误发生时操作失败。如果指定了IGNORE,则对于有重复关键字的行只使用第一行,其他有冲突的行被删除。

● column_definition:定义列的数据类型和属性,具体内容在CREATE TABLE的语法中已做说明。

● ADD[COLUMN]子句:向表中增加新列。例如,在表t1中增加新的一列a:

ALTER TABLE t1 ADD COLUMN a TINYINT NULL ;

● FIRST | AFTER col_name:表示在某列的前或后添加,不指定则添加到最后。

● ALTER [COLUMN]子句:修改表中指定列的默认值。

● CHANGE [COLUMN]子句:修改列的名称。重命名时,需给定旧的和新的列名称和列当前的类型,old_col_name表示旧的列名。column_definition中定义新的列名和当前数据类型。例如,要把一个INTEGER列的名称从a变更到b:

ALTER TABLE t1 CHANGE a b INTEGER;

● MODIFY [COLUMN]子句:修改指定列的类型。例如,要把一个列的数据类型改为BIGINT:

ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

举例;

修改student 表中birthday数据类型为date

alter table student modify birthday date;

修改student 表中添加一个备注列

alter table student add information varchar(50);

修改student 表中列的默认值

alter table student alter sex set default ‘男’;

(3)修改表名:RENAME TABLE

语法格式:

RENAME TABLE tbl_name TO new_tbl_name [ , tbl_name2 TO new_tbl_name2] ...

说明:

● tbl_name:修改之前的表名。

● new_tbl_name:修改之后的表名。

例如:

rename table myt1 to t1;

(4)复制表:CREATE TABLE

语法格式:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

[ ( ) LIKE old_tbl_name [ ] ] | [AS (select_statement)] ;

说明:

使用LIKE关键字创建一个与old_table_name表相同结构的新表,列名、数据类型、空指定和索引也将复制,但是表的内容不会复制,因此创建的新表是一个空表。使用AS关键字可以复制表的内容,但索引和完整性约束是不会复制的。select_statement表示一个表达式,例如,可以是一条SELECT语句。

create table studentinfo as(select * from student);

(5)删除表:DROP TABLE

语法格式:

DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...

其中,

tb1_name:要被删除的表名。

IF EXISTS:避免要删除的表不存在时出现错误信息。

这个命令将表的描述、表的完整性约束、索引及和表相关的权限等都全部删除。

drop table if exists studentinfo ;

(6)插入表数据:INSERT TABLE

通过INSERT或REPLACE语句可以向表中插入一行或多行数据。

语法格式:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]

VALUES ({expr | DEFAULT},...),(...),...

| SET col_name={expr | DEFAULT}, ...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

说明:

● tb1_name:被操作的表名。

● col_name:需要插入数据的列名。如果要给全部列插入数据,列名可以省略。如果只给表的部分列插入数据,需要指定这些列。对于没有指出的列,它们的值根据列默认值或有关属性来确定,MySQL处理的原则是:

(1)具有IDENTITY属性的列,系统生成序号值来唯一标志列。

(2)具有默认值的列,其值为默认值。

(3)没有默认值的列,若允许为空值,则其值为空值;若不允许为空值,则出错。

(4)类型为timestamp的列,系统自动赋值。

● VALUES子句:包含各列需要插入的数据清单,数据的顺序要与列的顺序相对应。若tb1_name后不给出列名,则在VALUES子句中要给出每一列(除IDENTITY和timestamp类型的列)的值,如果列值为空,则值必须置为NULL,否则会出错。VALUES子句中的值:

(1)expr:可以是一个常量、变量或一个表达式,也可以是空值NULL,其值的数据类型要与列的数据类型一致。例如,列的数据类型为int,插入的数据是‘aaa’就会出错。当数据为字符型时要用单引号括起。

(2)DEFAULT:指定为该列的默认值。前提是该列原先已经指定了默认值。

如果列清单和VALUES清单都为空,则INSERT会创建一行,每个列都设置成默认值。

INSERT语句支持下列修饰符:

● LOW_PRIORITY:可以使用在INSERT、DELETE和UPDATE等操作中,当原有客户端正在读取数据时,延迟操作的执行,直到没有其他客户端从表中读取为止。

● DELAYED:若使用此关键字,则服务器会把待插入的行放到一个缓冲器中,而发送INSERT DELAYED语句的客户端会继续运行。如果表正在被使用,则服务器会保留这些行。当表空闲时,服务器开始插入行,并定期检查是否有新的读取请求(仅适用于MyISAM、MEMORY和ARCHIVE表)。

● HIGH_PRIORITY:可以使用在SELECT和INSERT操作中,使操作优先执行。

● IGNORE:使用此关键字,在执行语句时出现的错误就会被当做警告处理。

● ON DUPLICATE KEY UPDATE…:使用此选项插入行后,若导致UNIQUE KEY或PRIMARY KEY出现重复值,则根据UPDATE后的语句修改旧行(使用此选项时DELAYED被忽略)。

● SET子句:SET子句用于给列指定值,使用SET子句时表名的后面省略列名。要插入数据的列名在SET子句中指定,col_name为指定列名,等号后面为指定数据,未指定的列,列值指定为默认值。

● INSERT ...SELECT:(第四章具体介绍)

使用INSERT INTO…SELECT…,可以快速地从一个或多个表中向一个表插入多个行。语法格式如下:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]

SELECT ...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

有三张表a、b、c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段。对于这种情况,可以使用如下的语句来实现:

INSERT INTO db1_name (field1,field2) SELECT field1,field2 FROM db2_name

上面的语句比较适合两个表的数据互插,如果多个表就不适应了。对于多个表,可以先将需要查询的字段JOIN起来,然后组成一个视图后再SELECT FROM就可以了:

INSERT INTO a (field1,field2) SELECT * FROM(SELECT b.f1,c.f2 FROM b JOIN c) AS tb

其中f1是表b的字段,f2是表c的字段,通过JOIN查询就将分别来自表b和表c的字段进行了组合,然后再通过SELECT嵌套查询插入到表a中,这样就满足了这个场景了,如果需要不止2个表,那么可以多个JOIN的形式来组合字段。

语法错误注意

需要注意的是嵌套查询部分最后一定要有设置表别名,如下:

SELECT * FROM (SELECT f1,f2 FROM b JOIN c) AS tb

即最后的AS tb是必须的(tb这个名称可以随意取),即指定一个别名。每个派生出来的新表都必须指定别名,否则在mysql中会报如下错误:

ERROR 1248 (42000): Every derived TABLE must have its own alias

另外,MySQL中INSERT INTO SELECT不能加VALUES,即不能写成如下形式:

INSERT INTO db1_name(field1,field2) VALUES SELECT field1,field2 FROM db2_name

● 使用INSERT语句可以向表中插入一行数据,也可以插入多行数据,插入的行可以给出每列的值,也可只给出部分列的值,还可以向表中插入其他表的数据。

使用INSERT INTO…SELECT…,可以快速地从一个或多个表中向一个表插入多个行。语法格式如下:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]

SELECT ...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

3、数据操作

(1)使用DELETE从单个表中删除,语法格式:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name

[WHERE where_definition]

[ORDER BY ...]

[LIMIT row_count]

说明:

● QUICK修饰符:可以加快部分种类的删除操作的速度。

● FROM子句:用于说明从何处删除数据,tbl_name为要删除数据的表名。

● WHERE子句:where_definition中的内容为指定的删除条件。如果省略WHERE子句则删除该表的所有行,WHERE子句的详细定义在4.2.3节介绍。

● ORDER BY子句:各行按照子句中指定的顺序进行删除,此子句只在与LIMIT联用时才起作用。ORDER BY子句和LIMIT子句的具体定义将在SELECT语句中介绍。

● LIMIT子句:用于告知服务器在控制命令被返回到客户端前被删除的行的最大值。

【例3.5】 假设数据库mydata中有一个表table1,table1中有如下数据:

姓名 年龄 职业

张三 42 教师

李四 28 工人

要删除张三的信息可使用如下语句:

USE mydata

DELETE FROM table1

WHERE 姓名='张三';

【例3.6】 将XSCJ数据库的XS表(具体数据参照附录A)中总学分小于50的所有行删除,使用如下语句:

USE XSCJ

DELETE FROM XS

WHERE 总学分<50;

说明:本书所举例子中的XSCJ数据库里的XS、KC、XS_KC表的数据均以附录A中所列的数据样本为准。如本例无特殊说明,本例所做的修改不在其他例子中体现。所以如果例中语句涉及删除或修改原始数据时,读者需要小心使用,删除之后要及时将数据恢复。在第8章中将会讨论如何备份和恢复数据。

从多个表中删除行,语法格式:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

tbl_name[.*] [, tbl_name[.*] ...]

FROM table_references

[WHERE where_definition]

或:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

FROM tbl_name[.*] [, tbl_name[.*] ...]

USING table_references

[WHERE where_definition]

说明:对于第一种语法,只删除列于FROM子句之前的表中对应的行。对于第二种语法,只删除列于FROM子句之中(在USING子句之前)的表中对应的行。作用是,可以同时删除多个表中的行,并使用其他的表进行搜索。

【例3.7】 假设有3个表t1、t2、t3,它们都含有id列。要删除t1中id值等于t2的id值的所有行和t2中id值等于t3的id值的所有行,使用如下语句:

DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

或:

DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

(2)使用TRUNCATE TABLE语句删除表数据

使用TRUNCATE TABLE语句将删除指定表中的所有数据,因此也称其为清除表数据语句。

语法格式:

TRUNCATE TABLE table- name

说明:由于TRUNCATE TABLE语句将删除表中的所有数据,且无法恢复,因此使用时必须十分小心。

TRUNCATE TABLE 在功能上与不带 WHERE子句的DELETE语句(如DELETE FROM XS)相同,二者均删除表中的全部行。但 TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。而TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。使用 TRUNCATE TABLE,AUTO_INCREMENT计数器被重新设置为该列的初始值。

对于参与了索引和视图的表,不能使用 TRUNCATE TABLE删除数据,而应使用DELETE语句。

(3)使用UPDATE语句修改表

UPDATE可以用来修改一个表,也可以修改多个表。

修改单个表,语法格式:

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name

SET col_name1=expr1 [, col_name2=expr2 ...]

[WHERE where_definition]

[ORDER BY ...]

[LIMIT row_count]

说明:

● SET子句:根据WHERE子句中指定的条件对符合条件的数据行进行修改。若语句中不设定WHERE子句,则更新所有行。col_name1、col_name2…为要修改列值的列名,expr1、expr2…可以是常量、变量或表达式。可以同时修改所在数据行的多个列值,中间用逗号隔开。

【例3.8】 将XSCJ数据库的XS表(以附录A为准)中的所有学生的总学分都增加10。将姓名为“罗林琳”的同学的备注改为“转专业学习”,学号改为“081251”。

UPDATE XS

SET 总学分 = 总学分+10;

UPDATE XS

SET学号 ='081251' , 备注 ='转专业学习'

WHERE 姓名 = '罗林琳';

SELECT 学号, 姓名, 总学分, 备注

FROM XS;

4、SHOW和DESCRIBE语句

(1) SHOW语句

SHOW TABLES或SHOW TABLES FROM DATABASE_NAME:显示当前数据库中所有表的名称。

SHOW DATABASES:显示MySQL中所有数据库的名称。

SHOW COLUMNS FROM table_name FROM database_name或SHOW COLUMNS FROM database_name.table_name:显示表中列的名称。

SHOW GRANTS FOR user_name:显示一个用户的权限,显示结果类似于GRANT命令。

SHOW INDEX FROM table_name:显示表的索引。

SHOW STATUS:显示一些系统特定资源的信息,例如,正在运行的线程数量。

SHOW VARIABLES:显示系统变量的名称和值。

SHOW PROCESSLIST:显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有PROCESS权限,就可以查看所有人的进程,包括密码。

SHOW TABLE STATUS:显示当前使用或者指定的DATABASE中的每个表的信息。信息包括表类型和表的最新更新时间。

SHOW PRIVILEGES:显示服务器所支持的不同权限。

SHOW CREATE DATABASE database_name:显示创建某一个数据库的CREATE DATABASE语句。

SHOW CREATE TABLE table_name:显示创建一个表的CREATE TABLE语句。

SHOW EVENTS:显示所有事件的列表。

SHOW INNODB STATUS:显示InnoDB存储引擎的状态。

SHOW LOGS:显示BDB存储引擎的日志。

SHOW WARNINGS:显示最后一个执行的语句所产生的错误、警告和通知。

SHOW ERRORS:只显示最后一个执行语句所产生的错误。

SHOW [STORAGE] ENGINES:显示安装后的可用存储引擎和默认引擎。

SHOW PROCEDURE STATUS:显示数据库中所有存储过程基本信息,包括所属数据库、存储过程名称、创建时间等。

SHOW CREATE PROCEDURE sp_name:显示某一个存储过程的详细信息。

(2) DESCRIBE语句

DESCRIBE语句用于显示表中各列的信息,结果等于SHOW columns from语句。

语法格式:

{DESCRIBE | DESC} tb1_name [col_name | wild ]

说明:

DESC是DESCRIBE的简写,二者用法相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐