hithyc 2011-07-23
一.安装与配置MYSQL
二.常用mysql命令行命令
1.mysql的启动与停止
启动MYSQL服务netstartmysql
停止MYSQL服务netstopmysql
2.netstat–na|findstr3306查看被监听的端口,findstr用于查找后面的端口是否存在
3.在命令行中登陆MYSQL控制台,即使用MYSQLCOMMENDLINETOOL
语法格式mysql–user=root–password=123456db_name
或mysql–uroot–p123456db_name
4.进入MYSQL命令行工具后,使用status;或\s查看运行环境信息
5.切换连接数据库的语法:usenew_dbname;
6.显示所有数据库:showdatabases;
7.显示数据库中的所有表:showtables;
8.显示某个表创建时的全部信息:showcreatetabletable_name;
9.查看表的具体属性信息及表中各字段的描述
Describetable_name;缩写形式:desctable_name;
三。MySql中的SQL语句
1.数据库创建:Createdatabasedb_name;
数据库删除:Dropdatabasedb_name;删除时可先判断是否存在,写成:dropdatabaseifexitsdb_name
2.建表:创建数据表的语法:createtabletable_name(字段1数据类型,字段2数据类型);
例:createtablemytable(idint,usernamechar(20));
删表:droptabletable_name;例:droptablemytable;
8.添加数据:Insertinto表名[(字段1,字段2,….)]values(值1,值2,…..);
如果向表中的每个字段都插入一个值,那么前面[]括号内字段名可写也可不写
例:insertintomytable(id,username)values(1,’zhangsan’);
9.查询:查询所有数据:select*fromtable_name;
查询指定字段的数据:select字段1,字段2fromtable_name;
例:selectid,usernamefrommytablewhereid=1orderbydesc;多表查询语句------------参照第17条实例
10.更新指定数据,更新某一个字段的数据(注意,不是更新字段的名字)
Updatetable_nameset字段名=’新值’[,字段2=’新值’,…..][whereid=id_num][orderby字段顺序]
例:updatemytablesetusername=’lisi’whereid=1;
Order语句是查询的顺序,如:orderbyiddesc(或asc),顺序有两种:desc倒序(100—1,即从最新数据往后查询),asc(从1-100),Where和order语句也可用于查询select与删除delete
11.删除表中的信息:
删除整个表中的信息:deletefromtable_name;
删除表中指定条件的语句:deletefromtable_namewhere条件语句;条件语句如:id=3;
12.创建数据库用户
一次可以创建多个数据库用户如:
CREATEUSERusername1identifiedBY‘password’,username2IDENTIFIEDBY‘password’….
13.用户的权限控制:grant
库,表级的权限控制:将某个库中的某个表的控制权赋予某个用户
GrantallONdb_name.table_nameTOuser_name[indentifiedby‘password’];
14.表结构的修改
(1)增加一个字段格式:
altertabletable_nameaddcolumn(字段名字段类型);----此方法带括号
(2)指定字段插入的位置:
altertabletable_nameaddcolumn字段名字段类型after某字段;
删除一个字段:
altertabletable_namedrop字段名;
(3)修改字段名称/类型
altertabletable_namechange旧字段名新字段名新字段的类型;
(4)改表的名字
altertabletable_namerenametonew_table_name;
(5)一次性清空表中的所有数据
truncatetabletable_name;此方法也会使表中的取号器(ID)从1开始
15.增加主键,外键,约束,索引。。。。(使用方法见17实例)
①约束(主键Primarykey、唯一性Unique、非空NotNull)
②自动增张auto_increment
③外键Foreignkey-----与referencetable_name(col_name列名)配合使用,建表时单独使用
④删除多个表中有关联的数据----设置foreignkey为setnull---具体设置参考帮助文档
16.查看数据库当前引擎
SHOWCREATETABLEtable_name;
修改数据库引擎
ALTERTABLEtable_nameENGINE=MyISAM|InnoDB;
17.SQL语句运用实例:
--1建users表
createtableusers(idintprimarykeyauto_increment,nikenamevarchar(20)notnullunique,passwordvarchar(100)notnull,addressvarchar(200),reg_datetimestampnotnulldefaultCURRENT_TIMESTAMP);
--2建articles表,在建表时设置外键
createtablearticles(idintprimarykeyauto_increment,contentlongtextnotnull,useridint,constraintforeignkey(userid)referencesusers(id)ondeletesetnull);
-----------------------------------------------------------------------
--2.1建articles表,建表时不设置外键
createtablearticles(idintprimarykeyauto_increment,contentlongtextnotnull,useridint);
--2.2给articles表设置外键
altertablearticlesaddconstraintforeignkey(userid)referencesusers(id)ondeletesetnull;
------------------------------------------------------------------------
--3.向users表中插入数据,同时插入多条
insertintousers(id,nikename,password,address)values(1,'lyh1','1234',null),(10,'lyh22','4321','湖北武汉'),(null,'lyh333','5678','北京海淀');
--4.向article中插入三条数据
insertintoarticles(id,content,userid)values(2,'hahahahahaha',11),(null,'xixixixixix',10),(13,'aiaiaiaiaiaiaiaiaiaiaiaia',1),(14,'hohoahaoaoooooooooo',10);
--5.进行多表查询,选择users表中ID=10的用户发布的所有留言及该用户的所有信息
selectarticles.id,articles.content,users.*fromusers,articleswhereusers.id=10andarticles.userid=users.idorderbyarticles.iddesc;
--6.查看数据库引擎类型
showcreatetableusers;
--7.修改数据库引擎类型
altertableusersengine=MyISAM;---因为users表中ID被设置成外键,执行此句会出错
--8.同表查询,已知一个条件的情况下.查询ID号大于用户lyh1的ID号的所有用户
selecta.id,a.nikename,a.addressfromusersa,usersbwhereb.nikename='lyh1'anda.id>b.id;
------也可写成
selectid,nikename,addressfromuserswhereid>(selectidfromuserswherenikename='lyh1');
9.显示年龄比领导还大的员工:
selecta.namefromusersa,usersbwherea.managerid=b.idanda.age>b.age;
查询编号为2的发帖人:先查articles表,得到发帖人的编号,再根据编号查users得到的用户名。
接着用关联查询.
select*fromarticles,users得到笛卡儿积,再加orderbyarticles.id以便观察
使用select*fromarticles,userswherearticles.id=2筛选出2号帖子与每个用户的组合记录
再使用select*fromarticles,userswherearticles.id=2andarticles.userid=users.id选出users.id等于2号帖的发帖人id的记录.
只取用户名:selectuserwhereuser.id=(selectuseridfromarticleswherearticle.id=2)
找出年龄比小王还大的人:假设小王是28岁,先想找出年龄大于28的人
select*fromuserswhereage>(selectagefromuserswherename='xiaowang');
*****要查询的记录需要参照表里面的其他记录:
selecta.namefromusersa,usersbwhereb.name='xiaowang'anda.age>b.age
表里的每个用户都想pk一下.selecta.nickname,b.nicknamefromusersa,usersbwherea.id>b.id;
更保险的语句:selecta.nickname,b.nicknamefrom(select*fromusersorderbyid)a,(se
lect*fromusersorderbyid)bwherea.id>b.id;
再查询某个人发的所有帖子.
selectb.*fromarticlesa,articlesbwherea.id=2anda.userid=b.userid
说明:表之间存在着关系,ER概念的解释,用access中的示例数据库演示表之间的关系.只有innodb引擎才支持foreignkey,mysql的任何引擎目前都不支持check约束。
四、字符集出现错误解决办法
出现的问题:
mysql>updateusers
->setusername='关羽'
->whereuserid=2;
ERROR1366(HY000):Incorrectstringvalue:'\xB9\xD8\xD3\xF0'forcolumn'usern
ame'atrow1
向表中插入中文字符时,出现错误。
mysql>select*fromusers;
+--------+----------+
|userid|username|
+--------+----------+
|2|????|
|3|????|
|4|?í?ù|
+--------+----------+
3rowsinset(0.00sec)
表中的中文字符位乱码。
解决办法:
使用命令:
mysql>status;
--------------
mysqlVer14.12Distrib5.0.45,forWin32(ia32)
Connectionid:8
Currentdatabase:test
Currentuser:root@localhost
SSL:Notinuse
Usingdelimiter:;
Serverversion:5.0.45-community-ntMySQLCommunityEdition(GPL)
Protocolversion:10
Connection:localhostviaTCP/IP
Servercharacterset:latin1
Dbcharacterset:latin1
Clientcharacterset:gbk
Conn.characterset:gbk
TCPport:3306
Uptime:7hours39min19sec
Threads:2Questions:174Slowqueries:0Opens:57Flushtables:1Openta
bles:1Queriespersecondavg:0.006
--------------
查看mysql发现Servercharacterset,Dbcharacterset的字符集设成了latin1,所以出现中文乱码。
mysql>showtables;
+----------------+
|Tables_in_test|
+----------------+
|users|
+----------------+
1rowinset(0.00sec)
更改表的字符集。
mysql>altertableuserscharactersetGBK;
QueryOK,3rowsaffected(0.08sec)
Records:3Duplicates:0Warnings:0
查看表的结构:
mysql>showcreateusers;
ERROR1064(42000):YouhaveanerrorinyourSQLsyntax;checkthemanualthat
correspondstoyourMySQLserverversionfortherightsyntaxtousenear'users
'atline1
mysql>showcreatetableusers;
+-------+-----------------------------------------------------------------------
------------------------------------------------------------------------------+
|Table|CreateTable
|
+-------+-----------------------------------------------------------------------
------------------------------------------------------------------------------+
|users|CREATETABLE`users`(
`userid`int(11)defaultNULL,
`username`char(20)charactersetlatin1defaultNULL
)ENGINE=InnoDBDEFAULTCHARSET=gbk|
+-------+-----------------------------------------------------------------------
------------------------------------------------------------------------------+
1rowinset(0.00sec)
mysql>descusers;
+----------+----------+------+-----+---------+-------+
|Field|Type|Null|Key|Default|Extra|
+----------+----------+------+-----+---------+-------+
|userid|int(11)|YES||NULL||
|username|char(20)|YES||NULL||
+----------+----------+------+-----+---------+-------+
2rowsinset(0.02sec)
这时向表中插入中文然后有错误。
mysql>insertintousersvalues(88,'中文');
ERROR1366(HY000):Incorrectstringvalue:'\xD6\xD0\xCE\xC4'forcolumn'usern
ame'atrow1
mysql>insertintousersvalues(88,'中文');
ERROR1366(HY000):Incorrectstringvalue:'\xD6\xD0\xCE\xC4'forcolumn'usern
ame'atrow1
还要更改users表的username的字符集。
mysql>altertableusersmodifyusernamechar(20)charactersetgbk;
ERROR1366(HY000):Incorrectstringvalue:'\xC0\xEE\xCB\xC4'forcolumn'usern
ame'atrow1
mysql>altertableusersmodifyusernamechar(20)charactersetgbk;
ERROR1366(HY000):Incorrectstringvalue:'\xC0\xEE\xCB\xC4'forcolumn'usern
ame'atrow1
因为表中已经有数据,所以更改username字符集的操作没有成***
清空users表中的数据
mysql>truncatetableusers;
QueryOK,3rowsaffected(0.01sec)
从新更改user表中username的字符集
mysql>altertableusersmodifyusernamechar(20)charactersetgbk;
QueryOK,0rowsaffected(0.06sec)
Records:0Duplicates:0Warnings:0
这时再插入中文字符,插入成***。
mysql>insertintousersvalues(88,'中文');
QueryOK,1rowaffected(0.01sec)
mysql>select*fromusers;
+--------+----------+
|userid|username|
+--------+----------+
|88|中文|
+--------+----------+
1rowinset(0.00sec)
mysql>