mysql笔记(11)--子查询

CREATE TABLE clients (

  clno INT,

  fname VARCHAR(15),

  lname VARCHAR(15),

  job VARCHAR(15),

  account_balance DECIMAL(7,2));

 

INSERT INTO clients VALUES

  (10, 'sam','smith','auditor',5525.75),

  (20,'james','jones','manager',8960.25);

 

CREATE TABLE firms (

  clno INT,

  company VARCHAR(15),

  city VARCHAR(15));

 

INSERT INTO firms VALUES

  (10,'abc co','leduc'),

  (20,'def ltd','nisku'),

  (30,'ghi inc','nisku');

select * from firms where clno in(select clno from clients );

select * from firms where clno =(select clno from clients  where job=’manager’);

select fname,lname from clients where clno=(select max(clno) from firms);

select fname,lname from clients where clno=(select avg(clno) from firms);

如果内部查询返回空结果集,子查询会返回错误

子查询共有三种类型,区分它们的方法是根据返回结果的列数和行数。

如果一个子查询返回仅仅一列一行数据,被成为数量级子查询。一个数量级子查询可以用在任何适合数据值比较的地方(一个列值或者文本)。它常常被使用在where子句当中,跟随在比较操作符号后面。
如果子查询返回多个列,并且是一行记录的话,它被称为行级子查询。行级子查询是数量级子查询的发展,可以用在任何适合数量级子查询的地方。
最后,如果一个子查询返回多个列和多行的话,它被称为表级子查询。表级子查询可以用作涉及到表的查询操作,包含在from子句当中。它也常常被用在where子句当中,后面使用in或者exist或者一个确定的比较操作(确定的比较操作是一个比较操作通过使用some,all,或者any限定)

SELECT * FROM clients WHERE clno < ANY (SELECT clno FROM firms);

使用any的规则如下:

ANY返回true,如果子查询的比较操作至少有一个是是true
ANY
返回false,如果子查询返回为空行,或者比较任意一行都是false
ANY
的同义词是SOME,使用in等同于使用= ANY

在这里,第一次的比较还是返回false,而第二此返回true,最后,子查询的结果是false,所以查询返回空行。使用all的规则是:

返回true,如果子查询返回空行记录,或者子查询的每一个结果比较都为true的话。
返回false,如果子查询至少有一个比较结果返回false

在有些时候,查询的结果是子查询是否有一个结果返回。使用[NOT] EXISTS来判断结果集是否为空。如果你的子查询至少有一行返回,使用EXISTS返回true;否则,返回为false。还有一种用法,NOT EXISTS,如果子查询结果集为空,它返回为true,否则的话,返回为true。一般情况下,子查询跟随在[NOT] EXISTS后面,以select *开头。在这里,星号(*)不是表示列出所有的列,而是表示为列出一些列。

SELECT * FROM clients WHERE EXISTS  (SELECT * FROM firms);

也可以把一个子查询,作为一个表名,放在from子句后面(就像oracle里面的用法一样,作为内部视图):

select * from(select * from clients where job like'a%')as cl;//cl作为一个子查询的临时结果集:

当子查询被使用在from子句当中,关键字as是强制使用的;中间的临时结果必须被命名,作为外部的查询被引用。

mysql> update clients set account_balance=(select sum(clno)*2 from firms) where

fname='sam';

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 3222    No Comments

mysql笔记(12)--外键约束

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张 表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。


这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
首先创建用户组表:
创建用户组表
create table t_group (
id int not null,
name varchar(30),
primary key (id)
);
并插入两条记录:
插入记录
insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');


下面创建用户表,分别以不同的约束方式创建外键引用关系:
1、级联(cascade)方式
级联方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete cascade on update cascade
);


参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符


约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #导致t_user中的2、3记录级联删除
update t_group set id=2 where id=1; #导致t_user中的1记录的groupid级联修改为2


2、置空(set null)方式
置空方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete set null on update set null
);


