一、Mysql中关于数据库的基本操作
1、用 SHOW 显示已有的数据库
句法: SHOW DATABASES [LIKE wild]
如果使用 LIKE wild 部分, wild 字符串可以是一个使用 SQL 的“ %”和“ _”通配符的字符串。
功能: SHOW DATABASES 列出在 MySQL 服务器主机上的数据库。
2、用 Create Dabase 创建数据库
句法: CREATE DATABASE db_name
功能: CREATE DATABASE 用给定的名字创建一个数据库。
如果数据库已经存在, 发生一个错误。在 MySQL 中的数据库实现成包含对应数据库中表的文件的目录。因为数据库在初始创建时没有任何表,CREATE DATABASE语句只是在 MySQL数据目录下面创建一个目录。
例如:
mysql>create database myfirst;
然后利用 show databases 观察效果。
3、用 DROP DATABASE 删除数据库
句法: DROP DATABASE [IF EXISTS] db_name
功能: DROP DATABASE 删除数据库中的所有表和数据库。要小心地使用这个命令!
DROP DATABASE返回从数据库目录被删除的文件的数目。通常,这3倍于表的数量,因为每张表对应于一个“ .MYD”文件、一个“ .MYI”文件和一个“ .frm”文件。
在 MySQL 3.22 或以后版本中,你可以使用关键词 IF EXISTS 避免“数据库不存在”这个错误。
4、用 USE 选用数据库
句法: USE db_name
USE db_name 语句告诉 MySQL 使用 db_name 数据库作为随后的查询的缺省数据库。
数据库保持到会话结束,或发出另外一个 USE 语句:
mysql> USE db1;
mysql> SELECT count(*) FROM mytable; # selects from db1.mytable
mysql> USE db2;
mysql> SELECT count(*) FROM mytable; # selects from db2.mytable
如果你不是用 USE 语句,那么上面的例子应该写成:
mysql> SELECT count(*) FROM db1.mytable;
mysql> SELECT count(*) FROM db2.mytable;
由于 use 也是一个 mysql客户程序的命令,所以你可以在命令行最后不加分号,客户程序可以得到结果。
二、Mysql中关于数据表的操作
1、用 SHOW/ DESCRIBE 语句显示数据表的信息
句法:
SHOW TABLES [FROM db_name] [LIKE wild]
or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild]
or SHOW INDEX FROM tbl_name [FROM db_name]
or SHOW TABLE STATUS [FROM db_name] [LIKE wild]
{DESCRIBE | DESC} tbl_name {col_name | wild}
你能使用 db_name.tbl_name 作为 tbl_name FROM db_name 句法的另一种选择。
SHOW TABLES 列出在一个给定的数据库中的表。你也可以用 mysqlshow db_name命令得到这张表。
SHOW COLUMNS 列出在一个给定表中的列。如果列类型不同于你期望的是基于CREATE TABLE 语句的那样,注意, MySQL 有时改变列类型。
DESCRIBE 语句提供了类似 SHOW COLUMNS 的信息。 DESCRIBE 提供关于一张表的列的信息。col_name 可以是一个列名字或包含 SQL 的“ %”和“ _”通配符的一个字符串。这个语句为了与 Oracle 兼容而提供的。
2、用 CREATE TABLE 语句创建数据表
CREATE TABLE 语句的基本语法
CREATE TABLE tbl_name(create_definition,...) [TYPE =table_type]
create_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT][PRIMARY KEY]
在 MySQL3.22 或以后版本中,表名可以被指定为 db_name.tbl_name,不管有没有当前的数据库都可以。
在某些情况下, MySQL 隐含地改变在一个 CREATE TABLE 语句给出的一个列说明。
--长度小于 4 的 VARCHAR 被改变为 CHAR。
--如果在一个表中的任何列有可变长度,结果是整个行是变长的。因此, 如果一张表包含任何变长的列(VARCHAR、 TEXT 或 BLOB),所有大于 3 个字符的 CHAR列被改变为 VARCHAR 列。这在任何方面都不影响你如何使用列;在 MySQL 中,VARCHAR 只是存储字符的一个不同方法。 MySQL 实施这种改变,是因为它节省空间并且使表操作更快捷。
--TIMESTAMP 的显示尺寸必须是偶数且在 2 ~ 14 的范围内。如果你指定 0 显示尺寸或比 14 大,尺寸被强制为 14。从 1~13 范围内的奇数值尺寸被强制为下一个更大的偶数。
--你不能在一个 TIMESTAMP 列里面存储一个文字 NULL;将它设为 NULL 将设置为当前的日期和时间。因为 TIMESTAMP 列表现就是这样, NULL 和 NOT NULL属性不以一般的方式运用并且如果你指定他们,将被忽略。 DESCRIBE tbl_name总是报告该 TIMESTAMP 列可能赋予了 NULL 值。
如果你想要知道 MySQL 是否使用了除你指定的以外的一种列类型,在创建或改变你的表之后,发出一个 DESCRIBE tbl_name 语句即可。
3、利用 SELECT 的结果创建表
CREATE TABLE ... SELECT 语句使得能利用 SELECT 查询的结果直接得出一个新表。只需一步就可以完成任务,不必知道或指定所检索的列的数据类型。这使得很容易创建一个完全用所喜欢的数据填充的表,并且为进一步查询作了准备。
如果你在 CREATE 语句后指定一个 SELECT, MySQL 将为在 SELECT 中所有的单元创键新字段。
可以通过选择一个表的全部内容(无 WHERE 子句)来拷贝一个表,或利用一个总是失败的 WHERE 子句来创建一个空表。
CREATE TABLE test SELECT * from test2;
CREATE TABLE test SELECT * from test2 where 0;
4、用 ALTER TABLE 语句修改表的结构
有时你可能需要改变一下现有表的结构,那么 Alter Table 语句将是你的合适选择。
增加列
alter table tbl_name add col_name type
例如,给表增加一列 weight
alter table pet add weight int;
删除列
alter table tbl_name drop col_name
例如,删除列 weight:
alter table pet drop weight;
改变列
alter table tbl_name modify col_name type
例如,改变 weight 的类型:
alter table pet modify weight samllint;
另一种方法是:
alter table tbl_name change old_col_name col_name type
例如:
alter table pet change weight weight samllint;
给列更名
alter table pet change weight wei;
给表更名
alter table tbl_name rename new_tbl
例如,把 pet 表更名为 animal
alter table pet rename animal;
5、用 DROP TABLE 语句删除数据表
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]
DROP TABLE 删除一个或多个数据库表。所有表中的数据和表定义均被删除,故小心使用这个命令!
在 MySQL 3.22 或以后版本,你可以使用关键词 IF EXISTS 类避免不存在表的一个错
误发生。
可以同时指定数据库和表:
DROP TABLE mytest.guestbook;
三、向数据表插入行记录
1、使用 INSERT 语句插入新数据
语法: INSERT [INTO] tbl_name [(col_name,...)] VALUES (pression,...),…
INSERT [INTO] tbl_name SET col_name=expression, ...
让我们开始利用 INSERT 语句来增加记录,这是一个 SQL 语句,需要为它指定希望插入数据行的表或将值按行放入的表。 INSERT 语句具有几种形式:
---可指定所有列的值:
例如:
insert into worker values("tom","
[email protected]");
“ INTO”一词自 MySQL 3.22.5 以来是可选的。(这一点对其他形式的 INSERT 语句也成立。) VALUES 表必须包含表中每列的值,并且按表中列的存放次序给出。(一般,这就是创建表时列的定义次序。如果不能肯定的话,可使用 DESCRIBE tbl_name 来查看这个次序。)
---使用多个值表,可以一次提供多行数据。
insert into worker values("tom","
[email protected]"),("jack","
[email protected]");
有多个值表的 INSERT ... VALUES 的形式在 MySQL 3.22.5 或以后版本中支持。
---可以给出要赋值的那个列,然后再列出值。这对于希望建立只有几个列需要初始设置的记录是很有用的。
insert into worker (name) values ("tom");
这种形式的 INSERT 也允许多个值表:
insert into worker (name) values ("tom"), ("paul");
在列的列表中未给出名称的列都将赋予缺省值。
---可以 col_name = value 的形式给出列和值。
insert into worker set name=‘tom‘;
在 SET 子句中未命名的行都赋予一个缺省值。使用这种形式的 INSERT 语句不能插入多行。
---一个 expression 可以引用在一个值表先前设置的任何列。例如,你能这样:
INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
但不能这样:
INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
2、使用 INSERT…SELECT 语句插入从其他表选择的行
使用 select 从其它表来直接创建表,甚至可以同时复制数据记录。如果你已经拥有了一个表,你同样可以从 select 语句的配合中获益。从其它表中录入数据,例如:
insert into tbl_name1(col1,col2) select col3,col4 from tbl_name2;
你也可以略去目的表的列列表,如果你每一列都有数据录入。
insert into tbl_name1 select col3,col4 from tbl_name2;
INSERT INTO ... SELECT 语句满足下列条件:
--查询不能包含一个 ORDER BY子句。
--INSERT 语句的目的表不能出现在 SELECT 查询部分的 FROM 子句。
3、使用 replace、 replace…select 语句插入
REPLACE 功能与 INSERT 完全一样,除了如果在表中的一个老记录具有在一个唯一索引上的新记录有相同的值,在新记录被插入之前,老记录被删除。对于这种情况, insert语句的表现是产生一个错误。REPLACE语句也可以和 SELECT 相配合,所以上面select的内容完全适合 REPALCE。
由于 REPLACE 语句可能改变原有的记录,因此使用时要小心。
4、使用 LOAD 语句批量录入数据
进入MySQL后,使用命令:load data local infile 'C:/tab_user.txt' into table tab_user lines terminated by '\r\n' ignore 1 lines;
该语句的语法如下:
基本语法:
load data [low_priority] [local] infile 'file_name txt' [replace | ignore]
into table tbl_name
[fields
[terminated by't']
[OPTIONALLY] enclosed by '']
[escaped by'\' ]]
[lines terminated by'n']
[ignore number lines]
[(col_name, )]
语法部分说明:load data infile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前,mysqld进程(服务)必须已经在运行。为了安全原因,当读取位于服务器上的文本文件时,文件必须处于数据库目录或可被所有人读取。另外,为了对服务器上文件使用load data infile,在服务器主机上你必须有file的权限。
(1)、如果你指定关键词low_priority,那么MySQL将会等到没有其他人读这个表的时候,才把插入数据。可以使用如下的命令:
load data low_priority infile "C:/tab_user.txt" into table tab_user;
(2)、如果指定local关键词,则表明从客户主机读文件。如果local没指定,文件必须位于服务器上。
(3)、replace和ignore关键词控制对现有的唯一键记录的重复的处理。如果你指定replace,新行将代替有相同的唯一键值的现有行。如果你指定ignore,跳过有唯一键的现有行的重复行的输入。如果你不指定任何一个选项,当找到重复键时,出现一个错误,并且文本文件的余下部分被忽略。例如:
load data low_priority infile "C:/tab_user.txt" replace into table tab_user;
(4)、分隔符
(a) fields关键字指定了文件记段的分割格式,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:
terminated by分隔符:意思是以什么字符作为分隔符
enclosed by字段括起字符
escaped by转义字符
terminated by描述字段的分隔符,默认情况下是tab字符(\t)
enclosed by描述的是字段的括起字符。
escaped by描述的转义字符。默认的是反斜杠(backslash:\ )
例如:load data infile "C:/tab_user.txt" replace into table tab_user (id,name) terminated by',' ignore 1 lines;(,作为分隔符)
(b)lines 关键字指定了每条记录的分隔符默认为'\n'即为换行符
如果两个字段都指定了那fields必须在lines之前。如果不指定fields关键字缺省值与如果你这样写的相同: fields terminated by'\t' enclosed by ’ '' ‘ escaped by'\\'
如果你不指定一个lines子句,缺省值与如果你这样写的相同: lines terminated by'\n'
例如:load data infile "C:/tab_user.txt" replace into table test fields terminated by ',' lines terminated by '/n';
(5)、load data infile 可以按指定的列把文件导入到数据库中。当我们要把数据的一部分内容导入的时候,需要加入一些栏目(列/字段/field)到MySQL数据库中,以适应一些额外的需要。比方说,我们要从Access数据库升级到MySQL数据库的时候
下面的例子显示了如何向指定的栏目(field)中导入数据:
load data infile "C:/tab_user.txt" into table tab_user(id, name);
(6)、当在服务器主机上寻找文件时,服务器使用下列规则:
(a)如果给出一个绝对路径名,服务器使用该路径名。
(b)如果给出一个有一个或多个前置部件的相对路径名,服务器相对服务器的数据目录搜索文件。
(c)如果给出一个没有前置部件的一个文件名,服务器在当前数据库的数据库目录寻找文件。
例如: /myfile.txt”给出的文件是从服务器的数据目录读取,而作为“myfile txt”给出的一个文件是从当前数据库的数据库目录下读取。
注意:在数据文件***.txt中,如果某个字段中值为空值,则用\N表示。