创建数据库:
- 语法:create database 数据库名称 (后面的可省略) character set 字符集 collate 字符集校对规则;
查看数据库:
- 语法:查看数据库服务器中所有的数据库:show databases;
- 查看某个数据库的定义信息:show create database 数据库名称;
修改数据库:
- alter database数据库名称character set字符集collate校对规则;
删除数据库:
- drop database 数据库名称;
其他数据库操作:
- 切换数据库:use 数据库名称;
- 查看当前正在使用的数据库名称:select database();
sql创建表:
- create table 表名称(字段名称 字段类型(长度) 约束, 字段名称 字段类型(长度) 约束…);
字段类型:
一个实体对应一个表,一个实体属性对应表的一个字段。
- 约束:保证数据的完整性
-
单表约束分类: 主键约束 primary key 默认唯一非空的 唯一约束 unique 非空约束 not null
建表:
create database db1;
use db1;
create tab1e user(
id int primary key auto_increment,
username varchar (20) unique,
password varchar (20) not nu11,
age int,
birthday date
);
查看表:
- 查看某个数据库下的所有表:show tables;
- 查看某个表的结构信息:desc 表名;
删除表:
- drop table 表名;
修改表:
-
修改表:添加列
alter table 表名 add 列名 类型(长度) 约束;
-
修改表:修改列类型,长度和约束
-
alter table 表名 modify 列名 类型(长度) 约束;
-
修改表:删除列
-
alter table 表名 drop 列名;
-
修改表:修改列名称
-
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
-
修改表:修改表名
-
rename table 表名 to 新表名;
-
修改表:修改表的字符集
-
alter table 表名 character set 字符集;
对数据库表的记录进行操作:
添加表的记录
- 向表中插入某些列:insert into 表名 (列名1,列名2,列名3…) values (值1,值2,值3…);
- 向表中插入所有列:insert into 表名 values (值1,值2,值3…);
值的类型是字符串或者是日期类型,使用单引号引起来。
修改表的记录:
- update 表名 set 列名=值,列名=值 [where 条件];
删除表的记录:
- delete from 表名 [where 条件];
查看表的记录:
- 基本查询:
-
select [distinct]*|列名 from 表 [条件];
select * from exam;//查询所有
select English,math from eaxm;//查询两列
select distinct English,math from eaxm;//不显示重复的值
条件查询:
查询成绩在60~80之间的记录。
SELECT * FROM SC
WHERE GRADE BETWEEN 60 AND 80
排序查询:
分组统计查询:
- sum()
- count()
- max()/min()
- avg()
- group by
数据库备份与还原:
备份:
cmd中打开
mysqldump -u -p 要备份的数据库 > 备份的地址
还原:
需要重新创建一个数据库,
- 第一种再重开一个cmd输入以下命令
mysql -u root -p 要还原的数据库 < 备份的地址
- 第二种切换到该数据库 输入:
source 备份的地址
多表查询 外键约束
外键需要删除主表的关联记录才能删除从表的对应记录。
create table dept(
did int primary key auto_increment,
dname varchar(20)
);
insert into dept values (null,'市场部');
insert into dept values (null,'人事部');
insert into dept values (null,'教研部');
create table employee(
eid int primary key auto_increment,
ename varchar(20),
salary double,
birthday date,
sex varchar(20),
dno int
);
insert into employee values (null,'张三',8000,'1999-09-01','男',3);
insert into employee values (null,'李四',5000,'1999-09-01','男',1);
insert into employee values (null,'王五',6000,'1999-09-01','男',2);
insert into employee values (null,'赵六',9000,'1999-09-01','男',3);
//员工表上添加外键约束
alter table employee add foreign key (dno) references dept(did);
//设置外键为非空
alter table employee modify dno int not null;
表与表之间的关系
一对多的关系
多对多的关系
需要创建中间表,中间表中至少两个字段,分别作为外键指向多对多双方的主键
一对一的关系
唯一处键对应:
假设是一对多,在多的一方创建外键指向.的一方的主键,将外键设置为unique。
主键对应:
将两个表的主键建立对应关系即可。
多表查询
连接查询
交叉连接 cross join
- 查询到的是两个表的笛卡尔积
- 语法:
-
select * from 表1 cross join 表2; 或者 selcet * from 表1,表2;
外连接outer join(outer 可以省略)
-
左外连接
-
会得到左表的全部信息,就算右表没有也会显示
-
select * from 表1 left outer join 表2 on 关联条件;
-
-
右外链接
-
与左相反
-
select * from 表1 right outer join 表2 on 关联条件;
-
内连接 inner join(inner 可以省略)
两个表交集的部分
- 显示内连接:在sql中显示调用inner join关键字
- select from * 表1 inner join 表2 on 关联条件;
- 隐式内连接:在sql中没有调用inner join关键字
- select from * 表1 ,表2 where 关联条件;
子查询
子查询:一个查询语句条件需要依赖另一个查询语句的结果。
带in的子查询
从classes里面找符合条件的记录
SELECT * FROM classes WHERE cid IN(SELECT cno FROM student WHERE birthday > '1991-01-01');
带exists的子查询
如果条件成立就执行where前面的语句
SELECT* FROM classes WHERE EXISTS (SELECT cno FROM student WHERE birthday > '1991-01-01');
带any的子查询
取括号里面最小的,即大于最小的
SELECT * FROM classes WHERE cid > ANY (SELECT cno FROM student);
带all的子查询
大于最大的
SELECT * FROM classes WHERE cid > ALL (SELECT cno FROM student);
事务
事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全都成功,要么全都失败。
- 事务特性:
-
原子性:事务的不可分割,组成事务的各个逻辑单元不可分割。
-
一致性:事务执行的前后,数据完整性保持一致。
-
隔离性:事务执行不应该受到其他事务的干扰。
-
持久性:事务一旦结束,数据就持久化到数据库中。
-
隔离级别
如果不考虑隔离性〈一个事务执行受到其他的事务的干扰),引发一些安全问题,主要体现在读取数据上:
脏读: 一个事务读到了另一个事务未提交的数据,导致查询结果不一致
不可重复读: 一个事务读到了另一个事务已经提交的update 的数据,导致多次查询结果不一致。
虚读/幻读: 一个事务读到了另一个事务已经提交的insert 的数据,导致多次查询结果不一致。
-
设置事务的隔离级别: 安全性从低到高,效率从高到低
-
read uncommitted :脏读,不可重复读,虚读都有可能发生
-
read committed:避免脏读。但是不可重复读和虚读是有可能发生
-
repeatable read:避免脏读和不可重复读,但是虚读有可能发生。
-
serializable:避免脏读,不可重复读,虚读。(串行,只有当另一事务结束,当前事务才能获取结果)
-
-
设置事务的隔离级别SETSESSION TRANSACTION ISOLATION LEVEL隔离级别;
-
查看当前的隔离级别 SELECT @@tx_isolation;