参照完整性测试insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符


约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #导致t_user中的2、3记录的groupid被设置为NULL
update t_group set id=2 where id=1; #导致t_user中的1记录的groupid被设置为NULL


3、禁止(no action / restrict)方式
禁止方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete no action on update no action
);


参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符


约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #错误,从表中有相关引用,因此主表中无法删除
update t_group set id=2 where id=1; #错误,从表中有相关引用,因此主表中无法修改


注:在MySQL中,restrict方式与no action方式作用相同。

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 3679    No Comments

mysql笔记(9)--变更数据表结构

1,重新命名数据表
alter table A rename to B  //
数据表A改名为B
rename table A to B                //
数据表A改名为B
rename A toC,B to A,C to A    //
数据表A和数据表B互换名字
alter table S.A rename to T.A                //
数据库S里面的表A移动到数据库B里面
rename table S.A to T.A   //
数据库S里面的表A移动到数据库B里面
2,
改变数据列的类型
我们现在要把数据表A里面的一个smallint unsigned类型的数据列I再次改动为mediumint unsigned类型
alter table A motify I mediumint unsigned
alter table A change I I mediumint unsigned
注意change子句的特点:不仅能够改变数据列的类型,还能改变数据列的名字。这是modify子句所不能完成的。下面就把这个数据列改名了。
alter table A change I J mediumint unsigned
3,
将数据表由可变长度数据行转变成固定长度数据行
有的时候为了提高性能,需要做这样的转变,但有一点需要注意:必须用同一条alter命令来一次改变所有的数据列,不能仅仅改变一个数据列!举例如下:
create table A(name varchar(40),address varchar(80))
我们开始修改命令就应该是:
alter table A modify name char(40),modify address char(80);
4,
将数据表由固定长度数据行转变成可变长度数据行
如果觉得空间利用率不高,那就需要再转变回来,这个就很简单了,没有特别要求
alter table A modify name varchar(40)
5,
转换数据表类型
我们知道,MySQL数据库存在多种数据表类型,但每一种类型的特性并不相同。
如果你想让你的数据表支持事务处理机制。那就必须把它搞成BDBinnoBDB格式
alter table A type= BDB
alter table A type= InnoBD

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 3856    No Comments

mysql笔记(6)--select高级查询(四)连接

1.交叉连接CROSS JOIN
如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;

举例,下列A、B、C 执行结果相同,但是效率不一样:
A:SELECT * FROM table1 CROSS JOIN table2
B:SELECT * FROM table1,table2

C:select * from table1 a inner join table2 b


A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 a cross join table2 b where a.id=b.id (注:cross join后加条件只能用where,不能用on)
C:select * from table1 a inner join table2 b on a.id=b.id


一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。
因此,如果两个需要求交际的表太大,将会非常非常慢,不建议使用。

2.. 内连接INNER JOIN
两边表同时符合条件的组合

如果仅仅使用
SELECT * FROM table1 INNER JOIN table2

内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。

但是通常情况下,使用INNER JOIN需要指定连接条件。

3.关于等值连接和自然连接

等值连接(=号应用于连接条件, 不会去除重复的列)

自然连接(会去除重复的列)

数据库的连接运算都是自然连接,因为不允许有重复的行(元组)存在。
例如:

SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column

4. 外连接OUTER JOIN
指定条件的内连接,仅仅返回符合连接条件的条目。
外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表(右连接时)或者 两边连接(全外连接时)的所有数据行。

1)左外连接LEFT [OUTER] JOIN
显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL
例如
SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column
2)右外连接RIGHT [OUTER] JOIN
显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL
例如
SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column
3)全外连接full [outer] join
显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集

在检索时指定多个表,将每个表用都好分隔,这样每个表的数据行都和其他表的每行交叉产生所有可能的组合,这样就是一个全连接。

select * from xindi,student;

select xindi.*,student.* from xindi,student where xindi.id=student.id;

