2022年MYSQL数据库操作简介 .pdf
MYSQL 数据库操作简介1.数据库操作1.1 create database语句要创建一个数据库只要在create database语句中给出其名称即可。如:create database db_name; 其中数据库的名字必须是合法的,该数据库必须存在,并且用户必须有足够的权限。1.2 drop database语句删除数据库需要用户有相应的权限。执行下列命令即可删除数据库:drop datdabase db_name; 注意:不要轻易使用drop database语句,它将删除数据库及其中所有的表。在删除了一个数据库后,该数据库不可恢复。1.3 use 语句use 语句用来打开一个数据库,使其成为服务器中的默认(当前 )数据库,例如: use db_name; 用户必须对数据库具有一定访问权限,否则不能使用该语句。为了使用数据库中的表而选择数据库实际上不是必须的,因为可以利用db_name.tbl_name形式来引用它的表。但是不指定数据库限定词,引用表要方便的多。选择一个默认数据库并不代表在连接的持续时间内它都必须是默认的。用户可随时使用 use 语句在数据库之间进行切换,只要具有使用它们的权限即可。选择一个数据库也不限定用户只使用该数据库中的表。用户仍然可以通过使用数据库名限定表名的方法,引用其它数据库中的表。2.添加和修改表2.1 create table语句用 create table语句创建表。此语句的完整语法是相当复杂的,因为存在相当多可选子句,但在实际中此语句的应用是相当简单的。使用 create table语句创建表时至少应该指出表名和表中字段的清单。例如:create table my_table (name char(20), age tinyint not null, weight int unsigned, sex enum( 男, 女) ) 在创建表时还可以说明它应该怎样索引,也可以不进行索引,以后再添加。如果计划在开始将表用于查询前,用大量的数据填充此表,再创建索引是一个很好的办法。在插入每一行时更新索引要比装载数据到一个未索引的表中然后再创建索引慢的多。2.2 create table if not exists语句(表不存在时创建) 若希望表不存在时才创建,可以使用create table if not exists语句。在一些应用程序中,无法确定要创建的表已经存在。if not exists在 MySQL 运行批量作业的脚本时极为有用。在这里,用普通的create table语句不是很好。因为作业在第一次运行时,建立这些表,如果这些表已经存在,则第二次运行时名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - 将出错。如果使用if not exists语句,就不会有问题。每一次运行作业时,像前面一样创建表,如果这些表已经存在,则在第二次运行时,创建表的操作失败,但是不会出错,这使得作业可以继续运行。2.3 create temporary table语句(创建临时表 ) 要想创建一个临时表,可以利用create temporary table语句,这些表会在会话结束时自动消失。使用临时表很方便,因为不必使用drop table语句来删除表,而且如果用户的会话没有正常结束,这些表也不会滞留。2.4 drop table语句(删除表 ) 相对来说 ,删除表要比创建表容易得多,因为删除表不用定制有关其内容的任何东西,只要指定其名称即可,例如:drop table tbl_name; MySQL 对 drop table语句作了一些扩充. 首先,可以在同一条语句中指定多个表进行删除,例如:drop table tbl_name1,tbl_name2,. 其次,如果不能确定一个表是否存在,但是希望如果它存在就删除。那么就可以在 drop table语句中增加if exists 限定条件,如果drop table语句中给出的表不存在, MySQL 不会发出错误信息。例如:drop table if exists tbl_name; if exists 在 MySQL 所用的脚本中很有用,因为在默认的情况下,MySQL 将在出错的时候退出。比如说,有一个安装脚本能创建表,这些表将在其它脚本中继续使用。在这种情况下希望保证这个创建表的脚本在运行时没有后顾之忧。如果脚本在开始时使用普通的drop table语句,那么它在第一次运行时将会失败,因为这些表从未创建过。如果使用if exists 限定,就不会产生这样的问题。当表已经存在时,将它们删除,否则,脚本继续运行。3.创建和删除索引3.1 创建索引在执行 create table语句时。可以为新表创建索引,也可以用create index或者alter table来为一个己有的表增加索引。create index是在 MySQL3.23 版本中引入的,但是如果使用MySQL3.23 之前的版本,可以利用alter table语句创建索引。用户可以规定索引能否包含重复的值。如果不包含,则索引应该创建为primary key 或 uniuqe 索引。对于单字段唯一索引,这样保证了字段不包含重复的值。对于多字段惟一索引,这样保证了值的组合不重复。primary key索引和 uniuqe 索引非常类似。实际上,primary key索引仅是一个具有名称的主键的惟一索引。这表示一个表只包含一个主键,因为一个表中不可能具有两个同名的索引。同一个表中可以有多个惟一索引。为了给现有的表增加一个索引,可以使用alter table或 create index语句。前者是最常用的,因为它可以创建普通索引、惟一索引或主键索引,例如:alter table tbl_name add index index_name(column_list) alter table tbl_name add uniuqe index_name(column_list) alter table tbl_name add primary key index_name(column_list) 其中 tbl_name 是要添加索引的表名,而 column_list指出对那些字段进行索引。如果索引由不止一个字段组成,各字段名之间用逗号分开。索引名index_name 是可选的,可以不给出,MySQL 将根据第一个索引字段赋给它一个名称。alter 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - table 语句允许在单个语句中指定多个表的更改,因此可以同时创建多个索引。create index语句可以对表增加普通索引或惟一索引,例如:create unique index index_name on tbl_name (column_list) create index index_name on tbl_name (column_list) tbl_name 、index_name和 column_list具有与 alter table语句中相同的含义。这里索引名不可选。不能用create index语句创建主键索引。3.2 删除索引用户可以利用drop index或 alter index语句来删除索引。类似于create index 语句, drop index语句通常在内部作为一条alter table语句来处理,并且drop index 语句是在MySQL3.23 中引入的,删除索引语句的语法描述如下:drop index index_name on tbl_name alter table tbl_name drop index index_name alter table tbl_name drop primary key 前两条语句是等价的,第三条语句只在删除primary key索引时用,在这种情况下不需要索引名,因为一个表只可能具有一个这样的索引。如果在创建索引时没有明确指明为primary key索引,则该表具有一个或多个惟一索引,MySQL 将删除这些索引中的第一个。如果从表中删除了字段,则索引可能会受到影响。如果所删除的字段为索引的组成部分,则该字段也会从索引中被删除。如果组成索引的所有字段都被删除,则整个索引将被删除。4.更改表4.1 对表重命名对表重新命名,可以使用alter table语句,只要给出旧表名和新表名就可以了,例如:alter table tbl_name rename as new_tbl_name 4.2 更改字段类型和字段名称更改字段类型,可以使用change 或 modify 语句。假如表my_table中的某字段为smallint unsigned类型,希望将其更改为mediumint unsigned类型。可使用下面的语句:alter table my_tbl modify i mediumint unsigned alter table my_tbl change i mediumint unsigned change 命令除了能更改类型之外,还能更改字段的名称。ALTER TABLE t_name CHANGE old_cols_name new_cols_name (create_definition列的条件(必须与原来的条件相符) 例如;ALTER TABLE chat_admin CHANGE ad_name ad_names VARCHAR(15) NOT NULL 4.3 将可变长字段转换为定长字段假如表 chartbl 具有 varchar 类型的字段 ,要将其转换为char 类型。而且这个表创建语句如下 : create table chartbl(name varchar(40), address varchar(80) ) 在这个表中,需要在相同的alter table语句中一次更改所有的字段。不可能一次一个字段地改完,原因是如果每次更改一个字段,MySQL 注意到表仍然包含有可变长的字段,则会把已经更改过的字段重新转换为varchar 类型以节省空间。为了处理这个问题。应该同时更改所有的varchar 类型的字段,语句如下: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - alter table chartbl modify name char(40), modify address char(80) 现在该表中的字段都被改为char 类型了。此类操作很重要,本例也是alter table 语句中同时进行多个动作的有力见证。注意,在希望转换这样的表时,如果表中存在blob 或 text 类型的字段,将使转换表为定长行格式的操作失败。即使表中有一个可变长的字段都将会使表有可变长的行,因为这些可变长的字段类型没有定长的等价类型。4.4 将定长字段转换为可变长字段在上面的例子中,虽然chartbl 用定长字段会使操作速度更快,但占有了更多的空间,因此将它转换为原来的形式可以节省空间。这种转换更容易,只需要将某个 char 类型的字段转换为varchar 类型的字段,MySQL 会自动的转换其它的char类型字段。要想转换chartbl 表,可以用下列任一条语句:alter table chartbl modify name varchar(40) alter table chartbl modify address varchar(80) 4.5 转换表的类型如果需要将旧版本的ISAM 表转换为 MyISAM 格式,可以执行如下操作:alber table tbl_name type=myisam 这样做是因为MyISAM 存储格式具有某些ISAM 格式没有的索引特性,例如能够对NULL 值、 blob 和 text 类型的字段类型进行索引。另一个原因是,MyISAM 是独立于计算机的,可以将此类表直接复制到其它类型的计算机系统中,即使其具有不同的硬件体系结构。SQL SELECT 语句SQL SELECT 语句以被选中的行的集合的形式从数据库中返回信息。SELECT语句被分成以下 3 个主要部分: .SELECT SELECT列表允许指定查询将要返回的列。 .FROM FROM 子句允许指定从哪些表中选取在SELECT列表中指定的列。 .WHERE 可选的 WHERE 子句允许指定过滤标准来限制对行的选择。可以基于多个列来过滤查询。一个最小的SELECT语句的语法形式为:SELECT columns FROM tables 要执行该操作,数据库引擎将在指定的表中搜索并且提取出选择的列。可以使用一个星号 (*) 来选择一个表中所有的列。例如,下面的SQL语句将返回authors 表中所有的列与行:SELECT * FROM authors 从一个表中返回所有数据可能不够高效。通过在语句的末尾加一个WHERE 子句,可以指定只返回符合某个条件的一些行。下面的例子将返回authors 表中姓为Ringer 的行的所有列:SELECT * FROM authors WHERE au_lname=Ringer 注意例中括起Ringer 的单引号 () 的用法。单引号用于当WHERE 子句中的值是一个字符串的时候。在本例中,au_lname 被数据库定义为一个字符串值。当在WHERE 子句中指定一个数值型值,就不使用单引号了,如下例所示:SELECT * FROM titles WHERE royalty=10 IN 操作符名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 通过在一个WHERE 子句中使用IN 操作符,可以只返回一些特定的行,在这些行中, WHERE 子句所指定的参数的值被包含在一个指定的列表中。例如,可以使用 IN 操作符来返回住在Utah(UT) 或 Tennessee(TN) 的作者的姓和状态编码,如下例所示:SELECT au_lname,state FROM authors WHERE state IN(UT,TN) BETWEEN 操作符这个操作符返回一些被选中的行,在这些行中,WHERE 参数在两个给定的条件之间。注意日期用yyyymmdd 字符串格式来指定的。如下例所示: SELECT * FROM titles WHERE pubdate BETWEEN 20080808 AND 20090630 LIKE 操作符可以用 LIKE 操作符找到一个符合的匹配模式的列的值。你可以指定完整的值,如在 LIKE Smith 中,或者使用通配符来查找一个范围内的值(例如 ,LIKE Sm%) 。在下面的例子中,所有姓以字母S 开头的作者的行都被返回了,样例如下:SELECT au_lname FROM authors WHERE au_lname LIKE S% ORDER BY 子句默认情况下,返回的行的顺序是和它们进入数据库时的顺序是一样的。可选的ORDER BY 子句将对一个查询的结果在一个或一组指定的列上进行升序或降序排列。 ASC 选项指定了按升序排列;DESC 选项指定按降序排列。默认的排序顺序是升序 (AZ, 从 09) 。下面的例子从authors 表中选择了所有的列,并且将它们按作者的姓进行了降序排列。SELECT * FROM authors ORDER BY au_lname DESC 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -