语法格式:
Create database [if not exists] 数据库名
[default] character set 字符集
[default] collate 校对规则名;
说明:
Create database if not exists mytest
Default character set gb2312
Default collate gb2312_chinese_ci;
一般需要对一个数据库中的某一个数据表进行操作,此时需要指定该数据库为当前数据库才能进行后续操作。
语法格式:
Use 数据库名;
实例: 指定mytest数据库
输入:
Use mytest;
输出:
数据库创建后,如果需要修改数据库参数,可以使用alter database命令,其他格式与create database相同。
语法格式:
alter database [if not exists] 数据库名
[default] character set 字符集
[default] collate 校对规则名;
实例: 修改mytest数据库默认字符集和校对规则
输入:
Alter database mytest
Default character set gb2312
Default collate gb2312_chinese_ci;
语法格式:
Drop database [if exists] 数据库名;
说明:
实例: mytest数据库
Drop database if exists mytest;
Show databases;
语法格式:
Create table [if not exists] 表名
([列定义]…
[表索引定义])
[表选项][select语句];
说明:
实例: 在student数据库里面创建学生表xs
输入:
Create database student;
Use student;
create table xs
(学号 char(6) not null primary key,
姓名 char(8) not null,
专业名 char(10) null,
性别 tinyint(1) not null default 1,
出生日期 date not null,
总学分 tinyint(1) null,
照片 blob null,
备注 text null);
输出:
查看student数据库中的数据表和查看xs表信息
输入:
Show tables;
Describe xs;
即如果创建的表与已有的表相似,我们也可以直接复制数据库中已有的表结构和数据,然后对表进行修改。
语法格式:
Create table [if not exists] 表名
[like 已有表名]
[as (复制表记录)];
说明:
实例: 表格复制
先创建一个user表,并向表内添加表记录
输入:
create database mytest;
use mytest;
create table user(id int auto_increment not null primary key,username varchar(10) not null,password varchar(10) not null);
insert into user values(1,'Tom','19970504');
insert into user values(2,'Jack','19980606');
describe user;
select * from user;
输出:
创建两个表,一个表的结构取自user表,另一个表的结构和内容取自user表
输入:
create table user_copy1 like user;
create table user_copy2 as (select * from user);
describe user_copy1;
describe user_copy2;
select * from user_copy1;
select * from user_copy2;
语法格式:
Alter table 表名
Add 列定义[first|after 列名]
Modify 列定义
Alter 列名{set default值|drop default}
Chance 列名 原列名
Drop 列名
Rename [to] 新表名
说明:
(1)向表中增加新列
输入:
use mytest
alter table user add 班级号 tinyint(1) null;
alter table user add column 班级号(测试) tinyint(1) null;
describe user;
(column 可加可不加,结果都一样)
输出:
(2)通过first | after列名指定增加列的位置,在user表的id后增加gender列
输入:
alter table user add gender tinyint(1) not null after id;
describe user;
修改指定列的数据类型:把班级号的tinyint类型修改为bigint类型。
输入:
alter table user modify 班级号 bigint;
describe user;
在student数据库中的xs表,增加“奖学金等级”一列,并将表中“班级号”列删除;
输入:
Use student;
Alter table xs add 班级号 tinyint(1) null;
Describe xs;
Alter table xs
Add 奖学金等级 tinyint null,
Drop 班级号;
Describe xs;
两种命令可以完成更改表名操作
(1) rename table语法格式:
rename table 老表名 to 新表名
实例: mytest数据库中的user_copy1表重命名为user1,user_copy2表重命名为user2。
输入:
use mytest;
show tables;
rename table user_copy1 to user1,user_copy2 to user2;
show tables;
输出:
(2) alter table用法
实例: 将user2表重命名为userb
输入:
alter table user2 rename to userb;
show tables;
alter table userb rename userab;
show tables;
语法格式:
Drop table [if exsits] 表名
此命令会将表的描述、表的完整性约束、索引及表相关的权限等全部删除。
实例: 删除表userab
输入:
Drop table if exists userab;
Show tables;
创建数据表后,需要对表中的数据记录进行操作。
语法格式:
Insert [into] 表名
[(列名,…)] values ({expr|default},…)
|set 列名={ expr|default },…
说明:
实例: 向student数据库的表xs(表中列包括学号、姓名、专业名、性别、出生日期、总学分、照片、备注)中插入如下一行:
081101,张三,计算机,1,1995-06-06,50,null,null
首先查看表里的具体情况
输入:
Use student;
Describe xs;
Alter table xs
Drop 奖学金等级;
Describe xs;
输出:
接下来就是重点了,往xs表中添加上述记录(三种方法)
输入:
insert into xs values('081101','张三','计算机',1,'1995-06-06',50,null,null);
insert into xs (学号,姓名,专业名,性别,出生日期,总学分) values('081102','李四','软件工程',1,'1997-08-08',50);
输出:
又或输入:
insert into xs set 学号='081103',姓名='王五',专业名=default,性别=1,出生日期='1998-09-09',总学分=50;
输出:
可以看出三种方法都可以输入数据记录。
需要注意的是,如果原有行中存在PRIMARY KEY或UNIQUE KEY,而插入的数据行中含有与原有行中PRIMARY KEY或UNIQUE KEY相同的值,则INSERT语句无法插入此行。即主键值唯一,无法插入相同的值!
若输出后报错:
ERROR 1366 (HY000): Incorrect string value: ‘\xD5\xC5\xC8\xFD’ for column ‘姓名’ at row 1
原因数据库不支持中文字符,因此可以参考另外一篇博文
mysql永久支持中文字符解决办法(完整流程)
在解决之后如果仍然使用原来建立的数据库以上问题还会存在,因为在之前彻底解决了数据库支持中文字符的问题后,但由于原表是在解决之前建立的,因此表中的信息仍然不支持中文字符,我们可以查看该数据表的信息:
输入:
Show create table xs;
解决办法,删除该数据库,重新建立一个新的,此时的数据库就支持中文字符了!
输入:
Create database student;
Use student
create table xs
(学号 char(6) not null primary key,
姓名 char(8) not null,
专业名 char(10) null,
性别 tinyint(1) not null default 1,
出生日期 date not null,
总学分 tinyint(1) null,
照片 blob null,
备注 text null);
Show create table xs;
快速从一个或多个已有的表记录向表中插入多行。
语法格式:
Insert [into] 表名 [(列名,…)]
Select 语句
说明:
select语句返回的是一个查询到的结果集,insert语句将这个结果集插入到指定表中,但要求结果集中的每行数据的字段数、字段的数据类型要与被操作的表完全一致。
实例: 将mytest数据库user表记录插入到user1表中。
先查看mytest数据库中的两个表数据记录情况。
输入:
Use mytest;
Show tables;
Select * from user;
Select * from user1;
Insert into user1 select * from user;
输出:
因此需要删除两个属性“班级号”、“班级号(测试)”,刚好复习一下如何删除表中某一列属性。
输入:
Alter table user drop 班级号;
Alter table user drop 班级号(测试);
Alter table user drop gender;
输出:
(Mysql同时删除多列需要使用多个drop!)
此时再输入:
Insert into user1 select * from user;
MYSQL中插入图片一般用插入图片的存储路径大方式来操作,也可以直接插入图片本身(用load_file函数)。
实例: 向学生表中插入一行记录(包含图片)。
输入:
Use student;
mysql> insert into xs values('081104','程明','计算机',1,'1995-02-01',50,'C:\Users\ks\Desktop\中大校徽壁纸.jpg',null);
insert into xs values('081105','陈明','计算机',1,'1995-03-01',50,load_file('C:\Users\ks\Desktop\中大校徽壁纸.jpg') ,null);
输出:
但是一般不建议把图片存储在数据库中。
输出结果如图:
使用replace语句,可以在插入数据之前将与新记录冲突的旧记录删除,从而使新记录能够替换旧记录,正常插入,replace语句格式与insert语句相同。
实例: 在xs表中将张三的总学分修改为48分。
若使用insert语句,会报错(主键值唯一,不可以重复插入,要重新插入需要将冲突的记录删除)
使用replace语句,则可以成功插入
输入:
replace into xs
values('081101','张三','计算机',1,'1995-06-06',48,null,null);
语法格式:
Update [low_priority] [ignore] 表名
Set 列名 1 =expr1 [,列名2 = expr2…]
[where 条件]
注意:
若语句中不设定where语句(可以指定删除记录条件),则更新所有行。列名1、列名2…为要修改列,列值为expr。expr可以是常量、变量、列名或表达式。可以同时修改所在数据行的多个列值,中间用逗号隔开。
实例: 将student数据库中的xs表中的所有学生的总学分都增加10分,将姓名为“陈明”的同学的备注填写为“辅修计算机专业”,学号改为“081250”
先查看原表信息
输入:
use student
select * from xs;
update xs
set 总学分 = 总学分 + 10;
update xs
set 学号 = '081250',备注 = '辅修计算机专业'
where 姓名 = '陈明';
select 学号,姓名,总学分,备注 from xs;
语法格式:
Update 表名,表名…
Set 列名1=expr1 [,列名2=expr2…]
[where 条件]
实例: mytest数据库中的user表和user1表中均有两个字段id int(1)、password varchar(10),其中id为主键。当user表中的id值和user1表中id值相同时,将user中对应的password值修改为“11111111”,将user1中对应的password值修改为“22222222”。
查看user和user1表中的信息
输入:
use mytest
show tables;
select * from user;
select * from user1;
update user,user1
set user.password = '11111111',user1.password = '22222222'
where user.id = user1.id;
select * from user;
select * from user1;
Delete语句或truncate table语句都可以用于删除表中的一行或多行
从单个表中删除的语法格式:
Delete from 表名 [where 条件]
说明:
from 语句用于用于从何处删除数据,表名为要删除数据的表名。Where 语句指定删除记录的条件。如果省略则删除该表的所有行。
实例: 删除mytest数据库中user1表的“Jack”记录
输入:
delete from user1
where username = 'Jack';
语法格式:
Delete [low_priority] [quick] [ignore] 表名[.*][,表名[.*]…]
From table_references
[where where_definition]
或
Delete [low_priority] [quick] [ignore]
From表名[.*][,表名[.*]…]
Using table_references
[where where_definition]
说明:
对于第一种语法,只删除列于from子句之前的表中对应的行;对于第二种语法,只删除列于from子句之中(在using子句之前)的表中对应的行。作用是可以同时删除多个表中的行,并使用其他的表进行搜索。
实例: 删除mytest数据库中user中id值等于user1的id值的所有行和user2中id值等于user的id值的所有行(同时满足两个条件)。
由于mytest数据库中user2表之前被删除,这里直接复制user表建立user2表。
输入:
create table user2 as(select * from user);
select * from user2;
delete user1,user2
from user1,user2,user
where user1.id = user.id and user2.id = user.id;
select * from user1;
select * from user2;
先给出原表格信息:
满足user的id同时等于user1和user2的只有id为1(username为“Tom”),因此输出的结果应该是user1表为空表,user2表中删除了第一行(id =1)。
输出结果为:
使用truncate table语句将删除指定表中的所有数据且无法恢复,因此使用时必须谨慎!
语法格式:
Truncate table 表名
说明:
truncate 和 delete删除所有记录功能相同,但truncate比delete速度快,且使用系统和事务日志资源少。
(参考《mysql数据库教程》郑阿奇主编)