左连接:左边的表一定有,若右边的表有匹配的项,则写出,若没有则用null

select *from xindi left join student on xindi.id=student.id; //on 类似于where

如果只有ON子句的条件,那么左边表的每一行都会返回。

如:select *from xindi left join student on xindi.id=1; //返回的是与上面一行相同的结果

Left join 常与where结合:

mysql> select *from xindi left join student on xindi.id=student.id where student.id is not null ; //on xindi.id=student.id是连接的条件

等价于mysql> select *from xindi left join student where xindi.id=student.id ; 内连接

如:create table stu(stu_id int primary key,stu_name char(10),class_id int);

    create table class(class_id int,class_name char(10));

insert into stu values(1,‘lili’,11),(2,'lucy',12),(3,'jim',13);

   insert class values(11,'gradeone'),(12,'gradetwo'),(14,'gradetwo');

mysql> select stu.stu_id,class.class_id from stu join class on(stu.class_id=class.class_id);

mysql> select stu.stu_name, class.class_name from stu left join class on(stu.class_id=class.class_id); //左连接

mysql> select stu.stu_name, class.class_name from stu right join class on(stu.class_id=class.class_id); //右连接

mysql> select stu.stu_name, class.class_name from stu join class on(stu.class_id=class.class_id); //全连接

注:全连接和左连接的结果集排列顺序是不同的

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 5030    No Comments

mysql笔记(6)--select高级查询(二)sql变量,对字符串的处理,null值

1.设置sql变量

可以使用查询结果来设置变量,我们能够方便的把一些结果保存起来以供他用。变量命名规则是:@name,赋值语法是 @name:=value,

如:select @bir:=birth from stu where name=‘lili’;

select * from stu where birth>=@bir;

也可以用子查询得到上述结果:select * from stu where birth>(select birth from stu where name='lili');

2. mysql对字符串的处理

mysql能够支持的数据类型,和其它的数据库一样,我们可以处理各种数值(整型,浮点),字符串型,日期/时间型,NULL值等等。大家在使用的需要注 意不同类型的数值的格式是不一样的。在这里,对字符串的处理有一个比较特殊的地方大家需要理解。因为字符串两端是需要用引号(单引号,双引号)括起来的, 但是如果字符串本身里面也包括了引号(单引号,双引号),我们应该怎么办呢。这时就必须用以下三种方法之一来标识这个特殊的字符串。
   (1)如果字符串内部的引号字符与字符串两端的引号字符相同,则双写该引号
‘I can’’t’
“He said,””I told you so, “”’
   (2). 用与字符串内部的引号字符不同的引号把该字符串引起来,此时,就不用双写字符串内部的引号了
“I can’t”
‘He said,”I told you so,”’
   (3)用反斜杠对字符串内部的引号字符进行转义,此时与字符串两端的引号无关
     ‘I can\’t’
      “He said,\”I told you so,\””

2. null 值的问题

mysql> INSERT INTO my_table (phone) VALUES (NULL);

mysql> INSERT INTO my_table (phone) VALUES ("");

两个语句把值插入到phone列,但是第一个插入一个NULL值而第二个插入一个空字符串。第一个的含义可以认为是“电话号码不知道”,而第二个则可意味着“她没有电话”。

在SQL中,NULL值在于任何其他值甚至NULL值比较时总是假的(FALSE)。包含NULL的一个表达式总是产生一个NULL值,如:select null+2;返回null

当使用ORDER BY时,首先呈现NULL值。如果你用DESC以降序排序,NULL值最后显示。当使用GROUP BY时,所有的NULL值被认为是相等的。

为了有助于NULL的处理,你能使用IS NULL和IS NOT NULL运算符和IFNULL()函数。

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 4752    No Comments

mysql笔记(6)--select高级查询(一)

1.表和列的别名:

(1) mysql> SELECT name,species FROM pet ORDER BY name, species;

