注意:DQL:Data Query Language 数据查询语言
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QLmaY2Lf-1633503346242)(image/image.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0viPdllH-1633503346245)(image/image_1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DtQwVtHP-1633503346247)(image/image_2.png)]
DDL (Data Definition Language) :数据定义语言,定义库,表结构等 ,包括create,drop,alter等
前提:数据库 DataBase
# 创建数据库的命令
create database database_name;
create database 数据库名;
#在mysql中字符集名称不要使用utf-8
create database 数据库名 charset 'utf8';
create database 数据库名 charset 'gbk';
use database_name;
show databases;
drop database database_name;
drop database suns1;
#前提是前面有use 数据库名;的语句
show tables ;
show tables from 数据库名;
create table [if not exists] 表名(
字段名 数据类型 [约束],
字段名 数据类型 [约束], ...
);
# id name password balance
create table table_name(
列名1 数据类型1,
列名2 数据类型2
.....
);
create table t_account(
id int,
name varchar2(20),
password varchar(24),
balance double
);
表名和字段名
1. 合法的标识符即可。
2. 表名一般以t_开头,字段名多个单词间以下划线分隔。
3. 表名和字段名不区分大小写。
不同的数据库产品,虽然大面积数据类型是相通的,但是会存在稍许差异
MYSQL double
Oracle number(5,2)
MYSQL varchar(12)
Oracle varchar2(12) varchar(12)
数据类型 | 解释 | 注意事项 |
---|---|---|
tinyint [age] | 1字节 | 有符号数:-128~127 无符号数(unsigned):0~255 |
smallint | 2字节 | 数 有符号数:-32768~32767 无符号数:0~65535 |
mediumint | 3字节 | 有符号数:-8833608~8833607 无符号数:0~1677215 |
int、integer[重点] | 4字节整数 | 有符号数:-2147483648~2147483647 无符号数:0~4294967295 |
bigint | 8字节整数 | 有符号 数:-9223372036854775808~9223372036854775807 无符号数:0~18446744073709551615 |
float[重点] | 4字节 | -3.402823466E+38~3.402823466E+38 |
double[重点] | 8字节 | -1.7976931348623157E+308~1.7976931348623157E+308 |
decimal(m,n)[重点]十进制 | 定点数 | m表示精度(数字有效长度),d表示标度(小数点的位数) m最大值65,默认值10;d最大值30,默认值0 |
char(n) | 定长字符串255字节 | 无论保存的数据多少,一定占n的字符空间,n最大255 M 男 F 女 |
varchar(n) | 变长字符串 | 根据保存的数据多少,占据对应的字符空间,n最大65535 用户名:suns |
blob | 二进制形式的长文本数据 | 图片,音频 .exe |
text | 大文本类型 | 能保存4G大小文字 |
enum | 枚举类型 | 在给定的范围内选择一个值,比如性别 enum(‘F’,‘M’) M”是英文“male”的缩写,中文译为男性;“F”是英文“female”的缩写,中文译为女性;“male”和“female”用于表示性别时, |
date | 4字节 | 包含年月日,1000-01-01~9999-12-31 |
time | 3字节 | 包含时分秒,-838:59:59~838:59:59 |
datetime[重点] | 8字节 | 包含年月日 时分秒,1000-01-01 00:00:00~9999-12-31 23:59:59 |
timestamp【时间戳】 | 4字节 | 包含年月日时分秒,1970-01-01 08:00:01~2038-01-19 11:14:07 |
timestamp范围比较小
timestamp和时区有关
show variables like 'time_zone'
set time_zone = '+9:00';
实战建议:
1. 如果数字一定大于0,且不会进行减运算,可以使用unsigned无符号数。如非必要,还是建议 使用有符号数。
2. float和double存在精度问题,实战中很少使用,MySQL后续版本将不再支持上述两个类型。
对精度要求较高时使用decimal。
3. char和varchar在保存多字节字符(比如中文)底层实现是一样的,所以实战中建议使用 varchar
4. 实战中通常需要精确到秒,而timestamp的上限很快到达,建议使用datetime
例:创建t_person表
create table t_person(
person_id int,
person_name varchar(50),
age tinyint unsigned,
--在给定的范围内选择一个值
sex enum('F','M'),
birthday datetime,
salary decimal(10,2),
mobile varchar(11),
address varchar(500)
);
duplicate:重复
作用:约束限制字段值格式和范围。
约束 | 解释 | 说明 |
---|---|---|
primary key | 主键 | 用来明确一列为主键列,唯一标识,且非空 |
not null | 非空 | 约束一列的值不能为null |
unique | 唯一 | 约束一列的值不能重复,不检查null的 |
default | 默认 | 当列没有值时设置默认值,附加值 |
references | 外键约束 | 明确该列为外键列,并指明引用那一块表的那一列值,外键的值必须来源于另一张表的主键 |
1. 主键约束只能给主键列添加。唯一且非空
create table t_account1(
id int primary key,
password varchar(12) bot null,
password varchar(12) unique,
balance double
);
例:普通约束示例
-- 列级约束:直接将约束定义在列中
create table t_person(
person_id int primary key,
person_name varchar(50) unique not null,
age tinyint unsigned not null,
sex enum('F','M') not null default 'M',
birthday datetime not null,
salary decimal(10,2) not null,
mobile varchar(11) not null,
address varchar(500) not null );
-- 表级约束:将约束定义在列定义语句后,not null、default 没有表级约束
create table t_person(
person_id int ,
person_name varchar(50) ,
age tinyint unsigned ,
sex enum('F','M') not null default 'M',
birthday datetime not null,
salary decimal(10,2) not null,
mobile varchar(11) not null,
address varchar(500) not null,
-- [constraint 约束名] 约束类型(字段名)
constraint pk_person_id primary key(person_id),
constraint uq_person_name unique(person_name) );
表级约束:将约束定义在列定义语句后,not null、default 没有表级约束
id——》identify唯一标识
# 修改已经存在的列,改数据类型,约束
# 前提这列不能存储数据。
alter table table_name modify name 数据类型 约束
# 修改表的列名
# alter table table_name rename column name to new_name
# 修改表的列名字
alter table t_test1 change name new_name varchar(12);
# 添加列的名字
alter table t_test1 add name 数据类型
# 删除列
alter table t_test1 drop name
1. 对于表进行相关的操作
创建表(create table)
删除表(drop table)
修改表(alter table)
2. 对表相关的操作 DDL语言
describe 【数据库名.]表名称;
desc t_test1;
alter table 表名 modify 列名 类型;
例:
alter table student modify age int;
alter table 【数据库名.]表名称 change【column】 旧字段名 新字段名 新数据类型;
例:
alter table student rename column address to addr
alter table 表名 add 列名 类型 约束 默认值;
例:
alter table student add email varchar(59) not null;
alter table 表名 rename 新表名;
5、表的销毁删除
drop table [if exists] 表名;
drop table table_name;
例:
drop table t_person;
**注意:如果两张表有外键引用关系,那么必须先删子表,后删父表** 。
1.创建表:create 修改表:alter 删除表:drop
2.对表的相关操作DDL语言
insert into table_name(field1,列名,列名,...)
values(value1,值,值,...);
例:
insert into
t_person(person_id,person_name,age,sex,birthday,salary,mobile,address)
values(1,'xiaohei',18,'M','2000-12-23 12:30:30',10000.00,'187xxxxxxx','郑 州硅谷');
注意:
1. values后小括号中的值要和表名后小括号对应!!!
2. 注意类型与约束
给所有列添加数据,表名后的小括号可以省略
语法:
insert into 表名
values(值,值,值,...);
例:
insert into t_person
values(2,'xiaobai',18,'F','2000-12-23 12:30:30',12000.00,'185xxxxxxx','郑 州硅谷');
注意:values前后两个括号中的值 数量要一致
insert into user(name,nick,birthday) values ('Mr_lee','zz22','2000-01-01');
insert into user9 (name,nick,birthday) values ('Mr_lee','zz22','2000-01-01'),
('Mr_lee','zz33','2000-01-01'),
('Mr_lee','zz44','2000-01-01')
insert into user9 values (1,'Mr_lee','zz','2000-01-01')
语法:
delete from 表名
[where 条件];
#全表数据全删除
delete from t_test1
#根据id删除某些行的数据
delete from t_test1 where id = 10;
delete from t_test1 where id in (1,2,3);
例·:
delete from t_person
where person_id = 1;
注意:不加条件,则删除表中所有数据。
表截断:truncate table 表名;//删除表中所有数据
表截断:直接在物理空间中,将保存数据的空间截断,效率更高
delete from 表:一行一行的删除,效率比较低。
update 表名
set 列名 = 新值,列名=新值,...
[where 条件];
update table_name
set field1=new_value1,field2=new_value2
where....
注意 :更新数据时务必指定where条件,否则将会影响所有行的值。
update user9
set name='Mr_lee'
where id=1;
update user9 set
name='xiaohei',
age=30
where id = 20;
update user9
set name='Mr_lee' ;
例:
update t_person
set age = 20,sex = 'F'
where person_id = 1;
注意:不加where条件,则更新所有行。
1:数据操作语言
2:数据操作语言:DML Data modify language
3:
DQL:查询语句
DDL:建表相关语句 create alter drop
DML:数据操作语言数据插入 insert 数据修改update 数据删除delete
4:数据库中的增删改查(CRUD) create read update delete
增:insert into
删:delete from
改:update set
查:select
概念:外键也是一种约束,主要用于说明该列与其他列的关系。
分析如何让多张表产生关系
表结构:
在student表中增加一列,该列只用于让两张表产生关系:
我们通过student表中的class_id 就可以准确的找到另一张表与它有关系的数据。
该列的数据必须来源于 class 表中的 id 是一种约束
例:
-- 外键约束,必须使用表级约束方式定义 表级约束:constraint
create table t_class(
class_id int primary key,
class_name varchar(20) not null );
create table t_student(
student_id int primary key,
student_name varchar(20) not null,
class_id int not null,
-- 追加外键(关系列)
constraint fk_student_class foreign key(class_id)
references t_class(class_id) )
**--** ** 我们一般把有外键的表称之为子表(从表),被指向的表称之为父表(主表) **
外键:体现2张表之间关系的。
外键约束 表达 外键列的值必须来源于另一张表的主键
create table t_dept(
id int primary key,
dept_name varchar(12),
dept_code int
);
create table t_employee{
id int primary key,
name varchar(12),
age int,
salary double,
dept_id int,
foreign key(dept_id) references t_dept(id)
}
注意:
1、外键列的值可以重复、可以为null。
2、建表时应该先创建主表再创建从表
3、删除主表数据时如果该数据被从表指向,
必须先解除关系(update ,delete),再删除主表数据。
作用:保证业务的完整性,要么一起成功要么一起失败
例:转载业务
思考:完整的业务需要执行两次更新操作,但如果第二次更新失败呢?
概念:我们在一个事务中,可以使用控制事务语句来控制提交所有操作或者回到事务最初状态、
transaction 事务 [trænˈzækʃn]
控制事务语句 | 作用 |
---|---|
start transaction | 开启事务 |
commit | 提交 |
roolback | 回滚(数据还原到事务开始时的状态) |
概念:我们在一个事务中,可以使用控制事务语句来控制提交所有操作或者回到事务最初状态
例:
程序员误删数据:
delete from t_account;--忘记写
rollback; --回到事务最初状态
数据库为每个客户端连接分配的独立区域,当执行insert|update|delete
操作时会暂时将原数据存储到回滚段中,
如果事务失败将会进行回滚(rollback)。
实现原理:
特性 | 含义 |
---|---|
原子性A (Atomicity) [ˌædəˈmɪsədi] |
保证一组sql语句一起成功一起失败,原子操作。 |
一致性C (Consistency )[kənˈsɪstənsi] | 事务执行前后,数据的状态是一致的,是正确的。(老公存,老婆花) |
隔离性I (Lsolation) |
保证用户并发访问数据安全,一个连接一个事务。 |
持久性D (Durability) [ˌdʊrəˈbɪləti] |
一个事务一旦提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响 。 |
类别 | 含义 | 事务 |
---|---|---|
DQL(Data Query Language) | 数据查询语言 select | 支持 |
DDL(Data Definition Language) | 数据定义语言 create,alter,drop | 隐式提交 |
DML(Data Manipulation Language) | 数据修改语言 insert,update,delete | 显式提交 |
TCL(Transaction Control Lanager) | 事务控制语言 commit,rollback。 |
使用方法:
语法
可在建表主键后使用 AUTO_INCREMENT ,插入数据时可以不用插入主键的值,自动生成
例:
create table t_person(
person_id int primary key auto_increment,
person_name varchar(50) unique not null, -- 略....
);
插入数据时不必插入主键的值,自动增长
例:
insert into t_person(
person_name,age,sex,birthday,salary,mobile,address)
values('xiaohei23',18,'M','2000-12-23 12:30:30',10000.00,'187xxxxxxx','郑州硅谷');
注意:在sql语句执行时,无论成功与否 auto_increment 都会自动+1
语法
alter table 表名 auto_increment = 起始值
为表中所有使用了auto_increment 自增功能的列,指定起始值
语法:
select last_insert_id()
create table t_dept1(
id int primary key,
dept_name varchar(12),
dept_code int
);
insert into t_dept1 (id,dept_name,dept_code) values (1,'dev','001');
insert into t_dept1 (id,dept_name,dept_code) values (2,'dev','001');
create table t_dept1(
id int primary key auto_increment, // 主键自动增长
dept_name varchar(12),
dept_code int
);
insert into t_dept1 (dept_name,dept_code) values ('dev','001'); mysql 自动的为id 设置值 为1
insert into t_dept1 (dept_name,dept_code) values ('dev','001'); id+1 ---> 2
create table t_dept2(
id int primary key auto_increment,
dept_name varchar(12) default 'xiaohei',
dept_code int
);
insert into t_dept2 (dept_code) values (1);
MYSQL
假定 id 5
id dept_name dept_code
6 xiaohei 1
engine 引擎选择:一般使用innodb
default charset 表中的数据编码格式
1、建库最好选择字符集utf-8建表时会继承库的字符集
2、如果建库时没有选择字符集,则建表必须设置字符集,否则会出现中文乱码
3、建议将my.ini配置文件中的字符集更改为utf8则数据库将会继承配置中的字符集`
create table t_xxx(
name varchar(12) xxx xxx
...
....
)xxxx;
create table user9(
id int auto_increment primary key,
name varchar(20) NOT NULL DEFAULT 'Mr_lee',
nick varchar(15) UNIQUE,
birth timestamp
)
ENGINE = InnoDB default charset = utf8 auto_increment = 9;
create view v_user as 查询SQL;
例:
create view v_employee_departments
as select e.*,d.department_name,d.location_id
from employees e
left join departments d
on e.department_id = d.department_id;
语法:
select 列,列,...
from 视图名
[where 条件] ...
例:
create view v_employee_departments
as
select e.*,d.department_name,d.location_id
from employees e
left join departments d
on e.department_id = d.department_id;
drop view 视图名;
例:
drop view v_employee_departments;
视图本质上就是一个复杂的查询SQL
视图本身并不能提升查询效率,只能提升开发效率
视图本身不是表,不存储任何数据
从数据库中查询数据和从字典中查询一个字的过程相似。数据库中的索引和字典中的拼音、偏旁部首、笔画这些组成类似,用来提高查询效率的。
- 使用索引提高查询效率
创建:
create index 索引名
on 表名(列名);
查看:
show index from 表名;
删除索引:
drop index 索引名 on 表名;
当使用添加了索引的列作为查询条件时,数据库会自动使用索引。
提前准备千万级的数据能看出索引的效果。
1. 索引用来提高查询效率
2. 索引也会占用磁盘空间
3. 索引不是越多越好,一般每张表不要超过5个。
原因:
1.索引会占空间,影响性能
2.影响增删改的效率
**4. 注意,索引不是任何时候都有效,例如在is null或者模糊查询时索引会失效**