数据库:英文为Database, 简称:DB
数据库的分类:
数据库根据储存采用的数据结构的不同可以分为许多种 , 层次式数据库 , 网络式数据库.
目前占市场主流的是关系型数据库 . 还有非关系型( NoSQL )数据库 ( 键值对数据库 , 例如 : MongDB , Redis )等其他类型的数据库.
底层是以二维表结构
SQL Server 微软提供,适用于中大型项目
Oracle 甲骨文公司 , 适用于大型或超大型项目.
DB2 IBM,适用于中大型项目(主要用于银行/电信等企业)
MySQL 瑞典MySQLAB( 现在属于甲骨文公司 )( 免费开源, 适用于中小型项目(可集群(用于大型项目)) , 性能也还ok )
SQL 迷你数据库,嵌入式设备中
…
数据库服务器:就是sql服务器的软件,将软件安装在服务器
structured query language:结构化的查询语言
SQL是操作所有关系型数据库的通用的语言
SQL语言的分类:
查看所有数据库:show databases;
创建一个数据库:create database 库名 charset 编码;
进入某个数据库:use + 库名;
查看已进入的库:select database();
查看当前数据库中所有表:show tables;
删除mydb1库:drop database 库名;(删除不存在的库会报错)库名前加上 if exists 就不会报错(表示库存在就删除,不存在就不管)
创建mydb1库,指定编码为 utf-8 :create database 库名 charset 编码;(utf-8 写成 utf8 因为MySQL不识别-)
查看表结构:desc 表名;
查看建库时的语句:show create database 库名;
查看建表时的语句:show create table 表名;
进入库,删除某表:drop table if exists 表名;(先进入库再才能删除)
创建表:
建表的语法:
create table 表名(
列名 数据类型,
列名 数据类型,
…
);
例如:
create table stu(
id int,
name varchar(长度),
gender varchar(),
birthday date,
score double
);
1.数值类型
在MySQL中也有对应的数据类型,其中常用的数值类型就两种:
int:对应 Java 中的 int 类型
double:对应 Java 中的 double 类型
2.字符串类型
char 类型 :定长字符串(最大长度为255个字节)
name char(10),其中的10是最大长度,即最多能存10个字符,**当存入的数据长度小于10时,用空格填充。造成空间浪费。**但是 char 类型在存储数据时,效率比 varchar 高;
varchar 类型:不定长字符串(最大长度为65535个字节)
name varchar(10),其中的10是最大长度,即最多能存10个字符,当存入的数据长度小于10时,剩余空间留个别的数据使用,不会有空间浪费。但是效率比 char 低;
text 类型:长文本类型,大文本类型(最多能存65535个字节)
3.日期类型
date:格式,年月日
time:格式,时分秒
datetime:格式,年月日时分秒
timestamp:时间戳,格式,年月日时分秒
timestamp和datetime的区别:
相同点:都是日期类型,格式都是年月日时分秒
不同点:
(1)datetime存储的只有年月日时分秒
(2)timestamp存储的是 1970年1月1日到当前日期的时间毫秒值。但是显示的时候还是年月日时分秒。
(3)datetime类型的列,如果插入数据时不给值,默认就是null。
timestamp 类型的列,如果在插入数据时不给值,可以设置为默认值为当前时间。
如果在修改数据时不给值,可以设置修改后的值为当前时间()
(4)datetime的时间范围是 0000~9999年
timestamp的时间范围是 1970年~2038年
修改表:
alter table 表名 rename to 新表名;
-- 查看表的字符集,即为查看表的创建语句
show create table 表名;
-- 修表的改字符集
alter table 表名 character set 字符集;
修改列:
alter table 表名 add 列名 数据类型;
alter table 表名 modify 列名 数据类型;
alter table 表名 change 旧列名 新列名 新数据类型
alter table 表名 drop 列名;
– 插入记录:
第一种:
insert into 表名(第一列列名1,第二列列名2,...) values(值1,值2,....);
insert into stu(id ,name,gender,...) values(1,‘啊辉’,‘男’,...);
-- (值列对应,字符串或时间用单引号)
第二种:
insert into stu values (2,‘阿辉’,‘男’,...);
-- (给表中所有列赋值时,可以不用写列)
select * from 表名; 其中 * 表示全部列, from:指定某一个表
– 修改语法:update 表名 set 列=值,列=值,列=值…(还可以加 where 条件,where表示)
修改一整列的数值:update stu set score = score + 10;(对score这列值全部加10,MySQL不支持 += )
修改符合条件的数值:update stu set score = 88 where name=‘giao’;(只对符合 where 要求的有用)
– 删除记录语法:delete from 表名 [ where 条件];
例如:delete from 表名;(删除全部,删除记录本身,对其它的没有影响,例如:自增的叠加还是继续往后)
delete from 表名 where 条件;(删除符合条件的一整行)
另外的删除方法:truncate 表名;(这种删除会摧毁表,再重新创建,重置一切)
例如查询其中的几个列:查询表 emp 中的 姓名,工资,奖金(如下:)
select name,sal,bonus
from emp;
例如查询所有信息:查询表中的所有信息(如下:)
select * from emp;(效率不如指定列名)
例如去掉重复记录:distinct 用于剔除重复的记录
select distinct name,sal,bonus
from emp;
例如:
select 列名,列名… from emp where 条件;
例题:
计算薪水加奖金大于5000,显示姓名和总薪水
解法:1. select name,薪水+奖金 from emp where 薪水+奖金>5000;(这样查询会出现一些问题,奖金如果为空(null),薪水+奖金就会为 null,出现运行不准确的情况!)
2. select name,薪水+ifnull(奖金,0) from emp where 薪水+ifnull(奖金,0)>5000;(把需要判断的值加上函数 ifnull(列,值),判断该列是否为null,为 null 则用 0 替换!)
3. select name 姓名,薪水+ifnull(奖金,0) 总薪水 from emp where 薪水+ifnull(奖金,0)>5000;(为列名加上备注,直接在列名后面加上空格和备注即可! where 中不能使用列的备注)
where sal >=3000 and sal <= 4000; 等价于 where sal between 3000 and 4000; (条件: 3000=< sal =<4000)
where sal = 1400 or sal = 1600 or sal = 1800; 等价于 where sal in(1400,1600,1800);(条件:sal等于1400或1600或1800)
where not(sal = 1400 or sal = 1600 or sal = 1800);(取反)
where !(sal = 1400 or sal = 1600 or sal = 1800); (取反)
where sal not in(1400,1600,1800); (取反)