mysql> SELECT name,species FROM pet ORDER BY 1,2;

mysql> SELECT name AS n,species AS s FROM pet ORDER BY n,s;

   mysql> SELECT name n,species s FROM pet ORDER BY n,s;

用列的别名构造新表: mysql> CREATE TABLE pet1

                           -> SELECT name (AS) animal,owner (AS) child

                            -> FROM pet;

你可以在GROUP BY、ORDER BY或在HAVING部分中使用别名引用列。注意,你的ANSI SQL 不允许你在一个WHERE子句中引用一个别名。

select name n, count(*)as total from xindi group by n;//正确

select phone p from xindi where p>123;//错误

 

(2)表的别名具体方法类似于列。

列的别名经常用于表自身的连接中。你不必有2个不同的表来执行一个联结。如果你想要将一个表的记录与同一个表的其他记录进行比较,联结一个表到自身有时是有用的。

   pet联结自身来进行相似种类的雄雌配对:

   mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species

       -> FROM pet AS p1, pet AS p2

       -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";


2.where ,group by,having 用法小注:select name,sum(phone) from xindi group by phone having sum(phone)>1233;

执行where子句查找符合条件的数据;

使用group by 子句对数据进行分组;

对group by 子句形成的组运行聚集函数计算每一组的值;

最后用having 子句去掉不符合条件的组。

需要注意:having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.

having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。

having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。

select dno,sum(salary)from employe group by dno having sum(salary)>10000


3.limit,concat的用法,分离year,month,day

(1)limit的用法

mysql> select * from xindi order by phone limit 2; //只取前两个值

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

| name | phone | email | id |

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

| brown | NULL | NULL | 5 |

| lili |   123 | NULL | 6 |

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

2 rows in set (0.01 sec)


mysql> select * from xindi order by phone limit 2,2; //只取第三和第四个值

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

| name | phone | email | id |

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

| lili |   123 | NULL | 7 |

| Lucy | 13456 | NULL | 3 |

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

2 rows in set (0.00 sec)

(2) concat

select concat(name,email)from xindi;

select concat(name,email) as name from xindi;

concat()函数把这个值转化为字符串,无论输出参数是一个字符串还是一个数值, concat() 都会返回一个字符串.

(3) 三个函数year(),month(),dayofmonth()可以分别分离出日期中的年月日来。

mysql> create table stu(id int primary key,name char(10),birth date,death date);

insert stu values(1,'lili','2000-01-01','2010-01-01');

insert stu values(2,'lucy','2002-1-1','2009-1-1');

select * from stu where death>'2009-12-31';

select * from stu where month(birth)=1;

select * from stu where year(birth)>2000;

select * from stu where dayofmonth(birth)>1;

select * from stu where dayofmonth(birth)>=1;

dayofmonth()函数返回当月的第几天。。

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 3919    No Comments

mysql笔记(5)--集合函数,时间日期函数,字符串匹配函数

mysql中的集合函数有:count(),sum(),avg(),min(),max(),时间和日期函数等。

1.   1) select count(*) from xindi where phone=123456;//计算表xindi中phone=123456的个数 或者 select count(phone)from xindi where phone=123456;

   2)select count(phone)from xindi; //phone 列的数目

   3)select count(distinct phone)from xindi;//有多少个不同种类的电话

    4)如果种类phone出现了不止一次,它将只被计算一次。关键字DISTINCT 决定了只有互不相同的值才被计算。

通常,当你使用COUNT()时,字段中的空值将被忽略,不算入内。

另外,COUNT()函数通常和GROUP BY子句配合使用,例如可以这样返回每种phone的数目:

select phone, count(phone) from xindi group by phone;

5)select avg(phone)from xindi; // 在计算平均时,忽略空值,phone共四个值,两个空值,除以时只除2.

select name,avg(phone) from xindi group by(name); // 计算每个名字的phone 的平均值

6)select sum(phone) from xindi;

   Select name, sum(phone) group by (name);

