数据库:数据按一定的格式存放的仓库。
端口:0-65535
一、为什么学习数据库?
1、伪类方便查询数据;
2、为了持久化保存数据。
二、数据库相关概念:
1、DB(DataBase):数据库;保存数据的容器。
2、DBMS:数据库管理系统或者数据库管理产品。常见的数据库管理系统:MySQL、ORACAL、DB2、sql server
3、SQL:结构化查询语句。
三、数据库存储数据的特点:
1、表是存放在库里的;
2、数据是存放在表里的;
3、一个数据库里面表名是惟一的;
4、数据库里面列名称之为字段;
5、表中数据是以行的形式存放。
四、MySQL服务的启动和停止:
计算机(右键)-管理-服务-找到MySQL56-可以启动和停止
五、MySQL服务的登录和退出:
登录:
MySQL -U root -p
退出:
quit或exit;
六、MySQL的语法规范和常见命令:
语法规范:
1、关键字大写,表名、字段名小写;
2、MySQL支持关键字小写;
常见命令:
查询数据库: show databases;
指定操作数据库: use 数据库名;
查看数据库中有哪些表: show tables;
查看表结构:desc表名;
查看表数据库:select * from 表名;
七、DDL语言(数据定义语言)
库和表的管理:
创建数据库:create database 库名;
删除数据库:drop database 库名;
创建表:注意:要建表,需要先用 use 数据库
创建表:create table 表名(
字段名 数据库类型;
字段名 数据库类型;
字段名 数据库类型;
);
删除表:drop table 表名;
八、MySQL修改表:
1、修改表名:rename
alter table 旧表名 rename 新表名;
2、修改字段的数据类型:MODIFY
alter table 表名 MODIFY 字段名 字段类型;
3、修改字段名:change
alter table 表名 change 旧字段名 新字段名 新数据类型;
4、添加字段:add first after
alter table 表名 add 字段名 first;
alter table 表名 add 字段名 字段类型 after 表中字段名;
eg:将字段firstname 添加到age字段之后
alter table student add firstname varchar(5) after age;
将firstname添加到第一列
alter table student add firstname varchar(5) first;
5、删除字段:drop
alter table 表名 drop 字段名;
DML语言(数据操纵语言)
删除语句:
删除其中某一行数据:delelte from 表名 where name='字段名';
同时删除多行数据:delelte from 表名 where name in ('字段名','字段名');
插入语句:
不指定字段插入:insert into 表名 values (字段数据,用逗号隔开);
eg:insert into 表名 values (1,'lsii',56,'13512345678');
指定字段插入:insert into 表名 (字段名) values (字段数据,用逗号隔开);
eg:insert into student (name,age,stuphone) values ('lsii',56,'13512345678');
同时插入多行数据:insert into 表名 values (字段数据),(字段数据)...,注意:字段数据间加括号用逗号隔开。
eg:insert into student values
(2,'wangwu',46,'13612345678'),
(3,'sadfsa',34,'13412345678');
修改语句:update 表名 set 要修改的字段=数据 where 表中要修改的行其他字段=值;
多个字段同时修改值的时候用逗号隔开,update student set id = 4,name='augus' where age=56;
三大范式:
设计表的时候的规范
https://www.cnblogs.com/auguse/articles/11935686.html
常见约束:
1、主键:primary key
作用:DBMS为了方便查找数据库设计的规则。
特点:(1)一张表里主键唯一的;
(2)主键可以用来唯一的标识一行数据,主键不能为空。
2、联合主键:表中字段不能作为唯一标识每一行数据时,选取表中两个或多个字段作为联合主键。
特点:如果去掉联合主键某个字段,剩下的字段任然可以构成联合主键,那么说明之前的联合主键是错误的。
在修改表时添加主键:alter table 表名 add primary key(字段名);
eg: alter table user add primary key(id);
删除主键:alter table 表名 drop primary key;
创建表的时候设置主键:
方式一:create table 表名(
-> 字段名 字段类型 primary key,
-> 字段名 字段类型,
-> );
方式二:create table 表名(
-> 字段名 字段类型,
-> 字段名 字段类型,
-> ......,
-> primary key(字段名)
-> );
创建联合主键:create table 表名(
-> 字段名 字段类型,
-> 字段名 字段类型,
-> ......,
-> primary key(字段名,字段名)
-> );
主键自增 AUTO_INCREMENT
通过auto_increment设置主键自增
特点:
1、和主键配合使用;
2、自增字段的数据类型是整数类型;
3、自增数据初始值为1,每自增一行数据,自加1;
添加自增:create table 表名(
-> 字段名 字段类型 primary key AUTO_INCREMENT,
-> 字段名 字段类型,
-> 字段名 字段类型,
-> 字段名 字段类型,
-> );
添加自增默认值:create table 表名(
-> 字段名 字段类型 primary key AUTO_INCREMENT,
-> 字段名 字段类型,
-> 字段名 字段类型,
-> 字段名 字段类型,
-> )AUTO_INCREMENT=值;
删除自增:alter table 表名 modify 字段名 字段类型 AUTO_INCREMENT;
修改表时添加主键自增:alter table 表名 change column 旧字段名 新字段名 字段类型 AUTO_INCREMENT;
修改表时指定初始值:alter table 表名 AUTO_INCREMENT=值;
MySQL5.6中文支持问题 DEFAULT CHARSET=GB2312;
查看创建表的sql语句:show create table 表名;
外键FOREIGN KEY() REFERENCES tb_dept1(id)
表间关系: 一对一
一对多
多对多
外键特点:外键关联时主表要先于从表创建;
外键字段的值必然在主表是一一对应的;
外键可以为空,但是不为空的外键必然可以在主表中创建外键关系:
CREATE TABLE stu_t (
id INT (5) PRIMARY KEY AUTO_INCREMENT,
sid INT (5),
NAME VARCHAR (10),
SUBJECT VARCHAR (15),
achievement VARCHAR (11),
CONSTRAINT fk_sid
FOREIGN KEY (sid) REFERENCES stu (id)
);ENGINE=InnoDB DEFAULT CHARSET=GB2312;
删除外键约束:
alter table 表名 drop FOREIGN KEY 外键名;
修改表时添加外键约束:
alter table 表名 add CONSTRAINT 外键名 FOREIGN KEY(sid) REFERENCES studentinfo(id)
唯一约束UNIQUE
特点:主键在一个表里只能有一个,但是唯一性约束可以多个;
设置了唯一性约束的字段,表中有且只能有一个空值;
创建表时设置唯一性约束:
create table 表名(
-> 字段名 字段类型 primary key,
-> 字段名 字段类型 unique,
-> 字段名 字段类型,
-> 字段名 字段类型,
-> );
修改表时添加唯一性约束:
alter table 表名 add unique(name);
起别名:
alter table 表名 add CONSTRAINT 别名 unique(字段);
删除唯一性约束:
alter table 表名 drop index name;
默认值DEFAULT 'Beijing'
特点:
在插入数据时,如果不写入就使用默认值,如果写入就使用新值;
create table 表名(
-> 字段名 字段类型,
-> 字段名 字段类型,
-> 字段名 字段类型,
-> 字段名 字段类型 DEFAULT '默认值',
-> );
修改表时添加默认值:
alter table 表名 change 旧字段名 新字段名 字段类型 DEFAULT '默认值';
非空约束(NOT NULL)
特点:一张表中可以设置多个字段非空,主键默认非空;
创建表时设置非空:
create table 表名(
-> 字段名 字段类型 NOT NULL,
-> 字段名 字段类型,
-> 字段名 字段类型,
-> 字段名 字段类型,
-> );
修改表时添加非空:
alter table 表名 change 旧字段名 新字段名 字段类型 not null;
DQL数据查询语句:查询会产生一张虚拟表
语法结构:select 字段名,字段名 from 表名 where 筛选过滤条件
(注意:*代表表中所有字段,不建议使用,会影响查询效率;)
查询表中所有数据库:select * from 表名;
指定字段查询:select 字段名,字段名 from 表名;
AS起别名:eg:select name AS 姓名,address AS 地址 FROM student;
不用AS起别名:select name 姓名,address 地址 FROM student;
限制固定行数查询:limit
注意:limit0,2 逗号前表示从哪一行开始取值,第一行是0,逗号右边取值多少行;
select * from student limit 0,3;
distinct排除重复:
select distinct 列名 from 表名;
条件查询:eg: select * from student where 字段名=值;
单条件查询:= != < > <= >=
多条件查询:and or not
select * from student where id>=2 and sex=‘女’;
select * from student where id>=2 or sex=‘女’;
范围选择方式一:eg:select * from 表名 where (2010-birth)>18 and (2010-brith)<28;
方式二:SELECT 列 FROM 表 WHERE 条件 BETWEEN 下限AND 上限(上下限的位置不能颠倒)
eg:select * from 表名 where 2010-birth BETWEEN 18 and 28;
方式三:SELECT 列 FROM 表 WHERE 条件 NOT BETWEEN 下限AND 上限
eg:select * from 表名 where 2010-birth NOT BETWEEN 18 and 28;
集合操作:
1、or
select * from student where 列名=值 or 列名=值 or ...;
2、in
select * from student where 列名 in (值,值);
3、not in
select * from student where 列名 not in (值,值);
模糊查询:_:一个字符、%:任意字符,可以是零个;
select * from student where 列名 like ‘值’;
查询空行:
select * from student where 列名 is null;
常量列:
select 列名 as 别名,列名 as 别名名,新的值 as 新别名 from student;
排序:
升序:ASC(从小到大)
select * from 表名 where 筛选条件 order by 列名 ASC;
降序:DESC(从大到小)
select * from 表名 where 筛选条件 order by 列名 DESC;
多列排序:
聚合函数:
count:计数,返回行的数目;
select count(列名) from 表名
max:最大值
select stu_id as 学号,max(grade) as 成绩 from 表名 where c_name='计算机';
min:最小值
select stu_id as 学号,min(grade) as 成绩 from 表名 where c_name='计算机';
sum:求和
select stu_id as 学号,sum(grade) as 成绩 from 表名 where c_name='计算机';
avg:平均值
select stu_id as 学号,avg(grade) as 成绩 from 表名 where c_name='计算机';
分组查询:group by
select c_name,max(grade) from 表名 group by c_name;
多列分组:
select stu_id,c_name,avg (grade) from 表名 group by c_name,stu_id;
having:对之前分组的结构进行过滤
select c_name,avg(grade) from 表名 group by c_name having avg(grader)>80;
WHERE子句:
从数据源中去掉不符合其搜索条件的数据
GROUP BY子句:
搜集数据行到各个组中,统计函数为各个组计算统计值,每个组输出一行结果
HAVING子句:
从分组计算结果中进行过滤,去掉不符合其组搜索条件的各组数据行
子查询:sql里面嵌套sql;
SELECT name FROM class WHERE id = (SELECT cid FROM students WHERE name = ‘xxxx’)
in:后面可以赋多个值,用括号包裹;
SELECT * FROM student WHERE id in (SELECT stu_id FROM score WHERE c_name = ‘中文’) ;
exists子查询:如果子查询返回结果为真则执行父级sql,如果为假则父级sql执行结果为空;
SELECT * FROM student WHERE exists (SELECT stu_id FROM score WHERE c_name = ‘中文’) ;
any子句:取最小值与父级比较
all子句:取最大值与父级比较
union子句:合并表;
all 数据会重复
SELECT * FROM student_copy UNION all SELECT * FROM student;
不加all会去重
SELECT * FROM student_copy UNION SELECT * FROM student;
多表联合查询:
内连接:求两表交集的部分;
select * from 表1 INNER JOIN 表2 ON 表1.列名=表2.列名
eg:select * from a_table INNER JOIN b_table ON a_table.a_id=b_table.b_id;
左连接:LEFT JOIN
以左表为基准,展示出左表的全部数据和右表交集部分数据;
select * from a_table LEFT JOIN b_table ON a_table.a_id=b_table.b_id;
右连接:RIGHT JOIN
以右表为基准,展示出右表的全部数据和左表交集部分数据;
select * from a_table RIGHT JOIN b_table ON a_table.a_id=b_table.b_id;
视图:
保存查询结果,把查询结果当做一张虚拟的表,依赖于原始表数据和结构,如果原表数据或者结构发生改变,视图的数据和结构也会发生相应的改变
特点:
1、效率高;2、安全性,可以指定展示其中某几列数据,隐藏敏感信息
创建视图:view
语法结构:
create view 视图名 as 查询的sql语句
创建视图时指定字段名:
create view 视图名 (字段名,字段名)as 查询语句;
创建多表视图:(查询语句中不能使用 * )
create view 视图名 as 联合查询语句
查看视图结构:
DESC 视图名;
查看创建视图的语句:
show create view 视图名;
修改视图的语句:
alter view 视图名 as 新查询sql语句;
修改视图的数据:
update 视图名 set 字段名=新数据 where 条件
eg:UPDATE view_show_stu set sname='吊炸天' WHERE sid=103;
删除视图:drop view
drop view 视图名;
存储过程:多句sql同时执行,先编译好存储服务端,
特点:执行效率高、重复使用
临时改变结束结束符合
delimiter //
创建存储过程
CREATE PROCEDURE show_studnet()
BEGIN
SELECT * FROM student;
END//
调用存储过程
CALL show_studnet()
查看存储过程创建sql
SHOW CREATE PROCEDURE show_studnet
创建带参数的存储过程
delimiter //
CREATE PROCEDURE 存储过程名(IN 新代字段 调用字段类型和值)
BEGIN
SELECT * FROM student WHERE 原表字段=新代字段;
END//
CALL show_studnet_un('原表中该行原数据')
eg:delimiter //
CREATE PROCEDURE show_studnet_un(IN name VARCHAR(30))
BEGIN
SELECT * FROM student WHERE sname=name;
END//
调用
CALL show_studnet_un('原表中该行原数据')
删除存储过程
drop PROCEDURE show_studnet_un
数据库的备份:
备份表:
mysqldump -u root -p 数据库名 表名>备份存储路径://存储名.sql
备份指定库:
mysqldump -uroot -p test woniutest>C:\student.sql
#备份数据库中某个表
mysqldump -uroot -p test student>C:\student.sql
备份单个数据库
mysqldump -u root -p 库名>C:\student.sql
同时备份多个库
mysqldump -u root -p --databases 库名 库名>C:\student.sql
#导出数据库信息
查看secure-file-priv当前的值是
show variables like '%secure%';
如果导出失败:
则需要添加secure_file_priv
SELECT * FROM student INTO OUTFILE 'C://Pcode/person.txt';
回复数据库
mysql -u root -p < C:\all.sql
备份所有数据库
mysqldump -u root -p --all-databases > C:\all.sql