MYSQL高效基础学习系列1
目录
数据库基本概念
1.数据库服务器:运行数据库管理软件的计算机
2.数据库管理软件:mysql,oracle,db2,slqserver
3.库:文件夹
4.表:文件
5.记录:事物一系列典型的特征,如egon,male,18等
6.数据:描述事物特征的符号
关系型数据库需要有表结构
非关系型数据库是key-value存储的,没有表结构
操作库,表和记录
操作文件夹(库)
**增**
create database db1 charset utf8; #命名规则:唯一性 不能使用关键字如create select 不能使用纯数字 最长128位
**查**
show creat database db1;
show databases;
**改**
alter database db1 charset gbk;
**删**
drop database db1;
操作文件(表)
切换文件夹:use db1
查看当前所在文件夹:select databse();
1.存储引擎就是表的类型
2.查看MYsql支持的存储引擎用show engines;
3.指定表类型/存储引擎
create table t1(id int)engine=innodb;
create table t2(id int)engine=memory; 重启一下mysql 就没了
create table t3(id int)engine=blackhole;
create table t4(id int)engine=myisam;
**增**
create table1(id int, name char); frm格式文件就是表结构 ibd格式就是表内的数据
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件],
);
**查**
show create table t1;
show tables;
desc t1;
**改**
alter table t1 modify name char(6);
alter table t1 change name NAME char(7);
1修改表名
alter table 表名 rename 新表名
2.增加字段
alter table 表名 add 字段名 数据类型 [完整性约束条件],add 字段名 数据类型 [完整性约束条件];
alter table 表名 add 字段名 数据类型 [完整性约束条件] first;
alter table 表名 add 字段名 数据类型 [完整性约束条件] after 字段名;
3.删除字段
alter table 表名 drop 字段名
4.修改字段
alter table 表名 modify 字段名 数据类型 [完整性约束条件];
alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件];
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件];
**删**
drop table t1;
复制表
create table t1 select 字段名 from mysql.user;
只复制表结构
create table t1 select 字段名 from mysql.user where 1>5;
create table t1 like mysql.user;
操作文件内容(记录)
**增**
insert t1(id,name) values(1,'owen1'),(2,'owen2'),(3,'owen3');
insert t1 values(1,'owen1'),(2,'owen2'),(3,'owen3');
insert t1(字段1,字段2) select (字段1,字段2) from t2
**查**
select id,name from db1.t1;
select * from db1.t1;
**改**
update db1.t1 set name='SB';
update db1.t1 set name='ALEX' where id=2;
**删**
delete from t1; #最好用 truncate t1;
delete from t1 where id=2;
语句按功能分为:
1.DDL语句 数据库定义语言:数据库、表、视图、索引、存储过程、 例如create drop alter
2.DML语句 数据库操纵语言:插入数据insert、删除数据delete、更新数据update、查询数据select
3.DCL语句 数据库控制语言:例如控制用户的访问权限grant、remoke
数据类型
整数类型
日期类型
DATE TIME DATATIME TIMESTAMP YEAR五种日期类型
检验代码:
mysql> create table student(
-> id int,
-> name char(6),
-> born_year year,
-> birth_date date,
-> class_time time,
-> reg_time datetime
-> );
mysql> insert into student values
-> (1,'egon',now(),now(),now(),now());
\c终止运行
mysql> insert into t1 values('dd);
'> \c
'> '\c 缺少的引号要补齐方可终止
字符类型
char :定长的字符 存取速度快 但浪费空间(常用)
varchar:变长的字符 节省空间 但存取速度慢
#宽度指的是字符的个数
create table t13(name char(5)); #定长:不够5个字符则补全
create table t14(name varchar(5)); #变长:传几个就存几个
insert into t13 values('李杰 '); #‘李杰 ’
insert into t14 values('李杰 '); #‘李杰 ’
select name from t13;
select char_length(name) from t13;#2把末尾的空格全部去掉
select char_length(name) from t14;#3
select name from t13 where name='李杰 ';#不管末尾的空格 所以可以查到
select name from t13 where name like '李杰 '; #考虑空格
name char(5)
owen |alex |wxx |
name varchar(5)
1bytes+egon|1bytes+owen
4+egon|4+owen
存储文件尽量精简! 定长的数据往前放
枚举类型与集合类型
字段的值只能在给定范围中选择,如单选框,多选框
enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女famale
set 多选 在给定范围内可以选一个或多个以上的值 如爱好
为字段指定的约束条件
约束条件not null与default
create table consumer(
id int,
name char(16),
sex enum('male','famale'),
hobbies set('play','music','read','run')
);
insert into consumer values
(1,'owen','male','vip2','music,run');
#不在选项范围中的传入 要么报错要么传入为空
约束条件unique key
mysql> create table ii(
-> id int unique,
-> name char(10) unique
-> );
mysql> insert into ii values
-> (1,‘IT’),
-> (2,‘IT’);
ERROR 1062 (23000): Duplicate entry ‘IT’ for key ‘name’
create table t15(
id int(11) unsigned zerofill
);
desc t15;
NULL:是否允许传入空值
default:默认值设为什么
create table t16(
id int,
name char(6),
sex enum('male','famale') not null default 'male'
);
insert into t16(id,name) values(1,'owen');
#key:唯一的主键UNI
unique key
create table department(
id int,
name char(10)
);
insert into department values
(1,'IT'),
(2,'IT');
#方式一:
create table ii(
id int unique,
name char(10) unique
);
insert into ii values
(1,'IT'),
(2,'IT');
#方式二:
```javascript
create table ii(
id int,
name char(10),
unique(id),
unique(name)
);
insert into ii values
(1,'IT'),
(2,'IT');
#联合唯一
create table services(
id int ,
ip char(15),
port int,
unique(id),#单列唯一UNI
unique(ip,port) #联合唯一MUL
);
insert into services values
(1,'192.168.11.10',80),
(2,'192.168.11.10',81),
(3,'192.168.11.10',80);#联合唯一不符合 出错
primary key主键
约束:not null unique 不为空且唯一
存储引擎(innodb):对于innodb存储引擎来说,一张表内必须有一个主键
#单列主键
create table t27(
id int primary key, #一般id字段设置为主键
name char(16)
);
insert into t27 values
(1,'owen'),
(2,'dd');
insert into t27 values
(2,'sdkf');#主键重复 将出错
insert into t27 values
('sdkf');#id为0
#复合主键
create table t27(
ip char(15) ,
name char(16),
primary key(ip,port)
);
insert into t27 values
('dddd','sdds'),
('dddd','sdds');#将出错
auto_increment自动增长约束
create table t20(
id int primary key auto_increment,
name char(15)
);
insert into t20(name) values
('owne'),
('dsf'),
('dfds');
insert into t20(id,name) values
(7,'ddfd');#可以指定id字段
insert into t20(name) values
('owne'),
('dsf'),
('dfds'); #从末尾的id开始增长
#了解
show variables like ‘auto_inc%’;#%代表任意个数的任意字符
auto_increment_increment #步长 默认为1
auto_increment_offset #起始偏移量 默认1
#设置步长
set session auto_increment_increment=5;#会话步长
set global auto_increment_increment=5;#全局步长
#设置起始偏移量
set global auto_increment_increment=6;
强调:起始偏移量<=步长
清空表 :
drop table t20 #也删不干净
delete from t20; #删不干净 起始偏移量删不了 常与where连用 删固定范围的记录
truncate t20;#把表清空 应该用truncate
foreign key:建立表之间的关系
why?:不可能把数据存入一张表呀 存储空间和管理方便
#先建被关联的表,并保证被关联字段唯一
create table dep(
id int primary key,
name char(16),
comment char(50)
);
#再建关联的表,删除先删此表
create table emp(
id int primary key,
name char(10),
sex enum('m','f'),
dep_id int,
foreign key(dep_id) references dep(id) #要慎用
on delete cascade #删除关联
on update cascade #更新关联
);
#先往被关联表内插入记录
insert into dep values
(1,'IT','技术能力有限'),
(2,'财务','花钱多');
#再往关联表插入
insert into emp values
(1,'ww','f',1)
(2,'ww','f',2)
delete from dep where id=1;#同时两个表删除成功
update dep set id=202 where id=2;
表之间的对应关系:(多换位思考)
1.多对一(一对多)
书(press_id int,foreign key(press_id) references press(id)) 出版社
create table press( #建立出版社的表(被关联表)一
id int primary key auto_increment, #自动增长约束
name varchar(20)
);
create table book( #建立书的表 (关联表)多
id int primary key auto_increment,
name varchar(20),
press_id int not null,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
);
insert into press(name) values
('我一定行出版社'),
('一定让他们知道出版社');
insert into book(name,press_id) values
("owen's life",1),
("owen's fantistic life",1),
("owen's girls",2);
2.多对多 (需要第三张表 把关系独立出来)
书 作者
create table author(
id int primary key auto_increment,
name varchar(20),
);
create table author2book( #找book_id与author_id之间的对应关系
id int not null unique auto_increment,
book_id int not null,
author_id int not null,
constraint fk_ author foreign key(author_id) references author(id)
on delete cascade
on update cascade,
constraint fk_ book foreign key(book_id) references book(id)
on delete cascade
on update cascade,
primary key(author_id,book_id)
);
insert into author2book(author_id,book_id) values
(1,1),
(1,2),
(2,1);
3.一对一 foreign key+unique
customer student
create table customer( #被关联的顾客
id int primary key auto_increment,
name varchar(20) not null,
qq varchar(10) not null,
phone char(16) not null
);
create table student(
id int primary key auto_increment,
class_name varchar(20) not null,
customer_id int unique,#该字段一定设置为唯一unique的 才是一对一
foreign key(customer_id) references customer(id) #外键的字段一定要保证唯一unique
on delete cascade
on update cascade
);
insert into customer (name,qq,phone) values
('dd',44444,123345),
('ddd',44434,1233),
('d334d',44234444,12334534);
insert into student(class_name,customer_id) values
('5class',2),
('2class',1);
·
·
·
·
创建数据库用 navicat for mysql软件 比较方便
下一节将详细介绍DDL、DML、DCL数据库语句的使用实例