数据库管理系统


数据库:数据按一定的格式存放的仓库。

端口: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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM