MySQL数据库知识点总结

MySQL属于关系型数据库,关系型数据库是指采用了关系模型来组织数据的数据库,而关系模型就是指二维表格模型,所以,关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

1.mysql数据库中常用的概念有:

(1)字段:表中的一列,(也叫属性);

(2)记录:表中的一行,(也叫元组);

(3)关键字:一组可以唯一标识记录的字段,(能根据它快速分类,检索到目的数据的关键词);

(4)域:字段的取值范围,(即某一列的取值限制);

(5)关系:就是数据库的表,(即数据库的表名);

(6)关系模式:定义关系的描述叫关系模式,通常表示为:表名(字段1,字段2,……),(也叫表结构);

(7)事务:是作为单个逻辑单元执行的一系列操作,(也就是一组不可分割的sql语句);

(8)ACID:事务必须具备ACID特性,

A ——>Atomic(原子性),事务必须是原子工作单位,对于数据的修改,要么全部执行,要么全部不执行。 
C ——>Consistency(一致性),事务在完成时,必须使所用的数据都保持一致状态。 
I ——>Isolation(隔离性),由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态。 
D ——>Durability(持久性),事务完成后,对系统的影响是永久的。 
(数据库采用日志的方式来保证原子性,一致性,持久性,用锁机制来保证隔离性); 

(9)索引:索引是对数据库表中一列或多列的值进行排序的一种结构,(类似于书籍的目录)。

2.mysql数据库的瓶颈:

(1)高并发读写性能低
由于网站的用户并发性高,往往是每秒上万次的读写请求,虽然mysql等关系型数据库勉强可以应付上万次SQL查询,但硬盘I/O往往无法承担上万次的SQL写数据请求。

(2)海量数据读写效率低
网站每天产生的数据量非常大,但是对于mysql等关系型数据库来说,对海量数据的查询和更改,效率非常低。

(3)可扩展性和可用性低
当数据量剧增的时候,无法简单的添加硬件等方法扩展性能,而是需要停机维护和数据迁移。

3.关系型数据库和非关系型数据库:

