1.SQL(Structured Query Language)结构化查询语言,用来和数据库大交道完成和数据库的通信,SQL是一套标准,每个数据库都有自己的个性之处
2.数据库(DataBase),简称DB,通常是一个或一组文件,保存了一些符合特定规则的数据
3.数据库管理系统(DataBase Managerment System),MySQL就是一个数据库管理系统;
4.SQL语言通过使用DBMS操作DB,完成对地城数据的增删查改;
5.MySQL的端口号是3306,在一个网络区域中,端口号是定义计算机地址的标准
6.可以在服务里面手动打开或关闭mySQL服务,也可以用DOS命令,net start MySQL80打开服务或关闭服务;
7.表(table)是一种结构化的文件,可以用来存储特定类型的数据,如:学生信息,课表等,此外表
都有特定的名称,而且不能重复,表的几个概念:列,行,主键;
列叫做字段(column),行叫做表中的记录,
每一个字段都有:字段名称/字段数据类型/字段约束/字段长度
8.字段有规定的数据类型,有规定的名称,有约束,有长度;
9.SQL语言的分类:1)数据查询语言(DQL Data Query Language)代表关键字:select
2)数据操纵语言(DML Data Manipulate Language)代表关键字:insert,delete,uptate
3)数据定义语言(DDL Data Definition Language)代表关键字:create(创建),drop(删除),alter(改动表结构)
4)事物控制语言(TCL Transactional contral Language)代表关键字:commit,rollback
5)数据控制语言(DCL Data Contral Language)代表关键字:grant,revoke
10.MySQL初学基本操作:1)创建数据库:create database 数据库名称;
2)使用数据库:use 数据库名称
3)source 文件
4)show tables;(查看数据库里的所有表格)
4)drop 数据库名(撤销此数据库)
11.小提示:当忘记敲分号而敲了换行符,用\c来终止命令;
12.查看一张表的结构:desc 表名;这里面的desc是description(描述)的缩写;
13.查看当前数据管理系统有多少个数据库:show databases;MySQL自带四个默认的数据库;
14.查看数据库管理系统的版本命令:MySQL --version,如果已经进入了:select version();
15.如果用着用着忘了自己用的哪个数据库:select database();
16.退出数据库管理系统:直接ctrl+c;或者exit,quit
17.从一个数据库中看其他数据库有哪些表:show tables from 数据库名;
18.查看数据库中的表当初是怎么创建的:show create table 表名;
20.从此处开始讲简单查询语句:select name from employee; 表示从employee表中查询name字段;如果要多字段查询,字段名之间用逗号隔开;
查询所有字段,可用*来表示;(但是可读性差,效率低,不建议用)
21.注意:SQL语句不区分大小写,SQL语句以分号结尾;
22.基本步骤:1)查看数据管理系统有哪些数据库 show databases;
2)然后选中你要使用的数据库 use 数据库名;
3)然后查看此数据库中有哪些表 show tables;
4)查看你想要看的表的结构 desc 表名;
5)查询此表的字段 select 字段名 fron 表名;
23.select关键字不会修改底层数据,只是检索数据而已;查询语句:select salary*12 from employee;里面可以写表达式,
此时屏幕显示的字段是salary*10,不好看,可以修改为:select salary*10 as '年薪' from employee;这样显示的就是年薪字段了;
24.标准的SQL语句的字符串都是单引号括起来,没有双引号;
25.下面是条件查询语句:select 字段名 from 表名 where 条件;
select emp sala from yugong where sala>=300 and sala<=500等价于select emp sala from yugong where sala between 300 and sala 500
如果between and 用于字符,则前闭后开;
26.在数据库中NULL表示什么也没有,不是一个值,在条件查询中,不能用=号连接,用is连接
例如:select 字段名 from 表名 where sal is null;表示查询工资不存在的员工;
27.模糊查找:%o% 数据里面含有o的; s% :找出第一个字符为s的是数据 %t:找出最后一个字符为t的数据;
_a%:找出第二个字符为a的数据;_下划线表示任意一个字符;%百分号表示零到任意一个字符;
28.下面是排序语句:select ename,sal from 表名 order by sal desc,ename asc;表示从表中选择ename和sal字段进行排序,且sal进行
降序,当sal中有相同数据时,在将ename字段进行升序;起决定性作用的是前面的语句;
29.下面是数据处理函数:
30.下面讲创建表:创建表的语法:CREATE TABLE tablename
( columnname dataType(length),
columnname dataType(length),
columnname dataType(length),
.........
);
31.关于MySQL数据库中的数据类型?
-VARCHAR (可变长度字符串)
-CHAR (定长字符串)
-INT (整型)
-BIGING (长整型)
-FLOAT (浮点型单精度)
-DOUBLE (浮点型双精度) DOUBLE(7,2)表示有7位有效数字,保留两位小数;
-DATE (日期类型)在实际开发中,为了通用,通常用字符串来表示日期;
-BLOG (Binary Large Object 二进制大对象) 存图片,声音和视频;数据库中存放图片是很常见的,
但是一般不存储大容量的视频,一般是存储它的链接地址;
-CLOG (Character Large Object 字符大对象)存储比较的字符串,如4G+的字符串;
-......
32.VARCHAR和CHAR的区别:例如 name Varchar(10) 输入jack数据,varchar会动态的分配内存,前提是不超过它指定的长度大小;
但是CHAR就是底层数据分配十个空间内存;VARCHAR能够节省硬盘的内存,但是效率低,而CHAR相反;
在实际中,有伸缩性的数据用VARCHAR
33.建表注意事项; 1)建表最好以 t_开头,可读性好;
2)VARCHAR的长度最好是2的倍数,方便存储中文;
34.CREATE TABLE t_student(
no INT(10),
name VARCHAR(32),
sex CHAR(1),
birth DATE,
email VARCHAR(128)
);
35.desc t_student;
mysql> desc t_student;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| no | int(10) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| email | varchar(128) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
36.删除表格:drop table t_student; 这种方式如果数据库中没有这张表,则报错
drop table if exists t_student; 最好采用这种方式,但这种方式是MySQL的特色,其他数据库中没有;
37.向t_student表格中插入数据
37.1 向表格中插入数据必须使用insert语句,它属于DML语句;
37.2 DML语句包括insert delete update(增,删,改);
37.3 Insert语句的语法格式
INSERT INTO tablename(column1,column2,column3....) VALUES(value1,value2,value3,.....);
字段和值必须一一对应,数据类型一致,个数相同;
37.4 向t_student中插入数据
INSERT INTO t_student(no,name,sex,birth,email) VALUES(1,'zhangsan','m','2000-10-11','zhangsan@bjpowernode.com');
INSERT INTO t_student(no,name,sex,birth,email) VALUES(1,'lisi','m','2003-10-11','lisi@bjpowernode.com');
mysql> select *from t_student;
+------+----------+------+------------+--------------------------+
| no | name | sex | birth | email |
+------+----------+------+------------+--------------------------+
| 1 | zhangsan | m | 2000-10-11 | zhangsan@bjpowernode.com |
| 1 | lisi | m | 2003-10-11 | lisi@bjpowernode.com |
+------+----------+------+------------+--------------------------+
38.默认情况下,当一张表被创建时,没有指定约束的话,可以为NULL,并且没有指定任何默认值的话,默认值就是NULL;
每执行一次insert语句,向底层数据添加一行记录,若要修改字段的值,要用update语句;
39.建议不要省去前面的字段,如省去,则默认的是全部写上,省去之后程序不健壮;
40.讨论加中文?
40.1 设置查询结果集为GBK 语句: show variables like '%char%';
set character _set_results ='GBK';
在DOS窗口中插入中文会乱码,因为DOS窗口是GBK编码,而数据库表只接受utf8
解决办法:使用MySQL Front工具插入数据(MySQL的客户端软件,在实际开发中使用较多)
41.创建表是给字段添加默认值:
drop table if exists t_student;
create table t_student(
no int(10),
name varchar(32),
sex char(1) default 'm'
);
insert into t_student(no,name) values(1,'jack');
insert into t_student(no,name) values(2,'lucy');
select * from t_student;
mysql>
+------+------+------+
| no | name | sex |
+------+------+------+
| 1 | jack | m |
| 2 | lucy | m |
+------+------+------+
mysql> desc t_student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| no | int(10) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| sex | char(1) | YES | | m | |
+-------+-------------+------+-----+---------+-------+
42.关于SQL脚本:-该文件是一个普通的文本文档,后缀名为.sql,被称为SQL脚本
-在SQL脚本中有大量的SQL语句,想批量的执行SQL语句,可以将这些SQL语句写入脚本文件中,直接执行source执行脚本
-若项目中期就职,可能数据库表和表中的记录都已准备好,Team leader会直接给程序员一个sql脚本,直接执行脚本,完成底层数据的初始化,然后开发;
43.获取系统当前时间:mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2019-12-26 08:29:57 |
+---------------------+
44.语法格式:CREATE TABLE tablename AS SELECT columnname....FROM tablename;
将查询结果当做一张表创建;
45.将查询结果插入到表中:select *from emp2;
insert into emp2 select *from emp2 where sal=900;
select *from emp2;
46.增/删/改 表结构:DDL语句(不是很重要)-给t_student表格添加一个电话字段
ALTER TABLE t_student ADD VALCGAR(10);
-将t_student表格中的tel字段长度修改为20
ALTER TABLE t_student MODIFY tel VARCHAR(20);
47.增/删/改 表中的数据:DML语句(insert delete update)
mysql> select * from t_student;
+------+------+------+
| no | name | sex |
+------+------+------+
| 1 | jack | m |
| 2 | lucy | m |
+------+------+------+
-将sex字段no为2的改为f:UPDATE tablename SET sex='f' WHERE no=2;
+------+----------+------+
| no | name | sex |
+------+----------+------+
| 1 | jack | m |
| 2 | zhangsan | f |
+------+----------+------+
如果不加条件,则修改全部;
-将学号为2的学生删除:DELETE FROM tablename WHERE no=2;
如果不加条件,则将表中数据全部清空
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| no | int(10) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| sex | char(1) | YES | | m | |
+-------+-------------+------+-----+---------+-------+
48.什么是约束?为什么使用约束?
-约束对应的英语单词为:constraint
-约束实际上就是表中数据的限制条件
-表在设计的时候加入约束的目的是为了保证表中的记录完整和有效
49.约束包括哪些?
-非空约束 not null
-唯一性约束 unique
-主键约束 primary key
-外键约束 foreign key
-检查约束(目前MySQL不支持,Qracle数据库支持)
50.非空约束 not null约束的字段不能为NULL值,必须给定具体的数据;
-创建表,给字段添加非空约束
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128)
);
insert into t_user(id,name,email) values(1,'jack','jack@baidu.com');
mysql> select * from t_user;
+------+------+----------------+
| id | name | email |
+------+------+----------------+
| 1 | jack | jack@baidu.com |
+------+------+----------------+
mysql> insert into t_user(id,email) values(2,'zhangsan@baidu.com');
结果:ERROR 1364 (HY000): Field 'name' doesn't have a default value
如果不给默认值,则为NULL
51.唯一性约束 unique约束的字段具有唯一性
//列级约束
-创建对象,保证邮箱地址唯一
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128) unique
);
insert into t_user(id,name,email) values(1,'jack','jack@baidu.com');
insert into t_user(id,name,email) values(2,'lucy','jack@baidu.com');//邮箱一致
结果:ERROR 1062 (23000): Duplicate entry 'jack@baidu.com' for key 'email'
//表级约束(有语法错误)
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128),
unique(name,email)
);
insert into t_user(id,name,email) values(1,'jack','jack@baidu.com');
insert into t_user(id,name,email) values(2,'lucy','lucy@baidu.com');
insert into t_user(id,name,email) values(2,'lucy','jbj@baidu.com');
//表级约束还可以起名字,以后可以通过这个名字删除约束
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128),
constraint t_user_email_unique unique(email)
);
//查询约束名字 (有语法问题)
-mysql> use information_schema;
-mysql> show tables;
-mysql> desc TABLE_CONSTRAINTS;
+--------------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+-------------+------+-----+---------+-------+
| CONSTRAINT_CATALOG | varchar(64) | YES | | NULL | |
| CONSTRAINT_SCHEMA | varchar(64) | YES | | NULL | |
| CONSTRAINT_NAME | varchar(64) | YES | | NULL | |
| TABLE_SCHEMA | varchar(64) | YES | | NULL | |
| TABLE_NAME | varchar(64) | YES | | NULL | |
| CONSTRAINT_TYPE | varchar(11) | NO | | | |
| ENFORCED | varchar(3) | NO | | | |
+--------------------+-------------+------+-----+---------+-------+
这张表用来存储约束信息
-selecct constraint_name from table_constraint where table_name='t_user';
52.not null和unique可以联合使用,表示不为空且不能重复;
create table t_user(
id int(10),
name varchar(32) not null unique
);
53.主键约束:primary key
-主键约束
-主键字段
-主键值
关系:表中的某个字段添加主键约束之后,该字段被称为主键字段,主键字段中出现的每一个数据都被称为主键值;
54.给某个字段添加主键约束之后,该字段不能重复,而且不能为空;效果和“not null unique”约束相同,但是本质不同,主键约束除了可以做到“not null nuique”
55.一张表应该有主键字段,若没有,表示这张表无效,“主键值”是当前行数据的唯一标识,“主键值”是当前行
数据的身份;即使表中的两行数据完全相同,但是主键值不同,就是两行完全不同的数据;
56.给一个字段添加主键约束,被称为单一主键,给多个字段添加主键约束,被称为复合主键;
无论是单一主键还是复合主键,一张表主键约束只能有一个;
57.主键根据性质分:-自然主键:主键值若是一个自然数,这个自然数和当前表的业务没有任何关系,
-业务主键:主键值和当前表的业务紧密相关,使用较少;
58.单一主键列级约束
drop table if exists t_user;
create table t_user(
id int(10) primary key,
name varchar(32)
);
单一主键表级约束(起名)(有问题)
drop table if exists t_user;
create table t_user(
id int(10),
name varchar(32)
constraint t_user_id_pk primary(id)
);
59.在MySQL数据管理系统中提供了一个自增的数字,专门用来自动生成主键值;
主键值不需要用户维护,也不需要用户提供,自动生成,默认从1开始递增;
drop table if exists t_user;
create table t_user(
id int(10) primary key auto_increment,
name varchar(32)
);
insert into t_user(name) values('jack');
insert into t_user(name) values('jack');
insert into t_user(name) values('jack');
insert into t_user(name) values('jack');
60.外键约束-foreign key
60.1-术语和关系与主键约束雷同,不做讲述,区别在于一张表中可以有多个外键字段
60.2-分析场景:设计数据库表来存储学生和班级信息,一个班级有多个学生,这是一对多的关系;
60.3-解决方案:将学生和班级分开,做成两张表
60.4-学生表 t_student 字段 sno(pk) sname
班级表 t_class 字段 cno(pk) cname
60.5-怎么联系两张表? 在学生表中添加一个字段,但这个字段的值必须来自于班级表,这时候就要给这个字段添加外键约束(foreign key)
60.6-注意:外键值可以为NULL,外键字段去引用一张表的字段时,被医用的字段必须有unique约束;
61.级联更新和级联删除
-添加级联删除和级联添加要在外键约束后面添加
-在删除父表中数据时,级联删除子表中的数据 on delete cascade
*删除外键约束 alter table t_student drop foreign key 外键名
*添加外键约束 alter table t_student add constraint 外键名 foreign key(classno) reference t_class(cno) on delete cascade;
-在更新父表中数据时,级联更新子表中的数据 on update cascade
-谨慎使用,因为级联操作会将数据改变或者删除(数据无价啊!)
62. 在数据库里边,有空值NULL参与运算,结果还为空;
下面讲数据处理函数: 1)select lower(字段名) as 新名字 from tablename; 将查询的结果转为小写
2)select upper(字段名) as 新名字 from tablename; 将查询的结果转为大写
3)select round(rank(),2);将查询到的随机数四舍五入,取两位小数
4)select substr(字段名,1,2) from tablename;
5)select columnName from tablename where trim(' lucy ');去空格键(好像没用,执行不了)
6)select ename from tablename where ename like'%v%';模糊查找(引申,不是函数)
7)select length(columnName) from tablename; 查询表中字段值的长度
8)ifnull(空值处理函数,很重要) select ifnull(name,0) from t_user; 意思为查询name字段的值,碰到有NULL,转为0
63.总结条件查询运算符: 等于: = 不等于:<>或!= 小于、大于、小于等于、大于等于
两值之间:betwee...and... 为空:is null 并且:and 或者:or 包含:in
取非:not 模糊查询:like(支持%和_)
64.关于MySQL中的日期处理:-在每一个数据库处理日期的时候,采用的机制是不一样的,日期处理都有自己的一套机制,所以在实际开发中,表中的字段定义为varchar类型,
-MySQL数据库管理系统中对日期的处理提供两种函数:
1)str_t_date 将字符串(varchar)转化成日期类型(date)
2)date_format
-回顾Java中的日期格式:
yyyy 年
MM 月
dd 日
HH 时
mm 分
ss 秒
sss 毫秒
-Java中将字符串转化成 日期类型:
simpleDtateFormat sdf=new simpleDtateFormat("yyy-MM-dd");
Date date=sdf.parse("1970-9-8");
-MySQL日期格式:
%Y 年
%m 月
%d 日
%H 时
%i 分
%s 秒
-总结:str_to_date函数通常使用在插入操作中。字段时date类型,不接受字符串varchar类型,需要先通过该函数转化。
例如:str_to_date('10-11-1998','%m-%d-%Y')
65.date_format: -该函数的作用是将日期类型转化成具有特定格式的日期字符串varchar
-语法格式:date_format(日期类型数据,'日期格式')
-案例/查询一张表中的日期以月-日-年的格式显示:select date_format(edate,'%d-%m-%Y') as DATE from t_user;
-结论:date_format函数主要使用在查询操作中,客户需要以特定格式展示的时候,使用该函数;
66.下面讲 多行数据处理函数(分组函数):-取得记录数:count -求和:sum -取平均值:avg -取最大:max -取最小:min
-注意:这些函数自动忽略空值/不能直接使用在where关键字后面(还没分组呢!)
67.怎么将查询结果去重? -用distinct关键字 例如:select distinct ColumnName from tablename;
-distinct关键字只能用在最前边修饰 select distinct ColumnName1,ColumnName2 from tablename;表示字段1和字段2联合起来没有相同的
68.分组查询涉及到的两个子句: -group by -having
1)-order by:表示通过字段进行排序
-group by:表示通过字段进行分组
-案例:找出每个工作岗位的最高薪水(先按照工作岗位分组,使用max函数求每组的最高薪水)
代码:select max(sal) from tablename group by job;
-注意:若一条DQL语句有group by子句,那么select关键字后面只能跟参与分组的字段和分组函数;
-案例:计算不同部门中不同工作岗位的最高薪水
代码:select deptno,job,max(sal) from tablename group by deptno,job;意思为这两个字段完全一样时才看成一组;
2)
-having和where功能都是对数据过滤
-where和having后面都是添加条件
-having在group by之后完成过滤,where在group之前完成过滤
-案例:找出每个工作岗位的平均薪水,要求显示平均薪水大于5677;
代码:select job,avg(sal) from tablename group by job having avg(sal)>5677;
-原则:尽量在where中完成过滤,无法过滤的数据,通常是需要先分组再过滤,这时候使用having。效率问题
69.一个完整的DQL语句的总结:select ... from ... where ... group by ... having ... order by ...
-以上关键字顺序不能变,严格遵守
-执行顺序:from 从某张表中检索数据
where 经过某条件进行过滤
group by 然后分组
having 分组之后不满意在过滤
select 查询结果
order by 排序输出
70.下面讲连接查询(跨表查询):-什么是连接查询? 在实际开发中,数据时存储在多张表中,表之间存在关系,我们在检索是通
常需要将多张表联合起来取得有效数据,这种多表查询被称为连接查询或跨表查询
-连接查询根据年代分类:
-SQL92
-SQL99(更新版)
-连接查询根据连接方式分类:
-内连接
*等值连接
*非等值连接
*自连接
-外连接
*左外连接
*右外连接
-全连接(不重要)
-案例:查询每个员工所在的部门名,要求最终显示员工名和所对应的部门名
-select e.ename,d.dname from emp e,edep d;
-在进行多表连接查询时,尽量给表器别名,效率高
若两张表连接查询时,没有任何条件限制,最终的结果总数是两张表记录条数乘积,这种现象为笛卡尔积现象,所以
为避免,要添加条件限制;
代码(内连接中的等值连接):
SQL92 select e.ename,d.dname from emp e,edep d where ename.deptno=dname.deptno;
SQL99 select e.ename,d.dname from emp e join edep d on ename.deptno=dname.deptno;(结构清晰)
-案例:找出每个员工对应的工资等级,要求显示员工名,工资和等级
-SQL99(内连接中的等值连接):select e.name,e.sal,s.grade from emp e join salarygrade on e.sal between s.losal and s.hisal;
-SQL92: select e.name,e.sal,s.grade from emp e,salarygrade where e.sal between s.losal and s.hisal;
-案例:找出每个员工的上级领导,要求显示员工名以及对应的领导名
-分析:所有信息在一张表中,可以把这一张表看成是两张表,自连接
-SQL99:(内连接中的自连接):select a.ename as empname,b.ename as leadername from emp a join emp b on a.mgr=b.empno;
-SQL92:select a.ename as empname,b.ename as leadername from emp a, emp b where a.mgr=b.empno;
71.内连接和外连接? -内连接:A表和B表能够完全匹配的记录查询出来
-外连接:A表和B表能够完全匹配的记录查询出来之外,将其中一张表的记录无条件的完全查询出来,对方表没有匹配的记录,会自动模拟出NULL与之匹配
外连接案例:找出每个员工对应的部门名,要求部门名全部显示
-SQL99代码(外连接中的右外连接/右连接):select e.ename,d.dname from emp e left outer join edep d on ename.deptno=dname.deptno;
-这个代码的意思为将join右边的表的dname值全部显示出来,这里outer可以省略;
-SQL99代码(外连接中的左外连接/左连接):select e.ename,d.dname from emp e left outer join edep d on ename.deptno=dname.deptno;
-这个代码的意思为将join左边的表的dname值全部显示出来,这里outer可以省略;
-inner和outer可以省略,但是加上去可读性高
72.多表连接语法格式:select xxx from a join b on 条件 join c on 条件;
原理:a表与b表连接,a表再与c表连接;
73.子查询:select语句的嵌套
-案例:找出薪水比公司平均薪水高的员工,要求显示员工名和薪水
-解题第一步:找出公司的平均薪水 select avg(sal) from emp;
-解题第二步:找出薪水大于平均薪水的员工信息 select ename,sal from emp where sal>上面计算的值;
-合并:select ename,sal from emp where sal>(select avg(sal) from emp);(实现了select的嵌套,子查询)
74.union:合并集合
例如: select ename,job from emp where job='engineer';
union
select ename,enpno from emp where job='teacher';
-要求字段的数量相同,早oracle中语法更加严格,要求数据类型也要相同;
75.limit:-用来获取一张表中某部分数据
-只有在MySQKL数据库中存在,是MySQKL数据库的特色
-尽量别用,不通用
案例:找出员工表中的前五条记录:select ename from emp limit 5;
-此代码中‘limit 5’中5表示从表中记录下标0开始,取5条,等价于:select ename from emp limit 0,5;
-limit语法:limit 起始下标,长度 若没指定起始下标,默认从0 开始;
76.MySQL中通用的分页SQL语句:
要求每页显示3条记录:第一页:0,3 第二页:3,3 第三页:6,3.....
第pageNo页:(pageNo-1)*pageSize,pageSize
代码:select ename,sal from emp order by sal desc limit (pageNo-1)*pageSize,pageSize;(只限于MySQL)
77.存储引擎:是MySQL数据库管理系统特有的功能,提供给程序员存储数据的方式
-三个常用的存储引擎:Engine: MEMORY Engine: MyISAM Engine: InnoDB
-查看存储引擎的代码:show engnes\G;
-选择合适的存储引擎:MyISAM适合大量的数据读而少量的数据更新
如果查询中包含较多的数据更新操作,用 InnoDB
MEMORY来存储费永久需要的数据
78.事务(很重要) -什么是事务?对应的英语单词:transaction 一个最小的不可再分的工作单元
-通常一个事务对应一个完整的业务,而一个完整的业务需要批量的DML语句共同联合完成
-DML语句才有事务,DML语句的条数和业务逻辑有关系
-关于银行账户转账操作:
t_act(账户表)
actno balance
act-001 50000
act-002 10000
update t_act set balance=40000 where actno='act-001';
update t_act set balance=20000 where actno='act-002';
以上两条代码要求同时成功或同时失败,意思是当第一条语句执行成功后,并不能将底层数据修改,只是在内存中修改,等第二条
语句执行成功后,才修改底层数据
若第二条执行失败,则清空所有历史操作记录(借助事务)
79.事务的四个特性:-原子性 事务是最小的工作单元,不可分割
-一致性 事务要求所有的DML语句同时成功或同时失败
-隔离性 事务之间具有隔离
-持久性 是事务的保证,事务终结的标志
80.关于一些术语:-开启事务:start transaction
-事务结束:end transaction 提交事务:commit transaction 回滚事务:rollback transaction
81.和事务有关的重要SQL语句(TCL):commit:提交 rollback:回滚
82.事务开启的标志和事务结束的标志是什么?
-开启的标志:任何一条DML语句执行
-结束的标志:提交(将历史操作和底层数据同步)或者回滚(清空历史记录)
83.在MySQL数据库管理系统中,事务的提交与演示
-在MySQL中,默认情况下,事务是自动提交的
-关闭自动提交的第一种方式
start transactiom;(手动开启事务) -rollback;(手动回滚事务) - commit;(手动提交事务)
-关闭自动提交的第二种方式
查看变量值:show variables like '%commit%'; 打开自动提交:set autocommit =off;/set session autocommit=off;
84.事务的隔离性: -read uncommitted 读未提交 -read committed 读已提交 -repeatable read 可重复读 -serializable 串行化
-read uncommitted 读未提交:事务A未提交的数据,事务B可以读取到,B读取到的数据叫‘脏数据’/drity read;(最低级别隔离)
- read committed 读已提交:事务A提交的数据,事务B才能读取到(隔离级别高于上),可避免‘脏数据’,会导致不可重复读取
这是oracle默认的隔离级别
-repeatable read 可重复读:事务A提交的数据,事务B读取不到,事务B可重复读取已缓存的数据,达到可重复读取(例如银行月总账),会导致‘幻想读’
这是MySQL默认的隔离级别
-serializable 串行化:数据A在操作数据库表中数据时,事务B只能排队等待,这种隔离级别很少用,级别太高,但是吞吐量太低,用户体验不好
意思是事务A和事务B是排队执行,不是并发;
85.设置事务的隔离级别:1)第一种方式:修改my.ini配置文件
2)使用命令设置事务的隔离级别:命令的格式:set transaction level <isolation-level>;
可选值:-read uncommitted - read committed -repeatable read -serializable
86.隔离级别的作用范围:-全局级:set global transaction level <isolation-level>;
-会话级:set session transaction level <isolation-level>;
-默认(会话级):set session transaction level <isolation-level>;
87.查看隔离级别:-查看当前会话:select @@tx_isolation; select @@session.tx_isolation;(有问题)
-查看全局:select @@global.tx_isolation; (有问题)
88.索引(了解)Index:-作用是提高程序的检索效率
-主键自动添加索引,所以能够通过主键查询尽量用主键查询,效率很高
-索引和表相同,都是一个对象,表是存储在硬盘文件中的,索引是表的一部分
-在Mysql数据库管理系统中,对表的记录进行检索时,包括以下几种检索方式:
1)全表扫描
假如有一张员工表:select * from emp where ename='king';
若没有索引,ename字段全部扫描
2)通过索引检索(提高查询效率)
-什么情况下适合添加索引? -该字段数据量庞大 -该字段很少的DML操作 -该字段经常出现在where条件当中;
-怎么创建索引? create index dept_dname_index on dept(dname);
-怎么删除索引? drop index dept_dname on dept;
89.视图;可以隐藏表的实现细节(在实际开发中客户不希望暴露表的具体数据)
create view myview as select * from emp;
90.DBA命令:(看看就行,不用记,记住常用的增删查改就行)
-修改密码:use mysql; select * from user; update user password= password('qwe') where user='p890';
flush privileges;
-新建用户:create user username identified by'password';
91.数据库设计三范式:1)要求有主键,并且要求每个字段原子性不可再分
2)要求所有非主键字段完全依赖主键,不能产生部分依赖
3)所有非主键字段和主键字段之间不能产生传递依赖
92.下面还有10节事务和30道练习题
93.一张表可以有多个主键,但是只能有一个外键,外键的作用是保持数据的一致性和完整性,它是数据库中的一个完整性约束,不是必须!