0
点赞
收藏
分享

微信扫一扫

MySQL中库/表/字段/索引/主键操作示例与详解

MySQL数据库基础入门与常见操作

下面关于字符的设置中 : charset 等效于 character set 。

【1】创建数据库和创建表

① 创建数据库

create database `database` charset utf8;

//注意这里数据库名-database使用了反引号 `` ;
//如果不使用反引号,那么能使用关键字或者保留字。

//创建中文数据库;
set names gbk;
create database 中国 charset utf8;

//utf8字符集,校对集依赖字符集。

//修改数据库字符集:
alter database database_name charset GBK;

② 创建表

MySQL中库/表/字段/索引/主键操作示例与详解_表操作

创建成功后,在数据库对应的文件夹下,会产生对应表的结构文件(扩展名为​​.frm​​,跟存储引擎有关系)。

create table t_user(
id int(10) PRIMARY KEY NOT NULL UNSIGNED AUTO_INCREMENT ,
//主键,不为空,无符号,自动递增
name VARCHAR(20) NOT NULL DEFAULT '',//默认为''
age int(2) NOT NULL,
dept_id int,
CONSTRAINT `dept_id` FOREIGN KEY (`dept_id`) REFERENCES `department` (`department_id`)
ON DELETE CASCADE ON UPDATE CASCADE;
--添加外键约束,外键名为‘dept_id’(可改,如deptId);
--外键列(dept_id)对应表department的列department_id;
--级联删除和更新
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
//设置存储引擎与表字符集和校对集

MySQL不支持检查约束,添加 check不起作用!

① 使用子查询创建表

使用​​AS subquery​​ 选项,将创建表和插入数据结合起来。指定的列和子查询中的列要一一对应,通过列名和默认值定义列。

CREATE TABLE table
[(column, column...)]
AS subquery;

如:
CREATE TABLE dept80 AS SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
FROM employees WHERE department_id = 80;

② 使用like创建表

#根据表employees创建employees2

CREATE TABLE employees2 LIKE myemployees.employees;

③ 数据库其他操作

show databases;查看当前所有数据库
use employees;
# “使用”一个数据库,使其作为当前数据库

命名规则

  • 数据库名不得超过30个字符,变量名限制为29个
  • 必须只能包含A–Z, a–z, 0–9, _共63个字符
  • 不能在对象名的字符间留空格
  • 必须不能和用户定义的其他对象重名
  • 必须保证你的字段没有和保留字、数据库系统或常用方法冲突
  • 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了

④ 常见数据类型

① 数值型

类型

说明

INT

使用4个字节保存整数数据

CHAR(size)

定长字符数据。若未指定,默认为1个字符,最大长度255

VARCHAR(size)

可变长字符数据,根据字符串实际长度保存,必须指定长度

FLOAT(M,D)

单精度,M=整数位+小数位,D=小数位。D<=M<=255,0<=D<=30,默认M+D<=6

DOUBLE(M,D)

双精度。D<=M<=255,0<=D<=30,默认M+D<=15

DATE

日期型数据,格式’YYYY-MM-DD’

BLOB

二进制形式的长文本数据,最大可达4G

TEXT

长文本数据,最大可达4G

② 常见数据类型值范围

类型

字节

范围

tinyint

1

有符号:-128~127 无符号:0-255

smallint

2

有符号:-32768-32767 无符号:0-65535

mediumint

3

有符号:-8388608~8388607 无符号:0~1677215

int

4

有符号:-2147483648~2147483647 无符号:0~4294967295

bigint

8

有符号:-9223372036854775808~9223372036854775807

无符号:0~9223372036854775807*2+1

float

4

±1.75494351E-38~±3.402823466E+38

double

8

±2.2250738585072014E-308~±1.7976931348623157E+308

DECIMAL(M,D)

M+2

最大取值范围与double相同,给定decimal的有效取值范围由M和D决定

位类型Bit(M)

1-8

Bit(1)~bit(8)

DECIMAL(M,D)是定点整数型。M:整数部位+小数部位 , D:小数部位,如果超过范围,则插入临界值。M和D都可以省略,如果是decimal,则M默认为10,D默认为0。如果是float和double,则会根据插入的数值的精度来决定精度。

定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用。那么设计数据库表字段类型时,选择类型的基本原则是什么呢?​​所选择的类型越简单越好,能保存数值的类型越小越好​​。

③ 字符类型

类型

最多字符数

范围

char

M

0-255之间的整数

varchar

M

M为0~65535之间的整数

④ binary和varbinary类型

说明:类似于char和varchar,不同的是它们包含二进制字符串而不包含非二进制字符串。

⑤ Enum类型

说明:又称为枚举类型哦,要求插入的值必须属于列表中指定的值之一。

  • 如果列表成员为1~255,则需要1个字节存储
  • 如果列表成员为255~65535,则需要2个字节存储
  • 最多65535个成员!

⑥ Set类型

和Enum类型类似,里面可以保存0~64个成员。和Enum类型最大的区别是:SET类型一次可以选取多个成员,而Enum只能选一个。根据成员个数不同,存储所占的字节也不同。

成员数

字节数

1~81

1

9~162

2

17~243

3

25~324

4

33~648

8

⑦ 日期和时间类型

类型

字节

最小值

最大值

date

4

1000-01-01

9999-12-31

datetime

8

1000-01-0100:00:00

9999-12-3123:59:59

timestamp

4

19700101080001

2038年的某个时刻

time

3

-838:59:59

838:59:59

year

1

1901

2155

⑧ timestamp与datetime区别

  • timestamp支持的时间范围较小,取值范围:19700101080001——2038年的某个时间。datetime的取值范围:1000-1-1 ——9999-12-31
  • timestamp和实际时区有关,更能反映实际的日期,而datetime则只能反映出插入时的当地时区
  • timestamp的属性受MySQL版本和SQLMode的影响很大

列类型

显示格式

TIMESTAMP(14)

YYYYMMDDHHMMSS

TIMESTAMP(12)

YYMMDDHHMMSS

TIMESTAMP(10)

YYMMDDHHMM

TIMESTAMP(8)

YYYYMMDD

TIMESTAMP(6)

YYMMDD

TIMESTAMP(4)

YYMM

TIMESTAMP(2)

YY

所有的TIMESTAMP列都有同样的存储大小,使用被指定的时期时间值的完整精度(14位)存储合法的值不考虑显示尺寸。不合法的日期,将会被强制为0存储。

1.虽然你建表时定义了列TIMESTAMP(8),但在你进行数据插入与更新时TIMESTAMP列实际上保存了14位的数据(包括年月日时分秒),只不过在你进行查询时MySQL返回给你的是8位的年月日数据。如果你使用ALTER TABLE拓宽一个狭窄的TIMESTAMP列,以前被“隐蔽”的信息将被显示。
2.同样,缩小一个TIMESTAMP列不会导致信息失去,除了感觉上值在显示时,较少的信息被显示出。
3.尽管TIMESTAMP值被存储为完整精度,直接操作存储值的唯一函数是UNIX_TIMESTAMP();由于MySQL返回TIMESTAMP列的列值是经过格式化后的检索的值,这意味着你可能不能使用某些函数来操作TIMESTAMP列(例如HOUR()或SECOND()),除非TIMESTAMP值的相关部分被包含在格式化的值中。
例如,一个TIMESTAMP列只有被定义为TIMESTAMP(10)以上时,TIMESTAMP列的HH部分才会被显示,因此在更短的TIMESTAMP值上使用HOUR()会产生一个不可预知的结果。
4.不合法TIMESTAMP值被变换到适当类型的“零”值(00000000000000)。(DATETIME,DATE亦然)

⑤ 改变对象的名称

执行RENAME语句改变表, 视图的名称,必须是对象的拥有者。

ALTER table dept RENAME TO detail_dept;

⑥ sql92与sql99语法

sql92标准,仅仅支持内连接。

sql99标准,支持内连接+外连接(左外和右外)+交叉连接。sql99实现连接条件和筛选条件的分离,可读性较高

【2】修改表选项

① 修改字符集、校对集和存储引擎、自增长

alter table table_name 表选项;

alter table p_user charset=utf8,ENGINE=MYISAM,COLLATE=utf8_general_ci;

--修改自增长

alter table table_name auto_increment =;

修改表字符集表示表存储数据的时候使用该字符集。如utf8,表明使用三个字节存储一个汉字;gbk,表明使用两个字节存储一个汉字。

使用ALTER TABLE 语句可以实现:

  • 向已有的表中添加列
  • 修改现有表中的列
  • 删除现有表中的列
  • 重命名现有表中的列

② 重命名表

关键字:rename

rename table emp to emp2

【3】表索引-index

关键字为index;不能添加constraint关键字

-- 添加索引,指定名字为index_name;

alter TABLE p_user_2 add index index_name(name);

-- 删除索引,如果没有指定名字,默认使用列名

alter TABLE p_user_2 drop index index_name

查看表创建语句

CREATE TABLE `p_user_2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL COMMENT '名字',
`age` int(4) DEFAULT NULL,
`sex` varchar(10) DEFAULT NULL,
`p_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_p_id` (`p_id`) USING BTREE,
KEY `index_name` (`name`),-- 这里对应普通index
CONSTRAINT `fk_id` FOREIGN KEY (`p_id`) REFERENCES `p_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8

为表添加属性约束语法

语法格式如下:

alter table [table_name] add 
[constraint] [constraint_name]
[unique| primary key|foreign key] ([column_name])

【4】表主键操作primary

① 创建表的时候在字段后面使用 primary key关键字

create table my_default(
id int PRIMARY KEY,--使用关键字
name VARCHAR(20) not null unique key ,
gender varchar(4) DEFAULT '男'
)charset utf8;

② 在创建表的时候,在所有的字段之后使用 primary key(主键的字段 列表)来创建主键(如果有多个字段作为主键,称之为复合主键)

create table my_pri(
number char(10),
course char(10),
score TINYINT,
PRIMARY KEY(number,course)--复合主键
)charset utf8;

desc my_pri;

MySQL中库/表/字段/索引/主键操作示例与详解_主键_02

测试如下:

insert into my_pri VALUES('001','IT','10');--插入成功
insert into my_pri VALUES('001','IT','10');--插入失败

insert into my_pri VALUES('001','IT2','10');--插入成功

MySQL中库/表/字段/索引/主键操作示例与详解_表操作_03

③ 创建表之后,为表追加主键

有两种方式,​​第一修改表字段属性;第二直接追加​​。

第一种方式示例如下:

alter TABLE my_pri MODIFY number char(11) PRIMARY KEY;

第二种方式示例如下:

--增加单一主键
alter table table_name add primary key(column) ;

alter TABLE my_pri add PRIMARY KEY(number,course);
--增加复合主键

alter table my_pri add CONSTRAINT pk_score PRIMARY KEY(score)
--使用关键字CONSTRAINT 且指定主键名字pk_score

alter table my_pri add CONSTRAINT PRIMARY KEY(score)
--使用关键字CONSTRAINT 且使用默认名字

④ 删除主键

alter table my_pri drop PRIMARY KEY;

--不能根据主键名字删除主键

【5】唯一约束UNIQUE

唯一约束就是唯一索引,其是一个索引。

① 增加单一约束

alter TABLE my_pri add CONSTRAINT nuc UNIQUE KEY(number);

--使用指定名字 nuc

alter TABLE my_pri add CONSTRAINT UNIQUE KEY(course);

--使用默认名字

alter TABLE my_pri add UNIQUE KEY(score);

--不使用CONSTRAINT 关键字

查看增加约束后的表结构

show create TABLE my_pri;

CREATE TABLE `my_pri` (
`number` char(11) NOT NULL,
`course` char(10) NOT NULL DEFAULT '',
`score` tinyint(4) DEFAULT NULL,
UNIQUE KEY `nuc` (`number`),
UNIQUE KEY `course` (`course`),
UNIQUE KEY `score` (`score`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

MySQL中库/表/字段/索引/主键操作示例与详解_mysql_04

② 增加复合约束

create table my_pri(
number char(10),
course char(10),
score TINYINT,
PRIMARY KEY(number,course)
)charset utf8;

alter TABLE my_pri add UNIQUE KEY(number,course);
--添加复合unique key,使用默认名字为第一个列名-number

alter TABLE my_pri add CONSTRAINT nuc UNIQUE KEY(number,course);
--添加复合唯一约束,自定义名字 nuc

查看创建唯一约束后表结构

show create TABLE my_pri;

--第一次
CREATE TABLE `my_pri` (
`number` char(11) NOT NULL,
`course` char(10) NOT NULL DEFAULT '',
`score` tinyint(4) DEFAULT NULL,
UNIQUE KEY `number` (`number`,`course`)--unique key 名字为 number
) ENGINE=InnoDB DEFAULT CHARSET=utf8

--第二次
CREATE TABLE `my_pri` (
`number` char(11) NOT NULL,
`course` char(10) NOT NULL DEFAULT '',
`score` tinyint(4) DEFAULT NULL,
UNIQUE KEY `nuc` (`number`,`course`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

删除复合UNIQUE KEY number

alter table my_pri drop index number;

删除复合UNIQUE KEY nuc

alter table my_pri drop index nuc;

③ 删除属性约束同时增加一列

alter table my_default 
drop index name,--删除unique key name
add column id int first --增加id列位置为第一列

注意,普通索引和唯一索引删除的时候使用的关键字为index,主键和外键则使用对应关键字。

【6】修改表

① add增加列

alter table tb_sys_login_log 
add column remote_ip //列名
varchar(30) //字段类型
default null //默认值
comment '后台获取真实ip' //注释
after ip;//位置

ALTER TABLE t_user
add COLUMN `born_date_time`
datetime first(添加该列为第一列)

② MODIFY 修改列

数字类型的如下所示

ALTER TABLE 库名.表名 
MODIFY COLUMN id #列名
bigint(20) # 字段类型
UNSIGNED #无符号
auto_increment # 自增
NOT null # 非空
primary key # 主键
COMMENT '设置主键'; #注释
AFTER update_op_id;# 位置

字符类型的如下所示

ALTER TABLE 库名.表名 
MODIFY COLUMN id #列名
varchar(20) # 字段类型
CHARACTER SET utf8 # 字符集
COLLATE utf8_bin # 排列规则
NOT null # 非空
COMMENT '设置注释'; #注释
AFTER update_op_id;# 位置

change关键字重命名列

ALTER TABLE p_user 
CHANGE COLUMN `NAME` `name`
varchar(20)(带上数据类型)
character set utf8
[位置:first];

-- 可以在改变列的时候同时改变其列位置
ALTER TABLE p_user
CHANGE
state
int(1)
DEFAULT 0
COMMENT '状态 0 申请;1 申请中;2 已审核;3 审核驳回'
AFTER STATE;

modify只能改字段数据类型完整约束,不能改字段名,但是change可以。

③ drop删除列

ALTER TABLE t_use drop COLUMN `born_date_time1`

④ 查看表结构:

desc/describle t_user;

or

show columns from t_user;

⑤ 查看表创建语句:

show create table table_name;

【7】数据操作

① 插入数据

​给全表字段插入数据,不需要指定字段列表,但是插入数据值顺序与字段顺序一致​​。且非数值型数据需用引号包括(建议单引号),字符和日期型数据应包含在单引号中。

insert into table_name values(值列表)[,(值列表)];
--可一次性插入多条记录;

insert into p_user
values
(1,'tom','B001'),
(2,'Janus','B002')

​给部分字段插入数据,需选定字段列表​​。字段列表出现的顺序与字段的顺序无关。但是值列表的顺序必须与选定的字段列表顺序一致。

insert into table_name (字段列表) values(值列表)[,(值列表)];
--可一次性插入多条数据。

insert INTO p_user (name,age,sex)
VALUES
('tom',12,'male'),('lily',15,'female')

向表中插入空值

隐式方式: 在列名表中省略该列的值

INSERT INTO departments (department_id, department_name [这里少两列])
VALUES(30, 'Purchasing');

显示方式: 在VALUES子句中指定空值

INSERT INTO departments VALUES(100, 'Finance', NULL, NULL);

从其它表中拷贝数据

在INSERT 语句中加入子查询

INSERT INTO emp2
SELECT *
FROM employees
WHERE department_id = 90;

INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%';

不必书写VALUES 子句,子查询中的值列表应与INSERT 子句中的列名对应。

特点:
① 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
② 如果插入的数值超出了整型的范围,会报out of range异常,并且插入临界值
③ 如果不设置长度,会有默认的长度

长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用!

② 字段默认值

如果字段设计的时候赋予了默认值,要想默认值起作用,有如下两种方式(假设这里age字段默认值为18;):

① 插入时跳过使用默认值的字段

insert INTO p_user (name,sex) VALUES ('tom','male');

② 为该字段赋予值-default

insert INTO p_user (name,age,sex) VALUES ('tom',default,'male');

以上两种方式都能成功插入​​('tom',18,'male')​​。

主键为ID-自增长时,插入时为该字段赋予值-null

insert INTO c_user VALUES (null,'male',18);

注意:该情况适用于id为 主键自增长的情况

③ 更新数据

修改单表的记录

语法:

update 表名
set=新值,=新值,...
where 筛选条件;

修改多表的记录

sql92语法:

update 表1 别名,表2 别名
set=,...
where 连接条件
and 筛选条件;

sql99语法:

update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set=,...
where 筛选条件;

如果需要回滚数据,需要保证在DML前,进行设置:SET AUTOCOMMIT = FALSE;

限制更新记录总数

update table_name set [field] = [value] [where 条件] [limit Num];

e.g:

update p_user_2 set age = 19 LIMIT 6;

-- 将前六名同学age统一改为19

多表修改实例:

UPDATE boys bo
RIGHT JOIN beauty b ON bo.`id`=b.`boyfriend_id`
SET b.`boyfriend_id`=2
WHERE bo.`id` IS NULL;

④ 删除数据

单表的删除

delete from 表名 where 筛选条件

多表的删除

sql92语法:

delete 表1的别名,表2的别名
from 表1 别名,表2 别名
where 连接条件
and 筛选条件;

sql99语法:

delete 表1的别名,表2的别名
from 表1 别名
inner|left|right join 表2 别名 on 连接条件
where 筛选条件;

DELETE b
FROM beauty b
INNER JOIN boys bo ON b.`boyfriend_id` = bo.`id`
WHERE bo.`boyName`='张无忌';

限制删除记录总数

delete from table_name [where 条件] [limit Num];

e.g:

delete from p_user_2  LIMIT 6;

-- 将前六名同学删除

join on级联删除多表数据

DELETE u,e
FROM users u
JOIN my_employees e ON u.`userid`=e.`Userid`
WHERE u.`userid`='Bbiri';

truncate table 清空表

语法:

truncate table 表名;

TRUNCATE TABLE boys ;

delete与truncate区别

  • delete 可以加where 条件,truncate不能加
  • truncate删除,效率高一点
  • 假如要删除的表中有自增长列,如果用delete删除后,再插入数据,自增长列的值从断点开始。而truncate删除后,再插入数据,自增长列的值从1开始。
  • truncate删除没有返回值,delete删除有返回值
  • truncate删除不能回滚,delete删除可以回滚.

【8】删除/清空表

① 删除表

  • 数据和结构都被删除
  • 所有正在运行的相关事务被提交
  • 所有相关索引被删除
  • DROP TABLE 语句不能回滚

语法格式:

drop table 表名1,表名2

e.g:drop table t_user

其他删除用法如下:

DROP PROCEDURE procName ;-- 删除存储过程

drop table table_name;-- 删除表

drop view view_name; -- 删除视图

drop database name;-- 删除数据库

drop function name;-- 删除函数

drop trigger name;-- 删除触发器

② 清空表

​TRUNCATE TABLE​​语句:

  • 删除表中所有的数据
  • 释放表的存储空间

TRUNCATE语句不能回滚,可以使用DELETE 语句删除数据,可以回滚。


举报

相关推荐

0 条评论