(补充:
问:什么是非关系型数据库?
答:非关系型数据库也叫NoSQL,它的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。由于不可能用一种数据结构化存储应付所有的新的需求,因此,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。

(1)由于关系型数据库的一致性,使得关系型数据库可以用于所有对一致性有要求的系统中,如银行系统;但是还是由于关系型数据库的一致性,在网页应用中,一致性也不是很重要,相反,对于高并发性要求比较高,因此,非关系型数据库的地位就凸显出来了。

(2)关系型数据库通常是基于行的形式存储,而关系型数据库包括列式存储、键值对存储、文档存储、图形存储。

4.数据库的引擎:

数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务。
mysql数据库常用的引擎有:innodb和berkleydb(bdb)。

5.sql语句:

(1)添加、删除用户,给权限

  • 添加用户
insert into mysql.user(Host,User,Password) values("localhost","test",password("123456"));
  • 删除用户
delete from user where User='test' and Host='localhost';
flush privileges;   //刷新系统权限表
  • 给予用户权限
grant all privileges on testdb.* to test@localhost identified by '123456';//把testdb数据库的所有权限给test
flush privileges;//刷新系统权限表

(2)DDL:数据定义语言 Data Definition Language

  • 创建库
创建一个名称为mydb1的数据库。

    mysql>CREATE DATABASE mydb1;

查看数据库的创建细节

    mysql>SHOW CREATE DATABASE mydb1;

创建一个使用gbk字符集的mydb2数据库。

    mysql>CREATE DATABASE mydb2 CHARACTER SET gbk;

创建一个使用gbk字符集,并带校对规则的mydb3数据库。

    mysql>CREATE DATABASE mydb3 CHARACTER SET gbk COLLATE gbk_chinese_ci;

查看当前数据库服务器中的所有数据库

    mysql>SHOW DATABASES;

查看前面创建的mydb2数据库的定义信息

    mysql>SHOW CREATE DATABASE mydb1;

删除前面创建的mydb3数据库

    mysql>DROP DATABASE mydb3;
  • 创建表
创建表之前一定先选择数据库

    mysql>USE test;

创建一个员工表

        mysql>CREATE TABLE employee(
            id int,
            name varchar(200),
            gender varchar(10),
            birthday date,
            entry_date date,
            job varchar(200),
            salary float(8,2),
            resume text
        );

显示当前数据库中的所有表格

    mysql>SHOW TABLES;

在上面员工表的基本上增加一个image列。

    mysql>ALTER TABLE employee ADD image blob;

查看表结构的定义

    mysql>DESC employee;

修改job列,使其长度为60。

    mysql>ALTER TABLE employee MODIFY job varchar(60);

删除image列。

    mysql>ALTER TABLE employee DROP image;

表名改为user。

    mysql>RENAME TABLE employee TO user;

查看表的创建细节

    mysql>SHOW CREATE TABLE user;

修改表的字符集为gbk

    mysql>ALTER TABLE user CHARACTER SET gbk;

列名name修改为username

    mysql>ALTER TABLE user CHANGE name username varchar(100);

(3)DML:Data Manipulation Language 数据操作语言

  • 插入信息
建议:mysql>INSERT INTO user (id,username,gender,birthday,entry_date,job,salary,resume) VALUES (1,'zql','0','1991-09-07','2013-04-12','CTO',10000.00,'beauty');

mysql>INSERT INTO user VALUES (2,'gfy','1','1987-09-07','2013-04-12','CEO',10000.00,'hand');
  • 插入中文时的问题:(编码问题)
查看数据库目前的各种编码:

    mysql>SHOW VARIABLES LIKE 'character%';

通知服务器客户端(黑窗口)使用的编码字符集

    mysql>SET character_set_client=gbk;

显示时乱码

    mysql>SET character_set_results=gbk;
  • 修改数据信息
将所有员工薪水修改为5000元。

    mysql>UPDATE user SET salary=5000;

将姓名为’王翔云’的员工薪水修改为3000元。

    mysql>UPDATE user SET salary=3000 WHERE username='王翔云';

将姓名为’王翔云’的员工薪水修改为4000元,job改为CMO。

    mysql>UPDATE user SET salary=4000,job='CMO' WHERE username='王翔云';

将zql的薪水在原有基础上增加1000元。   

    mysql>UPDATE user SET salary=salary+1000 WHERE username='zql';
  • 删除信息数据
删除表中名称为’王翔云’的记录。

    mysql>DELETE FROM user WHERE username='王翔云';

删除表中所有记录。

    mysql>DELETE FROM user;(一条一条的删除)

使用TRUNCATE删除表中记录。

    mysql>TRUNCATE user;(摧毁整张表,然后重建表结构)

(4) DQL简单的:Data Query Language

  • 基本查询
查询表中所有学生的信息。

    mysql>SELECT * FROM student;(不建议使用)

    mysql>SELECT id,name,chinese,english,math FROM student;

查询表中所有学生的姓名和对应的英语成绩。

    mysql>SELECT name,english FROM student;

过滤表中重复数据。

    mysql>SELECT DISTINCT english FROM student;
  • 查询中支持的基本运算
在所有学生数学分数上加10分特长分。

    mysql>SELECT id,name,math+10 FROM student;

统计每个学生的总分。

    mysql>SELECT name,chinese+english+math FROM student;

使用别名表示学生分数。

    mysql>SELECT name AS 姓名,chinese+english+math 总分 FROM student;(姓名,总分不要加单引号,AS可以省略,将经常用到)

查询姓名为王五的学生成绩

    msyql>SELECT name,english,chinese,math FROM student WHERE name='王五';

查询英语成绩大于90分的同学

    msyql>SELECT name,english,chinese,math FROM student WHERE english>90;

查询总分大于200分的所有同学

    mysql>SELECT name,chinese+english+math FROM student WHERE (chinese+english+math)>200;
  • WHERE语句支持运算表达式
等于:  = 
不等于:  <>
between..and:显示在某一区间的值(包含头尾)
inset):显示在指定列表中的值为set的数据,例:in80)或 in100,200)[值为100或者200的数据]
like '张pattern' :模糊查询(pattern:%代表0个或多个任意字符,_代表一个字符)like ‘张%’; [查询带“张”字的数据局]
is unll:判断是否为空
not :检索不在条件范围内的记录
order by :对查询结果进行排序(在进行多列排序的时候,第一列必须有相同的列值,才会对第二列进行排序)

