笔记--MySQL数据库

以前学过数据库,暑假的时候也上过一点关于数据库的课,这些视频看起来不是很难,自己捋捋思路,多练练。
/*
*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);

*/
鸡蛋跟我说,还不是要太赶进度,要加深印象
我也不想啊,秋招在即,只有先存点东西在肚子里,不然没底气面试啊。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值