7)极值:

Select min(phone)from xindi;

Select name,min(phone)from xindi;//这是错误的sql语句,因为集合函数不能和非分组的列混合使用,上述name未分组。所以应用下面的语句:

select name,min(phone) from xindi group by name;

2.操作时间和日期:日期和时间类型:DATETIME、DATE、TIMESTAMP、TIME和YEAR这5种类型的每一个都有合法值的一个范围,而“零”当你指定确实不合法的值时被使用。

a. 当前日期 select curdate();select curdate()+0;

   当前时间 select curtime();select curtime()+0;

b. 自动记录数据的改变时间:

     TIMESTAMP类型提供一种类型,TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。你可以使用它自动地用当前的日期和时间标记INSERT或UPDATE的操作。

mysql> CREATE TABLE student

-> (

-> id int,

-> name char(16),

-> time timestamp

-> );

向表中插入记录,可以查看效果:

Insert student values(1,’jim’,null);

select *from student;

update student set name=’lan’where id=1;

select*from student; //time的值会改变

有时希望不更改任何值,也能达到修改timestamp列的值,这时设置该列的值为null,mysql就可以自动更新timestamp的值:

Update student set time=null where id=1;

Select*from student ;//这时timestamp的值已改变

如果,当你创建一个行时,你想要一个TIMESTAMP被设置到当前的日期和时间,但在以后无论何时行被更新时都不改变,可以这样

Update student set name=’yun’,time=time where id=1;

Select *from student where id=1;

TIMESTAMP的存储需求是4字节,而DATETIME列的存储需求是8字节。

c.返回时间和日期

mysql> SELECT * FROM weblog WHERE entrydate>="2001-02-08" AND entrydate<"2001-02-09" ;

或者 mysql> SELECT * FROM weblog WHERE entrydate LIKE '2001-02-08%' ;

注:LIKE运算符和模式匹配,是通过比较串值进行的,因此必须使用标准的时间书写格式,YYYY-MM-DD HH-MM-SS

d. 比较日期和时间:

mysql> SELECT FROM_DAYS(729669); -> '1997-10-07'
 
 TO_DAYS(date) 给出一个日期 date,返回一个天数(从 0 年开始的天数): mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('1997-10-07'); -> 729669
TO_DAYS()  无意于使用先于格里高里历法(即现行的阳历)(1582)出现的值,因为它不考虑当历法改变时所遗失的天数。
 
FROM_DAYS(N) 给出一个天数 N,返回一个 DATE 值:
返回2个时间相差的天数

select to_days(now())-to_days('20100510');


3. 字符串模式匹配:

SQL的模式匹配允许你使用 “_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在MySQL中,SQL的模式缺省是忽略大小写的。

select*from xindi where name like "l%i";

select*from xindi where name like " %i";

select*from xindi where name like "l% ";

select*from xindi where name like "l___";//l后面有三个字符的

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";

mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";

mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";//重复5次(有5个字符)

mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$"; //重复5次(有5个字符)

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 3996    No Comments

mysql笔记(4)--数据库的导入导出

(1)导入数据 load data:

Load Data InFile 'C:/Data.txt' Into Table `TableTest` ;

Load Data InFile 'C:/Data.txt' Into Table `TableTest` Lines Terminated By '\r\n';

自定义语法
Load Data InFile 'C:/Data.txt' Into Table `TableTest` Fields Terminated By ',' Enclosed By '"' Escaped By '"' Lines Terminated By '\r\n';
Fields Terminated By ',' Enclosed By '"' Escaped By '"'
表示每个字段用逗号分开,内容包含在双引号内
Lines Terminated By '\r\n'; 表示每条数据用换行符分开

(2)导出数据select* from xindi into outfile ‘d:\\a.txt’;