查询英语分数在 8090之间的同学。

    mysql>SELECT * FROM student WHERE english BETWEEN 84 AND 85;

查询数学分数为89,90,91的同学。

    mysql>SELECT * FROM student WHERE math IN (89,90,91);

查询数学分数不是为90,91的同学。

    mysql>SELECT * FROM student WHERE math NOT IN (90,91);

查询所有姓李的学生成绩。

    mysql>SELECT * FROM student WHERE name LIKE '李%';

查询数学分>80,语文分>80的同学。

    mysql>SELECT * FROM student WHERE math>80 AND chinese>80;

对数学成绩排序后输出。

    mysql>SELECT * FROM student ORDER BY math;//默认是升序

对总分排序后输出,然后再按从高到低的顺序输出

    mysql>SELECT name,chinese+english+math FROM student ORDER BY (chinese+english+math) DESC;(desc为降序)

对姓李的学生数学成绩排序输出

    mysql>SELECT name,math FROM student WHERE name LIKE '李%' ORDER BY math;

(5)数据完整性

数据完整性是为了保证插入到数据中的数据是正确的,他防止了用户可能的输入错误。

1、实体完整性:规定表中的一行在表中是唯一的实体。

一般是通过定义主键的形式来实现的。

主键:
    关键字:PRIMARY KEY
    特点:不能为null,必须唯一
CREATE TABLE SHANG_HAI1(
    id int PRIMARY KEY, -----如果用户输入id时与之前的id重复则会报错
    name varchar(100)
);

//实际开发中不建议使用。
CREATE TABLE shanghai2(
    id int PRIMARY KEY auto_increment,(auto_increment自动增长)
    name varchar(100)
);
insert into shanghai2 (name) values('aa');

2、域完整性

指数据库表的列(即字段)必须符合某种特定的数据类型或约束。

NOT NULL:不能为空
UNIQUE:必须唯一
CREATE TABLE shanghai3(
    id int PRIMARY KEY,
    name varchar(100) NOT NULL,
    idnum varchar(100) unique
);

3、参照完整性(多表设计)

外键:是主键在另一张表中的表现形式,其内容参照主键(个人理解)

一对多
create table department(
    id int primary key,
    name varchar(100)
);
create table employee(
    id int primary key,
    name varchar(100),
    salary float(8,2),
    dept_id int,
    constraint dept_id_fk【这个是自己取的外键的名称,可随意,只要在该表中唯一即可】 foreign key(dept_id) references department(id)
);

多对多
create table teacher(
    id int primary key,
    name varchar(100),
    salary float(8,2)
);
create table student1(
    id int primary key,
    name varchar(100),
    grade varchar(10)
);
create table teacher_student1(
    t_id int,
    s_id int,
    primary key(t_id,s_id),------------【t_id,s_id组成联合主键,不能出现重复的t_id,s_id组合。】
    constraint t_id_fk foreign key(t_id) references teacher(id),
    constraint s_id_fk foreign key(s_id) references student1(id)
);

一对一
create table human(
    id int primary key,
    name varchar(100)
);
create table idcard(
    id int primary key,
    num varchar(100),
    constraint huanm_id_fk foreign key(id) references human(id)
);

