【20】MySQL数据库

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连接数据库

  1. 连接本机的mysql
//方式一
mysql  -u用户名 -p密码
//方式二
mysql -u用户名 -p
再输入密码
  1. 连接远程的mysql
mysql -u用户名 -p密码 -h地址

2.3 数据库和表的概念

  1. 一个数据库服务器可以有多个客户端连接
  2. 一个数据库服务器可以有多个数据库
  3. 一个数据库可以建多张表
  4. 数据库客户端通过sql语句操作数据库服务器
  5. 表中的一行称之为一条记录,对应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 查询数据

查询数据不会改变表中数据。

  1. 普通查询

    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;
  2. 条件查询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 '李%';
  3. 排序

    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;
  4. 聚合函数(针对列的操作)

    • 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;

  1. 分组查询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;

  1. 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 引用表(字段);

你可能感兴趣的:(mysql,数据库)