1.数据库介绍
1.1什么是数据库?数据库的作用?数据库数据存放的位置
数据库就是一种持久化保存数据的手段(DataBaseDB)
每台电脑自带数据库
数据库不仅能持久化保存数据,保存数据也是有格式化的。
有格式化的数据方便后期的操作(crud 增删改查)
数据库默认的位置:c:/programData/mysql(隐藏文件夹)
1.2什么是数据库管理软件
数据库管理系统(DBMS DataBaseManagment System),通常指的是数据库
管理软件可以通过数据库管理软件操作数据库中的数据(crud)
我们学习的mysql属于数据库管理软件
1.3.数据库中单位的介绍
库 多个表组成了一个库
表 一个或者多个对象行组成
行 一个对象中包含的列的数据
列 具体保存数据的位置
1.4.什么是sql语句
为什么有sql语句:
数据库管理系统没有用户交互界面
sql语句操作数据库管理系统 ,数据库管理系统又操作数据库
SQL:Structure QueryLanguage。(结构化查询语言)
SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。
各数据库厂商都支持ISO的SQL标准。普通话
各数据库厂商在标准的基础上做了自己的扩展。方言
1.5 sql语句的分类
DDL(Data DefinitionLanguage)数据定义语言,用来定义数据库对象:库、表、列等; CREATE、 ALTER、DROP
DML(Data ManipulationLanguage):数据操作语言,用来定义数据库记录(数据);INSERT、 UPDATE、 DELETE
DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
SELECT
DCL (Data ControlLanguage):数据控制语言,用来定义访问权限和安全级别;
1.6.mysql操作入门
打开mysql的后台服务(默认mysql自动打开的)
netstart mysql;
netstop mysql;
1.登录软件
cmd mysql -u用户名 -p 回车 再输入密码
exit;退出登陆
mysql自带命令行
mysql command line cmd 输入密码即可
2.使用sql语句操作数据
2.数据库定义语言DDL
Create alter drop
库 创建库 修改库 删除库
表 创建表 修改表 删除表
行 修改行 删除行
2.1操作数据库
1.创建库 (创建删除修改查看)
create database 数据库名字;
2.查看总数据库中有哪些数据库
show databases;
show create database 数据库名;
3.删除数据库
drop database 数据库名字
4.切换到指定的库
use 数据库名字
5.查看当前使用的数据库
select database();
2.2操作表
1.创建一个表
create table 表名(
列名 类型(长度) 修饰符,
列名 类型(长度) 修饰符
)
表中涉及到的类型要添加修饰符
int:整型 -2 31 2 31 4个字节!
integer 类型 4个字节!
tinyint 整数类型 -128 127 1个字节
samllint 整数类型 -65535/2 65535/2 2个字节
bigint 整数类型 long 大于int类型 8个字节!
unsigned 代表整数类型没有负值! 0-n
double:浮点型,例如double(5,2) 5总位数!2小数位数!
10 aaa char 'aaa '
varchar 'aaa'
char:固定长度字符串类型;char(10) 'abc ' 256
varchar:可变长度字符串类型;varchar(10)'abc' 65535
text:字符串类型; 65535
blob:字节类型;往数据库存图片!
时间戳: 1970 1 1 至今的毫秒值! varchar字段!
date:日期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳类型 yyyy-MM-ddhh:mm:ss 会自动赋值
datetime:日期时间类型 yyyy-MM-ddhh:mm:ss
注意:字符串类型和double类型需要最后追加 (长度)
2.查看表
show tables
3.查看具体的表信息
desc 表名
4.添加一列
alter table 表名 add 列名 类型 修饰符;
5.修改列的类型
alter table 表名 modify 列名 类型;
6.删除一列
alter table 表名 drop 列名;
7.修改列名
alter table 表名 change 原列名 新列名 新类型;
8.修改表名
rename table 旧名字 to 新名字
9.删除表
drop table 表名
3.数据库操作语言DML
insert update delete
1.插入数据
(1)insert into 表名 1.(列名1,列名2...)value/values (值1,值2,....)
INSERT INTO info (NAME,age) VALUE('张无忌',119);
(2)什么都不写(全部列都要插入) insert into 表名 value/values();
INSERT INTO info VALUE('张三分',111,NULL,NULL);
(3)一次插入多条数据
INSERT INTO info VALUES('张三分',111,NULL,NULL),('张三',111,NULL,NULL),('李四',111,NULL,NULL),('tom',111,NULL,NULL);
注意:插入数据的时候,如果指定了列名1情况,value/values的值要跟列名一一对应
如果没有指定列名,要插入全部列,value/values的值要根据创建表的时候列的顺序进行插入,如果没有值写成null
2.删除数据
delete from 表名; //删除所有数据
delete from 表名 where 条件
name = 'xxx' and sex = 'xxx';且
name = 'xxx' or sex = 'xxx';或
or/and
DELETE FROM infoWHERE NAME = '张无忌';
DELETE FROM infoWHERE NAME = '张三分' AND age = 120;
DELETE FROM infoWHERE NAME ='张三分' OR age =119;
DELETE FROM info ;
truncate 表名;
truncate速度会更快,但是慎重使用,不考虑表结构,直接删除表创建新表!但是问题!数据可能发生重复
3.修改表数据 update
(1)update 表名 set 列名 = 新值,列名 = 新值 ; //全部修
UPDATE test1 SET NAME = 'Tom';
(2)where 条件 //按条件修改!
UPDATE test1 SETNAME = '张三分' WHERE id = 1 OR id =3;
(3)在原有的基础上进行修改:
update 表名 set 列名 = 列名(+-*/)新值 where 条件! 4.数据库查询语言DQL
DML数据操作语言:insert delete update;
DML会真正的改变数据!
DQL: 数据库查询语言,查询语言并不会真正的改变数据库数据,但是查询语言通常有着复杂条件,查询语言比较重要!
查询语言的基本语法: select 列名,列名.... from 表名 where 条件 ;
1. 基本查询
select 列名,列名 from 表名; 查询所有
select * from 表名 ;查询表中的所有数据
SELECTsname,age,gender FROM stu;
SELECT * FROM stu;
2.基本条件查询
基本查询 where 列名基本条件 值
基本条件
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;
IN(set);
ISNULL; IS NOT NULL
AND;
OR;
NOT;
nameis not null; js null 基本类型 object
SELECT* FROM stu WHERE gender = 'female' OR age = 50;
3.模糊查询
当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。
通配符:
_ 任意一个字符
%:任意0~n个字符
select * from stu where sname like '%_美_%'
select * from stuwhere sname like '___';
(下)
一.字段控制
1.根据字段去重复 DIstinct
select distinct 字段 from 表名;
SELECT DISTINCT sal FROM emp;
2.查询求和
select *,列名整数可以运算 from 表名;
SELECT * , sal+comm FROM emp;
3.如果为空设置值ifnull:如果为空取第二个值
SELECT * , IFNULL(comm,0)+sal FROM emp;
注意:整数 + null = null
ifnull(1,2)
1.判断得值
2.如果判断值为null 取第二个值!
4.起别名
有写时候查询出来的列名太长,我们希望用简短的列名表示,这个时候就需要起别名!
select列明 别名
select 列名 as 别名
SELECT ename a ,sal l FROM emp;
二。排序
语法 order by 列名 asc(默认升序) desc
1.根据薪水排序
SELECT * FROM emp WHERE sal > 1000 ORDER BY sal DESC;
注意:如果只是排序 可以不添加where ,如果有条件,需要在排序前添加条件。
2.添加候补排序
SELECT * FROM emp ORDER BY salDESC,empno ASC;
第一个条件相同才会触发第二个!以此类推!
select 列的列表 from 表名 where 条件 order by 字段 asc/desc;
月薪的降序 相同时 编号的升序
三。聚合函数
COUNT():统计指定列不为NULL的记录行数;
一共有多少员:SELECT COUNT(*)renshu FROM emp WHERE sal > 2500;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
求工资最大的:SELECT MAX(sal) MAX ,ename FROM emp;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
SELECT SUM(sal) FROM emp;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
SELECT AVG(sal) FROM emp;
四。分组查询
group by 字段
group by 字段 having 条件
where 和 having对比
相同点:
都是条件判断
不同点:
where 分组前的条件
having 分组后以组为单位的条件,通常使用的是聚合函数
where from 表名 where having group by 分组字段 having 条件
select * from 表名 where 条件 group by 字段 having;
select * from 表名 where 条件 order by 字段
例题:
(1)查询每个部门的部门编号和每个部门的工资大于1000员工的和:
SELECTdeptno,SUM(sal) sl FROM emp WHERE sal >2000 GROUP BY deptno;
(2)查询部门薪水和大于10000的部门编号和薪水和
SELECTdeptno,SUM(sal) sl FROM emp GROUP BY deptno HAVING SUM(sal)>9000;
(3)按部门分组 工资大于800的员工的工资求和,要和大于8000的部门, 薪水和倒叙
SELECT deptno ,SUM(sal) sl FROM emp WHERE sal > 800 GROUP BY deptno HAVING SUM(sal) >8000 ORDER BY sl DESC LIMIT 1;
最难的sql语句!
select * from 表名 where 条件 group by 字段 having order by 字段
五。mysql的方言
limit 值1; 从第一个数据开始查询,值1值的是查询数量
例如 limit 5; 从第一个开始查5个
limit 值1,值2; 值1代表着偏移量,值2代表查询的个数
例如 limit7,7 忽略前面7个查8到14
总结分页公式: limit (currentPage-1)*pageSize,pageSize;
currentPage 当前页数 从1开始
pageSize 每页显示的数量
最难的sql语句:
select * from 表名 where like --> group by -->having --->order by --> limit
六。 约束
约束不是必须的 但是是很有必要的;
约束会约束那些语句:DDL DML 跟DQL DCL没关系!
1.实体完整性约束
一行数据代表一个实体
实体的完整性代表一行数据不重复!
(1)primary key 主键修饰
注意:使用主键修饰的列在整个表中不能重复且不能为null
每一行数据其他的列可能重复,但是主键列肯定不重复,每一行其中有一列不重复,所有的行不重复,所有的实体不重复
主键分类:
1.自然主
自身携带的属性,恰巧不为null,且不重复,可以作为主键使用!
2.自定义主键
自身不携带的属性,需要自定义一个无关的列,这一列通常叫id。推荐使用自定义主键
添加主键:primary key
1. create table xx(
id INT primary key,
2.create table xx(
id varchar,
primary key(id)
3.create table xx(
id1 int,
id2 int,
primary key(id1,id2); 联合主键N个变量联合起来作为主键
(2)unique 不重复但是能为null
验证列不能重复
create table xx (
列名类型 unique;
(3)auto_increment
配合整数类型主键使用!
create table xx(
id int primarykey auto_increment;
好处:不用维护主键(插入数据的时候不需要管主键),自动增长, insert into xx (不用写主键) value();
2.域(列)约束
1.数据类型 列类型 int tinyint samllint bigintdouble ...
2.check约束 mysql不支持
sex 男女
3.not null 非空
primary key = unique + not null;
可以插入空字符串 但是不能不管和插入null!
4.默认值约束 default
插入数据时候不维护,自动取默认值
3.参照或者引用完整性约束
很重要,多表查询的一个关键点
两张表可能形成一种主外键的关系,主外键关系就是 某一张表的某一个键(外键)需要参照或者引用另一张表的主键(主键)
为了外键的值必须参照或者引用主键的值,我们需要做给两张表添加一个主外键约束,参照或者引用约束
主外键的两张表,有没有主次之分?
有主次之分,主键的表应该是主表,外键的表是子表。
创建的时候应该先创建主表!再创建子表!!
1.添加主外键约束 在子表中添加
constraint 约束的名字 foreign key (子表的外键) references 主表 (主表的主键);
Constrain约束的意思 references参考的意思
CONSTRAINT n_c_f FOREIGN KEY (sid)REFERENCES newstu(sid) );
2.外部添加
alter table 表名 add constraint约束名字 foreign key (子表的外键) references 主表(主表的主键)
ALTER TABLE scoreADD CONSTRAINT n_c_f FOREIGN KEY(sid)
REFERENCES newstu(sid)
约束总结(三种):
(1)实体约束
primary key
unique
auto_increment
(2)域(列)约束
(3)参照引用 主外键约束
七.表关系
表和表之间的关联
一对多多对一
1. 一对多或者多对一应该区分主表和子表
2.子表中应该存在一个外键
3.最好创建一个主外键约束,参照引用约束
多对多
1.多对多关系的不分主子表
2.创建一个新的中间表
3.中间表应该包含两个外键分别关联两个表的主键
4.在中间表中添加两个主外键约束
一对一
一对一有主子表之分
也存在主外键关系
外键是子表的主键
一对一存在的必要性很低!因为完全可以合表
八.多表查询
横向和纵向
横向比较重要
纵向:
一。合并结果集
union union all
select * from 1
union / union all
select * from 2
union /union all
......
注意: union 去掉重复的结果!
union all 不会去掉重复数据!
union union all 要求列数一致!
合并的列名可以不同但是要求类型相同!
横向:
一。99查询法(方言)
select * from 表1,表2,表3..表nwhere 表1.主键= 表2.外键....
SELECT * FROMscore , student WHERE score.stuid = student.stuid;
99查询法会出现一种问题:问题叫笛卡尔积,多了错误数据,解决笛卡尔积只需判断主外键相等即可
优化:给表起别名
select 别名.列名 as 列的别名,... from 表1 别名,表2 别名....表n 别名 where 别名.xx = 别名.xx
二。连接查询 (官方多表查询)
内连接 [inner] join on
内连接和99查询法效果一模一样
select * from 表1 别名 inner join 表2 别名 on 主 = 外;
SELECT c.score, s.stuname FROM score c JOIN student s ON c.stuid = s.stuid;
外连接
左外连接 left [outter]join on
右外连接 right [outter]join on
外连接是不平等的, left/right是指明哪个表为主的。
SELECT * FROM 表1 别名 LEFT/RIGHT OUTER JOIN 表2别名 ON
主键=外键
自然连接 natural join 自然内连接
natural left join 自然左外连接
natural right join 自然右外连接
[]代表可以省略
外连接表示不平等的,可以通过方向指定主表,主外就算没有外键也会查出null数据。(想王老五99和内连接 没查出王老五 外连接可以有王老五)
如果想使用自然连接,保证主外键命名相同,并且类型相同。
多表查询:
纵向:
union / union all
表可以没有关系 但是列数和类型必须相同
横向:
横向查询都是主外键的关系
1.99查询法
select* from 表1...表n where 主键 = 外键
2.内连接
select * from 表1 inner join 表2 on 主键 = 外键
3.外连接
select * from 表1 left/right outer join 表2 on 主键 = 外键
例如三张表查询
99查询法:
SELECT s.stuname,c.score,u.cname FROM score c , student s ,course uWHERE c.stuid = s.stuid AND c.courseid = u.courseid;
内连接
SELECT * FROM score c JOIN student s ON c.stuid = s.stuid
JOIN course u ON u.courseid =c.courseid;
外连接
SELECT * FROM score c RIGHT JOIN student s ON c.stuid =s.stuid
LEFT JOIN course u ON c.courseid = u.courseid;
多表查询总结:
1.多表查询的主外键相等 表数-1
2.如果内连接或者外连接 两个表先连接,得出一个新的表再去连接
3.如果使用的是外连接 指定了方向,那么后面的方向应该一致;
最难:
SELECT * FROM student s LEFT OUTER JOIN score c ON s.stuid = c.stuid
LEFT JOIN course u ON c.courseid = u.courseid LEFT JOIN
teacher t ON u.tid = t.tid ...........
where like --> group by 列名 having 条件 order by 类名 asc/desc limit1,2;
九.了解MySQL数据库的Innodb和MyIASM两种引擎
Innodb引擎
Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级别这篇文章。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。
MyIASM引擎
MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。
两种引擎的选择
大尺寸的数据集趋向于选择InnoDB引擎,因为它支持事务处理和故障恢复。数据库的大小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。主键查询在InnoDB引擎下也会相当快,不过需要注意的是如果主键太长也会导致性能问题。大批的INSERT语句(在每个INSERT语句中写入多行,批量插入)在MyISAM下会快一些,但是UPDATE语句在InnoDB下则会更快一些,尤其是在并发量大的时候。