MySQL数据库
一、数据库
数据的存储仓库
1.概述
1.1 优点
- 可存储大量数据
- 方便检索
- 保持数据的一致性和完整性
- 安全、可共享
- 通过组合查询产生新的数据
1.2 常见数据库
- oracle数据库(47%,oracle)
- DB2(IBM)
- SQL Sever(Microsoft)
- MySQL(瑞典AB公司–>sun公司–>oracle公司)
- SQLite(Googel Android,轻量级数据库)
二、MySQL
2.1 安装MySQL
net stop mysql //停止mysql服务
net start mysql //启动mysql服务
2.2连接数据库
- 连接本机的mysql
//方式一
mysql -u用户名 -p密码
//方式二
mysql -u用户名 -p
再输入密码
- 连接远程的mysql
mysql -u用户名 -p密码 -h地址
2.3 数据库和表的概念
- 一个数据库服务器可以有多个客户端连接
- 一个数据库服务器可以有多个数据库
- 一个数据库可以建多张表
- 数据库客户端通过sql语句操作数据库服务器
- 表中的一行称之为一条记录,对应java中的一个对象的数据
三、SQL语句
1. 概述
1.1 概念
- Structured Query Language,结构化查询语言
- 现行是SQL-2003标准
- 方言:数据库厂商在遵循标准下,根据性能制定各自的与其它厂商不同的语句
1.2 作用
- 操作数据库服务器
2.操作数据库
2.1 创建数据库
create database 数据库名 [character set 码表]; //创建数据库,如果已存在会报错
create database if not exists 数据库名 [character set 码表]; //创建数据库,如果存在就不创建
2.2 查看数据库
show databases; //查看数据库
show create database 数据库名; //显示数据库创建的详情
select database(); // 查看正在使用的数据库
2.3 删除数据库
drop database 数据库名; //删除数据库,如果不存在会报错
drop database if exists 数据库名; //删除数据库,如果存在就删除
2.4 修改数据库
alter database 数据库 character set 码表; //修改指定数据库的码表
2.5 使用数据库
use 数据库名;
注意:SQL 语句要以”;”结束
3. mysql数据类型
3.1 整数
- tinyInt 一个字节
- smallInt 两个字节
- int 四个字节(常用),int(5)表示默认给分配5位,没超过前面就补0,超过就原样保存
- bigInt 八个字节
3.2 小数
- float 最多保存7个小数位
- double 最多保存15个小数位
- 用法1:直接写double
- 用法2:指定小数的组成,double(5,2)//总共5位,小数位占2个
3.3 字符串
- 插入表时一定要用单引号
- char 定长,没数据的位置填充空格,最多保存255个字符
- varchar 可变长,会留一个字符空间保存字符个数,灵活但效率比char低,最多可以保存65535个字符;varchar(5)表示初始化为5个字符空间
- blob longblob 存储二进制数据(音乐、图片、视频文件,一般不这样用)
3.4 日期
- 插入表时一定要用单引号
- date 只保存日期,不包括时分秒,没指定时为NULL
- datetime 保存了日期和时分秒,没指定时为NULL
- timestamp 保存日期和时分秒,没指定时会默认使用当前时间
4. 操作表
4.1 创建表
use 数据库名; //选择使用的指定数据库
show tables [in 数据库名]; //列出所有的表
//创建数据库的表
create table 表名(
字段1 数据类型1,
字段2 数据类型2,
...
);
create table student(
id int,
name varchar(7),
brithday datetime
);
insert into student values(1,'gouwa','1990-12-12 12:12:12');
select * from student;
4.2 查看表
show create table 表名; //查看创建表的语句
desc student; //查看表的结构
4.3 删除表
drop table 表名; //删除一个表
4.4 修改表
alter table 表名 character set 码表; //修改表使用的字符集
alter table 表名 add 新字段 数据类型; //添加一个字段
alter table 表名 modify 字段 新数据类型; //修改字段的数据类型
alter table 表名 drop 字段; //删除指定的字段
alter table 表名 rename to 新表名;//修改表名
//修改字段名?
5. 乱码或插入不成功问题
show variables like 'charac%';//查看数据库中与字符相关的变量
set character_set_client=gbk;//告知服务器,客户端使用的码表
set character_set_results=gbk;//告知服务器,发给客户端数据时使用的码表
- character_set_client
服务器认为的客户端使用的码表 - character_set_results
服务器向客户端发送数据时使用的码表 - character_set_connection
程序与服务器连接时使用的码表
set命令设置的变量都是临时的,窗口关闭即失效
要想长久,应修改配置文件(/安装目录/my.ini)里的
default-character-set=gbk;
这相当于
- set character_set_client=gbk;
- set character_set_results=gbk;
- set character_set_connection=gbk;
6. 操作表的数据【grub语句】
6.1 添加数据
insert into 表名(字段1,字段2) values(值1,值2);//nullable的数据可以不插入
insert into 表名 values(值1,值2,值3);//所有字段都要插入
6.2 删除数据
delete from 表名; //删除表中所有数据,逐行删除记录
truncate 表名; //清除表的所有数据,复制表结构->销毁表->重建表结构
delete from 表名 where 条件; //删除表中指定的数据
6.3 更新数据
update 表名 set 列名=新值 [, 列名2=新值] where 条件;
6.4 查询数据
查询数据不会改变表中数据。
普通查询
select [distinct] * | [字段1|表达式1 [[as] 别名],字段2 | 表达式2 [[as] 别名],...] from 表名;
- ”*” 表示查询表中所有数据
- [字段1,字段2,…] 指定要查询的字段
- [[as] 别名] 给列名起别名
- 表达式 使用表达式对列进行计算
- distinct 去除重复的数据
例子: select name 姓名,english 英语成绩 from students; select distinct english 英语成绩 from students; select name 姓名,(english+math+chinese) 总分 from students;
条件查询where
- 比较运算符
- < > <= >= <> !=
- between…and… 值在某一个区间内
- in(set) 值在in列表中
- like ‘pattern’ 模糊查询
- 用”%”表示0个或多个任意字符
- 用”_”代表任意1个字符
- 用[charlist]表示在列表中的单一字符
- 用[!charlist]或[^charlist]表示不在列表中的单一字符
- 用\%匹配”%”
- is null / is not null 判断是否为空
- 逻辑运算符
- and && 多个条件同时成立
- or || 多个条件任一成立
- not ! 不成立
//查询总分大于200分的学生 select name 学生,(english+math+chinese) 总分 from students where (english+math+chinese)>200; //查询数学有成绩的学生 select * from students where math is not null; //查出所有李姓的学生 select * from where name like '李%';
- 比较运算符
排序
select * from 表名where xxx order by 字段1 [desc|asc] [,字段2 [desc|asc]]; //desc 降序,asc 升序 //order by语句要位于select语句末尾 //可以多条件组合排序 //可以使用别名排序
//按数学成绩倒序输出 select name 姓名,math 数学 from students order by math desc; //组合排序 select * from students order by chinese desc,math desc; //别名排序 select name 姓名,(english+math+chinese) 总分 from students order by 总分 desc;
聚合函数(针对列的操作)
- COUNT(column_name) 返回指定列的值的数目,NULL 不计入
- SUM(column_name) 返回数值列的总数(总额)
- AVG(column_name) 返回数值列的平均值。NULL 值不包括在计算中。原理上利用到上面两个函数sum/count
- MAX(column_name) 返回一列中的最大值。NULL 不计入
- MIN(column_name) 返回一列中的最小值。NULL 不计入
用聚合函数查询结果只有一个。
//统计一个班的三门成绩的总和
select (sum(math)+sum(english)+sum(chinese)) from students;
//统计一个班的语文成绩平均分
select sum(chinese)/count(chinese) from students;
或
select avg(chinese) from students;
- 分组查询group by
如果条件数据是分组之前就知道的,那么条件筛选使用where语句即可
否则使用having语句,因为having可以使用聚合函数!
//查询每个工种的人数
select job,count(job) from emp group by job;
//统计工作岗位人数大于等于3人部门
select job,count(job) from emp group by job having count(job)>=3;
limit(MySQL方言)
作用:限定查询结果的起始页以及总行数
格式:LIMIT 开始查询的索引,查询的个数
7.完整性约束
7.1 主键
- 作用:作为一条数据的唯一标识
- 设置:在数据类型后加入* primary key*关键字
alter table emp add primary key(id);//添加主键
alter table emp drop primary key;//删除主键
7.2 自增长
- 作用:根据上一次的值自增
- 设置:在数据类型后加auto_increment关键字
alter table emp change id id int auto_increment;//设置主键自动增长
alter table emp change id id int;//删除主键自动增长
7.3 非空
- 作用:限制字段的值非空
- 设置:在数据类型后加 not null关键字
alter table emp change id id int not null;//设置主键非空
alter table emp change id id int;//删除主键非空
7.4 外键
- 作用:关联表,实现一张表对另一张表的约束
//创建外键
constraint 外键名称 foreign key(要约束的字段) references 引用表(字段);
//删除外键
alter table 表名 drop foreign key 外键名称;
//添加外键
alter table 表名 add constraint 外键名称 foreign key(要约束的字段) references 引用表(字段);