使用select命令还可以指定卸出文件时,字段之间的分隔字符,转义字符,包括字符,及记录行分隔字符。列在下面:
  FIELDS
  TERMINATED BY 't' [OPTIONALLY] ENCLOSED BY ''
  ESCAPED BY '\'
  LINES
  TERMINATED BY 'n'
   TERMINATED 表示字段分隔 [OPTIONALLY] ENCLOSED 表示字段用什么字符包括起来,如果使用了OPTIONALLY则只有CHAR和VERCHAR 被包括。ESCAPED 表示当需要转义时用什么作为转义字符 ;LINES TERMINATED 表示每行记录之间用什么分隔 。
  上面列的是缺省值,而且这些项都是可选的,不选则使用缺省值。可以根据需要进行修改。给出一个例子如下:
  mysql> select * from xindi into outfile 'a.txt' fields terminated by ',' enclosed by '"';

 结果可能如下:
  "1","Mika","Hakinnen","1"
  "2","David","Coulthard","1"
  "3","Michael","Schumacher","2"
  "4","Rubens","Barrichello","2

1.导出整个数据库

mysqldump -u 用户名 -p 数据库名 > 导出的文件名

mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

2.导出一个表

mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

3.导出一个数据库结构

mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc >d:/wcnc_db.sql

-d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table

4.导入数据库

常用source命令

进入mysql数据库控制台,

如mysql -u root -p

mysql>use 数据库

然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

mysql>source d:/wcnc_db.sql


补充:
mysqldump支持下列选项: 

--add-locks 
在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。 
--add-drop-table 
在每个create语句之前增加一个drop table。 
--allow-keywords 
允许创建是关键词的列名字。这由在列名前面加表名的方法做到。 
-c, --complete-insert 
使用完整的insert语句(用列名字)。 
-C, --compress 
如果客户和服务器均支持压缩,压缩两者间所有的信息。 
--delayed 
用INSERT DELAYED命令插入行。 
-e, --extended-insert 
使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句) 
-#, --debug[=option_string] 
跟踪程序的使用(为了调试)。 
--help 
显示一条帮助消息并且退出。 
--fields-terminated-by=... 
--fields-enclosed-by=... 
--fields-optionally-enclosed-by=... 
--fields-escaped-by=... 
--fields-terminated-by=... 
这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。 
LOAD DATA INFILE语法。 
-F, --flush-logs 
在开始导出前,洗掉在MySQL服务器中的日志文件。 
-f, --force, 
即使我们在一个表导出期间得到一个SQL错误,继续。 
-h, --host=.. 
从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。 
-l, --lock-tables. 
为开始导出锁定所有表。 
-t, --no-create-info 
不写入表创建信息(CREATE TABLE语句) 
-d, --no-data 
不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的! 
--opt 
同--quick --add-drop-table --add-locks --extended-insert --lock-tables。 
应该给你为读入一个MySQL服务器的尽可能最快的导出。 
-pyour_pass, --password[=your_pass] 
与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。 
-P port_num, --port=port_num 
与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。) 
-q, --quick 
不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。 
-S /path/to/socket, --socket=/path/to/socket 
与localhost连接时(它是缺省主机)使用的套接字文件。 
-T, --tab=path-to-some-directory 
对 于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据--fields-xxx和-- lines--xxx选项来定。 
-u user_name, --user=user_name 
与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。 
-O var=option, --set-variable var=option
设置一个变量的值。可能的变量被列在下面。 
-v, --verbose 
冗长模式。打印出程序所做的更多的信息。 
-V, --version 
打印版本信息并且退出。 
-w, --where='where-condition' 
只导出被选择了的记录;注意引号是强制的! 
"--where=user='jimf'" "-wuserid>1" "-wuserid<1" 

最常见的mysqldump使用可能制作整个数据库的一个备份: 

mysqldump --opt database > backup-file.sql 

但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的: 

mysqldump --opt database | mysql --host=remote-host -C database 

由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了: 

mysqladmin create target_db_name 
mysql target_db_name < backup-file.sql

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 3131    No Comments