(6) 表的复杂查询

  • 连接查询

    1、连接的基本语法格式:

    from TABLE1 join_type TABLE2 [on (join_condition)][where (query_condition)]
    
    TABLE1与TABLE2为参与连接操作的表
    
        TABLE1:左表
    
        TABLE2:右表
    
        join_type:连接的类型。交叉(cross join)、内连接(inner join)、左外连接(left outer join)、右外连接(right outer join)
    
        on:设置连接条件
    
        where:设置查询条件
    

    2、交叉连接:不带on子句,返回连接表中所有数据行的笛卡尔积

    select * from CUSTOMER cross join ORDERS;
    或者
    select * from CUSTOMER,ORDERS;
    
    select c.name,o.order_number from CUSTOMER c,ORDERS o;
    

    3、内连接:返回连接表中符合连接条件及查询条件的数据行

    隐式内连接:(不使用on关键字和inner join,使用where设置连接条件)
    select * from CUSTOMER c,ORDERS o where c.id=o.customer_id;
    
    显式内连接:(使用on关键字和inner join,在on子句张设置连接条件)
    select * from CUSTOMER c inner join ORDERS o on c.id=o.customer_id;
    
    显式与隐式返回的最终结果是一样的

    4、外连接:分为左外连接、右外连接。与内连接不同的是,外连接不仅返回连接表中符合连接条件及查询条件的数据行,也返回左表(左外连接)或右表(右外连接)中符合查询条件但不符合连接条件的数据行

    左外连接:(返回符合连接条件的所有记录,同时还返回左表中其余的所有记录,在where子句中设置查询条件)
    select * from CUSTOMER c left outer join ORDERS o on c.id=o.customer_id;
    
    右外连接:(返回符合连接条件的所有记录,同时还返回右表中其余的所有记录,在where子句中设置查询条件)
    select * from CUSTOMER c right outer join ORDERS o on c.id=o.customer_id;
  • 子查询(嵌套查询)

    在select子句或者where子句中又嵌入select查询语句

    查询“陈冠希”的客户id 
        select id from customer where name='陈冠希';   ---获得id=1;
    
    查询“陈冠希”的所有订单信息
        查询订单信息:  select * from orders where customer_id=1;
    
    --------
    子查询(整合上面2个步骤): 
        select * from orders where customer_id=(select id from customer where name='陈冠希');
  • 联合查询

    能够合并两条查询语句的查询结果,去掉其中的重复数据行,然后返回没有重复数据行的查询结果。

    关键字:
        UNION,去除重复行
        UNION ALL,不去除重复行
    
    SELECT * FROM orders WHERE price>200 UNION SELECT * FROM orders WHERE customer_id=1;
    
    取两条语句的并集,并去除重复的记录。
  • 限制查询

    select返回所有匹配的行,如果仅仅需要返回第一行或者前几行,使用limit关键字,语法如下:

     limit [位置偏移量,] 行数
    
    显示fruits表查询结果的前4行
    
        select * from fruits limit 4;
    
    显示fruits表中,返回从第5个记录开始,行数长度为3的记录
        select * from fruits limit 4,3;
    
  • 报表查询(合计函数)

    1、合计函数-count:count(列名)返回某一列,行的总数

    统计一个班级共有多少学生?
    
        select count(*) from student;
    
    统计数学成绩大于90的学生有多少个?
    
        select count(*) from student where math>=90;
    
    统计总分大于250的人数有多少?
    
        select count(*) from student where (chinese+math+english)>250;

    2、合计函数-sum:(sum仅对数值起作用)sum函数返回满足where条件的行数值和

    统计一个班级数学总成绩?
    
        select sum(math) from student;
    
    统计一个班级语文、英语、数学各科的总成绩
    
        select sum(chinese),sum(english),sum(math) from student;
    
    统计一个班级语文、英语、数学的成绩总和
    
        select sum(chinese+english+math) from student;
    
    统计一个班级语文成绩平均分
    
        select sum(chinese)/count(*) from student;

    3、合计函数-avg:avg函数返回值满足where条件的一列的平均值

    求一个班级数学平均分?
    
        select avg(math) from student;
    
    求一个班级总分平均分
    
        select avg(chinese+english+math) from student;

    4、分组

    group by指定按照那些字段分组
    
    having对数据进行过滤
    
    having和where均可实现过滤,having在数据分组之后进行过滤,而where在分组之前用来排除记录,where排除的记录不在包括在分组中。并且having可以使用合计函数,having通常跟在group by后。having是分组之后的过滤。
    
    对订单表中商品归类后,显示每一类商品的总价
    
        select product,sum(price) from orders group by product;
    
    查询购买了几类商品,并且每类总价大于100的商品
    
        select product,sum(price) from orders group by product having sum(price)>100;

    5、其他

    时间日期相关的函数
    
    字符串相关的函数
    
    数学相关的函数
    

(7) MySQL的数据库的备份与恢复

数据库的备份:(不会备份数据库名)

shell>mysqldump -u root -psorry test>c:/test.sql --------将test数据库备份到C盘中

恢复数据库:(数据库名必须存在)

方式一:
shell>mysql -u root -psorry testUSE test;

mysql>SOURCE c:/test.sql;

你可能感兴趣的:(JavaWeb)