一、数据库的发展史
(1)手工管理:藏书阁,图书馆。
优点:分类管理,直观性强
缺点:信息流动慢,不方便
(2)文件管理:计算机文件系统,图书管理系统
优点:分类管理,层次分明
缺点: 查找不方便
(3)数据库管理:
优点:存取数据非常方便.
缺点:有数据的安全隐患。
二、数据库概念
数据库(DataBase):简称DB,
按照某一特定数据结构来组织,
存储数据的仓库。
数据库管理系统(DataBase Management System):
简称DBMS.
是为了建立,操作和维护数据库,
而设计的一个程序。 介于用户和数据库之间。
PS: 使用SQL语言,通过DBMS来管理DB。
三、关系型数据库
(1) 关系: 指的就是表,或者表与表之间。
关系模型:就是表的行与列。
比如: 教师(教师编号,姓名,年龄,性别,科目)。
(2)常用的关系型数据库:
大型: Oracle--甲骨文(Oracle)公司的产品
SqlServer--Microsoft旗下的产品
DB2--IBM旗下的产品
小型: Access--MicroSoft旗下的产品
Mysql--目前是甲骨文旗下的产品
四、Mysql
1)Mysql是一个关系型数据库,最开始是瑞典的MysqlAB公司的产品,
后来被Sun公司收购,在2009年4月20号Sun公司被Oracle收购.
2)Mysql特点
--mysql是开源的,不会产生额外的费用。
--mysql支持大型数据库,比如可以管理上千万条记录的数据库。
--mysql支持多操作系统,支持多语言连接:C,C++,java,PHP....
--mysql成本比较小( 相比较Oracle和DB2 )
3)Mysql的安装(略)
服务端的安装:DB和DBMS的安装
客户端的安装:自带的客户端
第三方客户端
4)Mysql的连接和使用
打开mysql图形界面,输入密码即可打开mysql
1)查询数据库
show databases;
2)先选择数据库
use mysql;
3)书写SQL
4)查询数据库中的表
show tables;
五、表(Table)
表是关系型数据库的基本存储结构。
1)表是二维数据结构,有行和列
2)行(Row)是横排数据,也叫记录(Record)
3)列(Column)是竖排数据,也叫字段(Field)
4)行与列的交叉点是 字段值
5)表与表之间也存在关系
六、数据库支持的数据类型
MySQL支持多种类型,大致可以分为三类:
1)数值
2)日期/时间
3)字符串(字符)类型。
*数值类型:
类型 大小 范围(有符号) 用途
TINYINT 1 字节 (-128,127) 小整数值
SMALLINT 2 字节 (-32 768,32 767) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) 极大整数值
FLOAT 4 字节 单精度 浮点数值
DOUBLE 8 字节 双精度 浮点数值
DECIMAL 对DECIMAL(M,D): 如果M>D,为M+2; 否则为D+2
依赖于M和D的值
小数值
*日期和时间类型:
类型 大小(字节) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 -23:59:59/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 8 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
*字符串类型:
类型 大小 用途
CHAR 0-255字节 定长字符串 char(10)
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65535字节 二进制形式的长文本数据
TEXT 0-65535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LOGNGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据
七、结构化查询语言(SQL)
结构化查询语言(Structured Query Language),简称SQL,
是数据库的标准查询语言。可以通过DBMS对数据库进行定义数据、
操纵数据、查询数据、数据控制等
SQL可以分为:
1)数据定义语言(DDL):Data definition Language
*创建表create
create table tableName(
字段1 类型,
字段2 类型,
字段3 类型
)
*删除表drop
drop table tableName
*修改表alter
a)向表最后追加新字段
--格式:alter table tableName add (colName Type);
b)删除表字段语句
--格式:alter table tableName drop colName;
c)修改表字段类型
--格式:alter table tableName modify colName newType;
d)--修改表字段名称
--格式:alter table tableName change oldColName newColName newType;
e)修改表名
--格式:alter table oldName rename newName;
*查看表结构
--格式:desc 表名;
*清空表truncate,彻底清空,无法找回。
只删除表中的记录,保留表的结构
--格式:truncate tableName;
2)数据操纵语言(DML):Data Manipulation Language
*插入数据insert
--格式1:insert into tableName(
字段1,字段2...,字段n) values (值1,值2...,值n)
--格式2:insert into tableName values(值1,值2,..值n);
注:格式2要求插入的值必须和建表时字段的顺序相对应,
否则容易出现错误
*删除数据delete
--格式:delete from tableName [where eid=2 and(or) ename='小赵'];
*修改数据update
--格式:update tableName set 字段1=值1,字段2=值2
[where eid > 2];
*创建数据库并指定字符集
create database jsd1707 default character set utf8
3)TCL:事务控制语言 savepoint,commit,rollback
4)DQL:数据查询语言 select
5)DCL:数据库控制语言 grant,revoke
*数据类型的学习:
1.数值类型: tinyint,smallint,mediumint,int/integer,bigint,
float,double,decimal
1) tinyint : 1字节大小, 范围-128~127
2) smallint: 2字节大小, 范围-32768~32767
3) int/integer: 常用数值类型,4字节, 范围 -21亿~21亿左右
4) bigint: 大整数类型, 范围与java语言的long的范围类似。 5) float: 单精度类型,占4字节。
--不规定长度时:默认进行四舍五入,保留0或1位小数,
--规定长度时:--float(m,n):m表示数据的有效位数,n表示小数点后保留的位数。
整数位:最大值为m-n;
--float(m,0)与float(m):指的是整数位的最大位数。
6) double: 双精度类型,占8字节
--规定长度时: double(m,n):有效位数是m,小数点后保留n位。
整数位:m-n
7) decimal: 与float和double的用法一样,decimal(m,n)
2.日期类型:date,time,datetime,timestamp,year
1) date: 日期类型,默认格式:yyyy-mm-dd 范围 1000-1-1/9999-12-31
2) time : 时间类型,默认格式:HH:mm:ss
--范围1:不写年月日时,-838:59:59/838:59:59
--范围2: 写年月日时, -23:59:59/23:59:59
3) datetime: 默认格式: yyyy-mm-dd hh:mm:ss
--范围: 1000:1:1 -23:59:59/9999:12:31 23:59:59;
4) timestamp: 时间戳类型,
--范围:1970-01-01 00:00:00/2038-1-18 23:59:59
5) year:年,默认格式: yyyy 范围 1901~2155;
3.字符串类型:char, varchar, tinyblob, tinytext, blob, text,
mediumblob, mediumtext, longblob, longtext
1) char:定长字符串类型,范围0~255个字节
char(10):插入数据时,最多插入10个字节,
如果插入的字节数不足10字节时,也占内存10字节大小。
定义数据类型长度时,最长为255
2) varchar:可变字符串类型,范围0~255。
规定长度时:最大值为255个字节
varchar(10):表示最多存储10个字节,
如果不满足10个字节,在内存中按照实际字节数占用。
3) blob:一种字符串类型,存储数据时存储的是字符对应的字节码。字节范围:0~65535
4) text:一种字符串类型 字节范围:0~65535
5) longblob:极大字符串类型,存储的是字符对应的字节码。
6) longtext: 极大字符串类型,存储的是字符。
上述两种类型的字节范围:0~Java语言的int的最大值的2倍+1;
--虚表dual:数据库为程序员提供的一个没有字段的表。
作用:一般用来当作一个查询语句的基表。
--练习:计算1+2+2*3.
select 1+2+2*3 from dual;
select 2*3+2/3 from date_t01;
--mysql数据库的特点:在运算时,可以不基于表操作。
select 1+2;
===========================================================================================
*mysql常用函数的学习
一、常用的字符串函数:
1.ascii(str):返回指定字符串的第一个字符的ascii码
字符串为空字符串时,返回0
字符串为null时,返回null
2.ord(str):如果字符串的第一个字符是单字符时,与函数ascii(str)一样;
如果不是单字节,如 UTF8的'中',是三个字节,
返回值为: 第一个字节*256+第二个字节*256+第三个字节。
3.conv(n,from_base,to_base): 将from_base进制中的数n转成
to_base进制下的表示方式
16进制中的字符a转成2进制来表示
4.bin(n),oct(n),hex(n): 将数值n转成对应的二进制,八进制,十六进制
5.char(n...): 返回多个ascii码组成的字符串。
6.concat(str1,str2,...): 将多个字符串拼接成一个字符串
如果有一个参数为null,返回的就是null。
7.length(str)/octet_length(str):
返回的是默认字符集下的字符串的所有字节数。
都是返回字符串的字符长度。
8.locate(substr,str)/position(substr in str)/instr(str,substr):
返回substr在str第一次出现的位置;
如果没有,返回0;
9.locate(substr,str,pos):
从str的下标pos开始向后查找,substr第一次出现的位置,
找不到返回0
10.lpad(str,len,padstr)/rpad(str,len,padstr):
在字符串str的左边/右边添加padstr,添加后的总长度为len。
可称之为左补全/右补全函数
右对齐/左对齐函数
11.left(str,len)/right(str,len):
返回字符串左端/右端的len个字符。
12.substring(str,pos)/substring(str from pos)
截取str的子串,从pos下标开始截取到最后。
13.substring(str,pos,len)/substring(str from pos for len)/mid(str,pos,len)
对str进行截取操作,从pos下标开始,截取len长度个。
--小贴士:数据库的字符串的下标从1开始。
14.substring_index(str,delim,count):
截取str,截取到第count个分隔符delim
15.ltrim(str)/rtrim(str)
删除str的左端/右端的空格
16.trim([[both | leading | trailing] [remstr] from] str);
删除str里两端的remstr
左右两端由 both|leading|trailing来控制
默认情况:both
17.replace(str,from_str,to_str):
使用to_str替换掉str中的from_str;
18.insert(str,pos,len,newstr):
使用newstr替换str中的一部分,这部分从pos下标开始,len个。
19.lcase(str)/lower(str)/ucase(str)/upper(str):
将字符串中的英文字母全变成大/小写。
二、mysql函数之数学函数
--1.abs(n):
取参数n的绝对值
--2.sign(n):
判断参数的符号,
如果是正数,返回1,
如果是负数,返回-1,
如果是0,返回0;
--3.mod(m,n):
返回m对n的取余的结果。同(m%n);
结果的正负只与被除数m的正负有关
--4. floor(n)/ceiling(n):
floor(n) 返回小于等于n的最大整数,
ceiling(n) 返回大于等于n的最小整数。
--5.round(n,d):
对n进行四舍五入,保留d位小数。
--6.pow(x,y)/power(x,y) :
计算x的y次方
--7.sqrt(n): 对n进行开平方。
--8、rand():
返回0~1.0的一个随机小数。
--9.truncate(n,d) :
对数值n进行截断。
d为正数时,保留小数点后d位。
d为0时,保留整数位。
d为负数时,保留小数点前d位。
--10.least(n.....)/greatest(n....):
统计多个参数中的最小值/最大值。
参数类型可以不一致,但是必须能互相自动转换
三、mysql函数之日期时间函数
--1.dayofweek(date):
查看指定日期date是所在周的第几天,返回的是数字
1--周日.......
7--周六
--2.weekday(date):
返回指定date是所在周的周几,返回的也是数字
0--周一........
6--周日
--3.dayname(date):
返回指定日期是周几,
注意:返回的是英文描述
--4.dayofmonth(date)/dayofyear(date):
返回指定日期是当月/当年的第几天
--5.monthname(date):
返回指定日期所在月的英文描述。
--6.week(date,first):
返回指定日期是当年的第几周。
first可以取值0或1.
0表示周日是一周的第一天,
1表示周一是一周的第一天。
--7.year(date),month(date),day(date),hour(time),minute(time),second(time):
返回指定日期或时间的时间分量。
--8.extract(part from date):
截取指定日期的一部分,
part: year,month,day,hour,minute,second;
--9.date_format(date,format) :
将指定日期date,按照自定义格式,转成字符串显示。
--格式: 年: %y
月: %M或%m
日: %d
时: %i
分: %s
秒: %H
--10.curdate()/curtime():
获取当前系统的日期/时间
--11.now()/sysdate()/current_timestamp():
获取当前系统时间:都包含年月日时分秒。
--12.sec_to_time(n):
将指定数值n转成时间格式
--13.time_to_sec(time):
将指定时间转成秒的总数。
select time_to_sec('13:56:56');
select time_to_sec(now());--只转时间部分。
======================================================
MySQL提供了如下几个处理 null 的函数:
ifnull (expr1,expr2):如果 expr1 为 null,则返回 expr2,否则返回 expr1 nullif (expr1,expr2):如果 expr1 和 expr2 相等,则返回 null ,否则返回 expr1 if(expr1,expr2,expr3):有点类似于? : 三目运算符,如果expr1为true,不等于0,且不等于null,则返回expr2 否则返回 expr3 isnull(expr1):判断expr1是否为null,如果为null则返回true,否则返回false
case 函数:
(1)case value when compare_value1 then result1 when compare_value2 then result2 ...... else result end
select student_name , case java_teacher when 1 then 'java老师' when 2 then 'c++老师' else '其他老师' end from studednt_table;
(2)case when condition1 then results1 when condition2 then results2 else result end
select student_name , case when student_id <= 3 then '初级班' when student_id <= 6 then '中级班' else '高级班' end from student_table;