以前学过数据库,暑假的时候也上过一点关于数据库的课,这些视频看起来不是很难,自己捋捋思路,多练练。
/*
*MySql数据库
*数据库:是一个文件系统,访问数据的时候需要通过标准的sql语句来完成,
*关系型数据库:保存的是实体于实体时间的关系
*常见数据库:oracle:oracle(甲骨文)公司的数据产品,收费的大型数据库
MySQL:开源的,被oracle收购了,小型的数据库
5.x免费,6.x收费了
SQLServer:微软的,收费的中型数据库
DB2:IBM公司收费的大型数据库
SyBASE:PowerDigener软件
*MySQL:
*一个数据库服务器中可以有多个数据库
*一个数据库中有多个表
*每个表有多个字段
*字段跟java中类的属性是对应的
*每一条记录对应的是java的实例对象
*SQL:Structrued Query Language 结构化查询语言
*非过程性语言:不依赖其他语句,写一条语句,就会执行一个结果
*过程性语言:吓一跳语句,需要依赖上一条或者上几条语句
*Oracle开发了PL/SQL,只能在oracle数据库中使用
*SQL Server,Sybase的T-SQL
*SQL语言的分类:
*DDL:数据库定义语言
*用来定义数据库的对象,如数据表,表,视图
**DML:数据操纵语言
*插入数据(insert),修改数据(update),删除数据(delete)
*DCL:数据控制语言
*用于设置用户权限和控制事物语句
**DQL:数据查询语言
*select
*CURD--增删改查
*数据库
*创建数据库:
*语法:create database 数据库名 character set 编码 collate 校对规则;
*校对规则:和编码是成对出现的
*eg:create database mydb1 character set 'utf8' collate 'utf8_bin';
*查看数据库:show database
*查看数据库定义:show create database 数据库名;
*会显示数据库定义的一些信息
*删除数据库:drop database 数据库名
*修改数据库:alter database 数据库名 character set 要修改的编码方式 collate 要修改的校对规则;
*切换数据库:use 数据库名;
*查看当前使用的数据库:select database();
*表
*语法:create table 表名 (
字段1 字段类型(长度) 约束,
字段2 字段类型(长度) 约束
......
);
*注意:
*表名,小括号,后面要有分号,字段之间用逗号隔开
*数据的类型后面有长度,如果是字符串类型,长度必须加
其他类型有默认的长度,必须int 默认长度为11
*数据的类型:
*字符串:VARCHAR 可变长度 长度限定之后,根据你存入的具体数据的长度进行调整,节约空间
CHAR 固定长度 长度限定之后,存入的数据长度远远小于限定的长度,数据库也会用空格补全,把空间占满,所以不常用
**存入的数据都不可以超过限定的长度
*char的效率较高,因为不用去判断长度
*大数据类型:BLOB 存储二进制文件
TEXT 存储字符 两个一般都不用
*数值型:TINYINT
SMALLINT
INT (int)
BIGINT(long)
FLOAT
DOUBLE
*逻辑型:BIT(Boolean)
*日期型:DATE:只包含日期,不包含时间
TIME:只包含时分秒
DATETIME: 包含日期和时分秒,需要手动录入时间
TIMESTAMP:包含日期和时分秒,不传入数据,会默认选择当前系统的事件存入
*eg:
create table employee1(
id int,
name varchar(20),
gender varchar(10),
birthday date(),
enter_date date(),
job varchar(100),
salary double(),
resume text()
);
*查看表:show tables
*查看表信息:desc 表名;
*查看建表语句和字符集:show create table
*删除表:drop table 表名
*约束:单表
*主键:可以唯一标识当条记录的字段,通过primary key声明
*一般为int型的id
*auto_increment:数据库维护主键,自增长,必须为int或者long类型
*默认是唯一,非空的。
*唯一
*值是唯一的,但是允许为空。使用unique声明
*非空
*值不能为空 使用not null
*eg:增加了约束的表
create table employee2(
id int primary key auto_increment,
name varchar(20) not null,
email varchar(10) unique not null,
password varchar(100) not null,
);
*修改表:
*删除:alter table 表名 drop (字段);
*追加:alter table 表名 add 字段 类型(长度) 约束;
*修改:alter table 表名 modify(字段 类型(长度) 约束);
*修改表名:rename table 表名 to 新表名;
*修改列名:change [列] 旧列名 列定义
修改表的字符集:alter table 表名 character 字符集
*数据
*插入
*insert into 表名(字段1,字段2,...) values(值1,值2,...):
*前面和后面要一一对应
*insert into values(值1,值2,...);
*默认插入所有列,没有的都要用占位符,不然会报错
*注意
*数据与字段的类型个个数要相同
*字段的类型和值要对应
*字段的长度要控制
*字符串或者日期类型要使用单引号,int等类型就不用
*解决中文乱码问题:
[client]
port=3306
[mysql]
default-character-set=gbk
修改完成之后需要重新启动服务
*修改:
*语法:update 表名 set 字段=值,字段=值...[条件语句(where...)]
*没有条件语句则默认更新所有的记录
*有where提交,则选择一条记录修改
*删除:delete
*语法:delete from 表名 [where ];
*删除所有数据 truncate 表名
*和delete的区别:
*truncate删除数据,先删除整个表,再创建一个新的表
*delete删除数据,一条一条的删除,
*delete效率没那么高,但是一般都用delete
*查询:
*语法:select * from 表名; 查询表中所有信息
select 字段1,字段2 from 表名; 显示字段1,字段2
select DICTINCT 字段名 from 表名 取出重复的数据
*有一次笔试考过去重复数据
*查询的列可以运算
*在所有的学生分数上加10分
*select name,math+10,english+10,chinese+10 from stu;
*统计每个学生的总分
*select name,math+english+chinese from stu;
*可以使用别名:使用as 别名,且as可省略
*使用别名显示学生的总分
*select name,(math+english+chinese) as sum from stu;
*查询后就显示name和sum两列
*使用where条件进行过滤
*查询孔海海的成绩
*select * from stu where name='孔海海';(正经的编程要用主键)
*常用符号: < > <= >= = <>(不等于)
in(范围内取内容)
like --模糊查询 写法:like ‘张_’(‘张%’) ;
*下划线只能有一个字符,%可以有多个字符
*like ‘%张’ xxx张
like ‘张%’ 张xxx
like ‘%张%’ xxx张xxx
is null --判断是否为null
and --并且
or --或者
not --不成立
查询英语分数在 80-90之间的同学。
select * from stu where english >80 and english <90;
select * from stu where english between 80 and 90;
查询数学分数为18,78,46的同学。(in)
select * from stu where math in(18,78,46);
查询所有姓孔的学生成绩。
select * from stu where name like '孔%';
查询数学分>80,语文分>80的同学。
select * from stu where math >80 or chinese > 80;
*排序 使用order by 升序(ASC,默认)/降序(desc)
*排序语句出现在select语句的末尾
*order by语句只能写一个
按照多个的排序时候,用逗号隔开,但是不要order by语句了
对数学成绩排序后输出。
select name,math from stu order by math;
对总分排序按从高到低的顺序输出
select name,math+english+chinese from stu order by (math+english+chinese) desc;
对学生成绩按照英语进行降序排序,英语相同学员按照数学降序
select * from stu order by english desc,math desc;
对姓孔的学生成绩排序输出
select * from stu where name like '美%' order by english desc;
*聚集函数
*count 获取数量
*统计班上的学生总数
select count(*) from stu;
*统计数学成绩大于90的学生人数
select count(*) from stu where math>90
*统计总分大于150的学生人数
select count(*) from stu where(math+english+chinese)>150
*sum 求和(忽略null)
*统计班上数学的总成绩
select sum(math) from stu
*统计班上各科的总成绩
select sum(math),sum(english),sum(chinese) from stu;
*统计班上所有科目成绩的总和
select sum(math+english+chinese) from stu;
select sum(math)+sum(english)+sum(chinese) from stu;
*如果有学生的成绩存在空值的时候,第一种会出现问题,因为null+number+number为null,
sum函数忽略空值,那么那一行就没有了
*sum函数不能计算字符串
而第二种,就忽略了那一个为null的分数,对总分是没有影响的
*解决:有一个可以判断分数是否为null的函数,如果为null,则把那个分数置为0,0是可以和数字相加的。
select sum(ifnull(math,0)+english+chinese) from stu;
判断math,如果math为空,则math为0
*avg 求平均数
*统计班上语文的平均分
select sum(chinese)/count(*) from stu;
select avg(chinese) from stu;
*max 最大值
*统计班级数学的最高分
*select max(math) from stu;
*min 最小值
*统计班级数学的最低分
*select min(math) from stu;
*group by 分组
*小结:select语句 S-F-W-G-H-O
*selec ... from ... where ... group by ... having ... order by ...;
顺序不能改变
*create table stu
(
id int primary key auto_increment,
name varchar(20),
math int,
english int,
chinese int
);
insert into stu values(null,'孔海海',77,88,99);
设置为自增长后,用null占位,会默认从1开始自增
*多表操作
*外键约束
*作用:保证数据的完整性
*语法:alter table 表名 add foreign key 当前表名(需要设置为外键的字段) references 要映射的的表名(被映射到的表的字段)
*数据库的设计
*一对多 一个班级可以有多个学生,一个部分有多个员工
*建表原则:
*在多方表中添加一个字段,把这个字段作为外键,并且指向一方的主键
两个字段的类型必须一致
*多对多:一个学生可以选择多门课程,每门课可以被多个学生选择
*建表原则:
*创建一个中间表,表中至少两个字段,分别转换成两个一对多
两个字段作为外键分别指向两个多对多关系表的主键
*一对一(了解)
*一个公司对于一个地址。
*这样的情况,是完全可以存放在一张表中的
*但,具体情况具体分析。
*建表原则:
*主键对应:两个表的主键必须一致,将两个表的主键进行关联
*唯一外键对应:为表重新设置外键(不能为空,不能相同)
*多表查询
*笛卡尔积:
*语法:select * from 表A,表B;
*查询返回的结果就是笛卡尔积
表A 表B
aid aname bid bname
a1 aa1 b1 bb1
a2 aa2 b2 bb2
b3 bb3
select * from 表A,表B; 返回的结果就是笛卡尔积。
结果:
a1 aa1 b1 bb1
a1 aa1 b2 bb2
a1 aa1 b3 bb3
a2 aa2 b1 bb1
a2 aa2 b2 bb2
a2 aa2 b3 bb3
*内连接
*普通的内连接
*使用前提:需要有外键
*提交关键字:inner join ... on
select * from dept inner join emp on dept.did = emp.dno;
*隐式的内连接(用得多)
*可以不使用inner join ... on 关键字
select * from dept,emp where dept.did = emp.dno;
*外连接
*用的少是因为一些不符合要求的数据也会查出来,可能会出错。
*左外连接(看左表,查出左表中的全部数据)
*前提:需要外键
*语法:使用关键字 left [outer] join ... on
*右外连接(看右表,查出右表中的全部数据)
*语法:使用关键字 right [outer] join ... on
*子查询
*查询的内容需要另一个查询的结果。
*any
*>any 大于结果的最小值
*all
*>all 大于结果的最大值
*练习:
create table dept(
did int primary key auto_increment,
dname varchar(30)
);
create table emp(
eid int primary key auto_increment,
ename varchar(20),
salaly double,
dno int
);
查看所有人所属的部门名称和员工名称?
select dept.dname,emp.ename from dept,emp where dept.did = emp.dno;
select d.dname,e.ename from dept d,emp e where d.did = e.dno;
统计每个部门的人数(按照部门名称统计,分组group by count)
select d.dname,count(*) from dept d,emp e where d.did = e.dno group by d.dname;
统计部门的平均工资(按部门名称统计 ,分组group by avg)
select d.dname,avg(salaly) from dept d,emp e where d.did = e.dno group by d.dname;
统计部门的平均工资大于公司平均工资的部门(子查询)
* 公司的平均工资
select avg(salaly) from emp;
* 部门的平均工资
select d.dname,avg(e.salaly) as sa from dept d,emp e where d.did = e.dno group by d.dname having sa > (select avg(salaly) from emp);
*/
鸡蛋跟我说,还不是要太赶进度,要加深印象
我也不想啊,秋招在即,只有先存点东西在肚子里,不然没底气面试啊。