数据库管理阶段的发展历程:
人工管理阶段、文件管理阶段、数据库管理系统阶段
层次模型:类似文件菜单,一级下面还有很多子文件夹(类似于树状)
网状模型:
关系模型:二维表的形式
关系:实体之间的关系
一对一、一对多、多对多、多对一
索引:提高查询效率,(但是也会增加数据库的空间,相当于以空间换时间)
SQL语句分类:
DDL(Data Definition Language):数据定义语言,定义对数据库对象(库、表、列、索引、约束)的操作。
CREATE、DROP、ALTER、RENAME、 TRUNCATE等
DML(Data Manipulation Language): 数据操作语言,定义对数据库记录的操作。
INSERT、DELETE、UPDATE、SELECT等
DCL(Data Control Language): 数据控制语言,定义对数据库、表、字段、用户的访问权限和安全级别。
GRANT、REVOKE等
Transaction Control:事务控制
COMMIT、ROLLBACK、SAVEPOINT等
--------------------------------------------------
DDL:对表结构的操作,增删改查
一个实体对应一个Java bean,一个实体就是一张表。
cmd中的命令:
desc 表名 ---用于查看表的字段信息,字段类型
show create table 表名 -----
列类型:包含数值类型、日期类型、字符串
常用类型
数值类型:
tinyint 1个字节
smallint 2个字节
bool -----tinyint的同义词
日期类型:
date
datetime
字符串:
text 长文本
varchar
----------------------------------------------------------
修改列类型
ALTER TABLE 表名 MODIFY 列名 列类型;
增加列
ALTER TABLE 表名 ADD 列名 列类型;
删除列
ALTER TABLE 表名 DROP 列名;
列改名
ALTER TABLE 表名 CHANGE 旧列名 新列名 列类型;
更改表名
ALTER TABLE 表名 RENAME 新表名;
RENAME TABLE 表名 TO 新表名;
删除表:
drop table 表名
约束:
NOT NULL非空
UNIQUE Key唯一键
PRIMARY KEY主键
FOREIGN KEY外键
CHECK检查
----------------------------
null值
所有数据类型的值都可以是NULL。
空字符串不等于NULL。
0也不等于NULL。
唯一约束:
唯一性约束条件确保所在的字段或者字段组合不出现重复值
唯一性约束条件的字段允许出现多个NULL
同一张表内可建多个唯一约束
唯一约束可由多列组合而成
建唯一约束时MySQL会为之建立对应的索引。
如果不给唯一约束起名,该唯一约束默认与列名相同。
主键约束:
主键从功能上看相当于非空且唯一(因为:主键要用来唯一标识一个字段,如果主键为空或者不唯一,不符合逻辑)
一个表中只允许一个主键
主键是表中唯一确定一行数据的字段
主键字段可以是单字段或者是多字段的组合
当建立主键约束时,MySQL为主键创建对应的索引
外键约束
格式:FOREIGN KEY (外键列名) REFERENCES 另外一个表的表名(参照列)
外键包含非空约束,但不包含唯一约束
为什么外键最好是另一个表的主键?
例子:
CREATE TABLE tb_dept(
dept_id INT PRIMARY KEY,
NAME VARCHAR(18),
description VARCHAR(255)
);
CREATE TABLE tb_employee(
employee_id INT PRIMARY KEY,
NAME VARCHAR(18),
gender VARCHAR(10),
dept_id INT REFERENCES tb_dept(dept_id),
address VARCHAR(255)
);
注意:有一些框架固定要用id作为主键,(如)否则会找不到主键
-----------------------------------------------------------------------------------------
作业中遇到的一些问题总结:
作业06
第5题:
DB2是关系型数据库,IMS是层次型数据库,都是由IBM公司开发的
第3题:
Mysql中自带的前端工具是workbeach
-----------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
数据库操作语言:DML
单表操作:
主要是查询和修改(增加insert、修改update、删除delete都是修改)
插入:
insert into my_student(id,name,age,gender) values (1,'cxk',24,m); //单条数据插入
insert into my_student values (1,'cxk',24,m),(2,'xxk',24,m),(3,'cxc',24,f);//批量插入
查询:
select *from student; //select* from 表名; 查询表中所有字段
select 列名1,列名2,列名3 from 表名; //查询指定列
注意:insert, update, delete 之间不能嵌套,也不能和select嵌套
delete from 表名; //删除的是表的数据,表还在
drop table 表名;//删除的是整个表
查l询为空:用 is null 而不是= null
模糊查询:like '张_' //查询姓张并且名字为两个字符的,_代表占一个字符
ike '张%' //查询所有姓张的,不管‘张’后面还有几个字符
排序:
order by
注意:null在排序中时是最小的
select * from my_student limit 2 查询前两条
select * from my_student limit 0,2 ;//查询从0开始的两条
select* from my_student limit 2,2 //分页
--------------------------------------------------
多表查询:
外连接:
左外连接(左连接):A 表 left (outer) join B表 on ...
右外连接(右连接): A表 right (outer) join B表 on...
内连接:
A表 inner join B表 on ...
自然连接:
交叉连接:交叉连接是不带WHERE 子句的多表查询,它返回被连接的两个表所有数据行的笛卡尔积
全连接:
MySQL不支持全连接,所以只能采取关键字UNION来联合左、右连接的方法。
SELECT * FROM class a RIGHT OUTER JOIN t_studentnew b ON a.class_id = b.s_id UNION SELECT * FROM class a LEFT OUTER JOIN t_studentnew b ON a.class_id = b.s_id;
子查询(嵌套查询):
SELECT class.class_name FROM class WHERE class.class_id IN(SELECT student.student_class_id FROM student WHERE student_name LIKE "%强");
聚合函数:
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某个列之和
分组查询:
group by
group_concat() //查看对哪些数据进行了分组
group by + group_concat() :
group_concat(字段名)可以作为一个输出字段来使用,
分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合
SELECT GROUP_CONCAT(student_name),student_class_id from student GROUP BY student_class_id;
group by + 聚合函数:
SELECT student_class_id,AVG(student_math_score)AS avg_score FROM student GROUP BY student_class_id;
group by + having
having 条件表达式:用来分组查询后指定一些条件来输出查询结果
having作用和where一样,但having只能用于group by
SELECT student_class_id,AVG(student_math_score)AS avg_score FROM student GROUP BY student_class_id HAVING student_class_id>1;
--------------------------------------------------------------------------------
MySQL系统函数
ABS(x) 返回x的绝对值
RAND() 0-1的随机数
ROUND(x,y) 返回参数x的四舍五入的有y位小数的值
MOD(x,y) 返回x/y的模(余数)
PI() 返回pi的值(圆周率)
SQRT(x) 返回一个数的平方根
GREATEST(x1,x2,...,xn) 返回集合中最大的值
LEAST(x1,x2,...,xn) 返回集合中最小的值
ASCII(str) 返回字符串的ASCII码
CONCAT(str1,str2,...) 将给定字符串拼接
LENGTH(str) 返回给定字符串长度
LEFT(str,len) 返回给定字符串最左len个字符
RIGHT(str,len) 返回给定字符串最右len个字符
SUBSTRING(str,pos) 字符串str的起始位置pos返回一个子串
REVERSE(str) 将str顺序反转
LOWER(str) Str转为小写
UPPER(str) Str转为大写
CURTIME() 功能: HH:MM:SS或HHMMSS返回当前时间值
NOW() 功能:YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS
CURDATE() 功能:YYYY-MM-DD’或YYYYMMDD
WEEKDAY(date) 功能:返回日期的星期索引(0开始)
DAYOFYEAR(date) 功能: 返回给定日期的天数
注意:
对哪个字段进行限制,having 后面跟的是分组的字段
MySQL中字符串可以用单引号,也可以用双引号,SQLserver中字符串只能用单引号,
MySQL中限制行数查询用limit,SQLserver中查看前几条记录用top,
MySQL可以用limit分页