www.icesr.com
IT运维工程师的摇篮

MySQL快速入门(一)—Java进阶学习第十五天

文档版本 开发工具 测试平台 工程名字 日期 作者 备注
V1.0 2016.05.09 lutianfei none

数据库简介

  • 什么是数据库

    • 数据库就是一个文件系统,但是访问的时候需要使用标准SQL语句来访问数据。
  • 关系型数据库

    • 存储的都是实体与实体之间的关系
  • ER模型图
    MySQL快速入门(一)—Java进阶学习第十五天

  • 常见的数据库

  • Oracle : 甲骨文公司的数据库产品,大型的收费的数据库。
  • SQLServer : 微软公司的数据库产品,中型的收费的数据库。
  • MySQL : 是开源的,免费的数据库产品。在5.x版本是免费的,6.x是收费的。
  • DB2 : IBM公司的数据库产品,大型的收费的数据库。
  • SyBASE : 已退出了历史舞台,PowerDigener(数据库建模工具)


MySQL数据库

MySQL的简介

MySQL完全卸载
  • 找到MySQL的安装路径,找到my.ini的配置文件。
    • basedir=”C:/Program Files (x86)/MySQL/MySQL Server 5.5/” 安装的路径(删除)
    • datadir=”C:/ProgramData/MySQL/MySQL Server 5.5/Data/” MySQL存储数据的路径(删除)
  • 通过控制面板卸载MySQL
  • 找到上面的两个路径,删除。

MySQL 安装与配置

  • 注:

    • 安装路径不要有中文。
    • MySQL默认端口是3306,不要修改。
    • 设置MySQL的编码集(采用UTF-8的编码)
    • 要把Include Bin Directory in Windows PATH勾选上。
    • 设置用户名的密码:两行都是密码,第一行是密码,第二行是确认密码。
  • 访问:

    • cmd > 输入命令 mysql -u root -p 回车
    • 输入密码 回车

密码重置

  • 1.停止mysql服务:

    • services.msc 进入到服务界面
  • 2.在cmd>输入一个命令:

    • mysqld –skip-grant-tables (开启一个mysql服务,不需要进行认证.)
  • 3.新打开一个cmd窗口

    • mysql -u root -p 不需要输入密码.就可以进入.
  • 4.输入命令 show databases;查看数据库,输入命令 use mysql;使用mysql数据库。

  • 5.修改密码的语句:
    • update user set password=password(‘root’) WHERE user=’root’;
  • 6.将两个窗口都关闭.
  • 7.任务管理器中结束(mysqld)进程.
  • 8.重启mysql服务

MySQL数据库服务器、数据库和表关系

  • 所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
  • 为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。
  • 数据库服务器、数据库和表的关系如图所示:
    MySQL快速入门(一)—Java进阶学习第十五天

MySQL快速入门(一)—Java进阶学习第十五天

  • 1、Java是使用对象封装数据,例如程序产生了如上所示2个user对象,这些对象的数据要想保存到数据库中,需要在数据库中创建与之对应的表,一个user对象中封装的数据,要保存到数据库中,一般就要在数据库中创建一个与之对应的表。
  • 2、对象的属性定义为表头,对象的数据对应于表中的一条记录。
  • 3、每个对象对应于表中的一条记录。

数据在数据库中的存储方式

MySQL快速入门(一)—Java进阶学习第十五天


SQL语句(重点)

SQL的简介

  • SQL:Structured Query Language, 结构化查询语言
  • 特点:非过程性语言
    • 过程性语言:当前的这条语句执行需要依赖于上一条或几条语句
    • 非过程性语言:写一条语句,就会执行一个结果。
  • 为加强SQL的语言能力,各厂商增强了过程性语言的特征
  • 如Oracle的PL/SQL 过程性处理能力
  • SQL Server、Sybase的T-SQL
  • SQL是用来存取关系数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能

SQL语言分类

  • DDL (数据定义语言)
    • 数据定义语言 – Data Definition Language
    • 用来定义数据库的对象,如数据表视图索引
  • DML (数据操纵语言)(重点)
    • 数据处理语言 – Data Manipulation Language
    • 在数据库表中更新增加删除记录
    • 如 update, insert, delete
  • DCL (数据控制语言)
    • 数据控制语言 – Data Control Language
    • 指用于设置用户权限控制事务语句
    • 如grant,revoke,if…else,while,begin transaction
  • DQL (数据查询语言)(重点)
    • 数据查询语言 – Data Query Language
    • select


数据库(CURD – 增删改查)

创建数据库

  • 语法:
    • create database 数据名称;
    • create database 数据库名称 character set 编码 collate 校对规则;
    • 校对规则:和编码是成对出现的
<code><span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> table_name (     field1  datatype,     field2  datatype,     field3  datatype, )<span class="hljs-keyword">character</span> <span class="hljs-keyword">set</span> 字符集 <span class="hljs-keyword">collate</span> 校对规则</span></code>
  • field:指定列名 
  • datatype:指定列类型

  • 练习

  • 创建一个名称为mydb1的数据库。
    • create database mydb1;
  • 创建一个使用utf8字符集的mydb2数据库。
    • create database mydb2 character set ‘utf8’;
  • 创建一个使用utf8字符集,并带校对规则的mydb3数据库。
    • create database mydb3 character set ‘utf8’ collate ‘utf8_bin’;

查看、删除数据库

  • 查看数据库 : show databases;
  • 查询数据库的定义 : show create database 数据库;
  • 删除数据库 : drop database 数据库名称;

  • 练习

  • 查看当前数据库服务器中的所有数据库
    • show databases;
  • 查看前面创建的mydb2数据库的定义信息
    • show create database mydb2;
  • 删除前面创建的mydb1数据库
    • drop database mydb1;

修改数据库

  • 语法:alter database 数据库 character set 编码 collate 校对规则;

  • 练习:查看服务器中的数据库,并把其中某一个库的字符集修改为gbk

    • alter database mydb2 character set ‘gbk’;

其他的操作

  • 切换数据库 : use db_name;
  • 查看当前使用的数据库 : select database();

数据表(CURD–增删改查)

创建表

  • 语法:
<code>    <span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> 表名(         字段<span class="hljs-number">1</span> 类型(长度) 约束,         字段<span class="hljs-number">2</span> 类型(长度) 约束,         字段<span class="hljs-number">3</span> 类型(长度) 约束,         字段<span class="hljs-number">4</span> 类型(长度) 约束     );</span></code>
  • 注意:
    • 表名小括号,后面要有分号。
    • 每一行字段后面要有逗号,但是最后一行没有逗号。
    • 数据的类型后面有长度,如果是字符串类型,长度必须加。如果其他类型可以不加。默认长度。int 默认长度11

MySQL常用数据类型

  • 字符串型

    • VARCHAR、CHAR
    • varchar和char区别:
      • varchar(经常使用) 长度是可变的。 name varchar(8) 存入数据hello,但是如果存入helloworld报错了。
      • char 长度不可变的。 name char(8) 存入的数据hello,如果不够用空格补全。
      • 效率高:char效果。
  • 大数据类型(一般不用)

    • BLOB、TEXT
    • BLOB:二进制文件
    • TEXT:字符
  • 数值型

    • TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
    • java 中 byte short int long float double 与之相对应
  • 逻辑性 对应boolean

    • BIT
  • 日期型

    • DATE、TIME、DATETIME、TIMESTAMP
    • date 只包含日期
    • time 只包含时分秒
    • datetime和timestamp包含日期和时分秒区别:
      • datetime需要手动录入时间。
      • timestamp不传入数据,默认选择当前系统时间。
  • 练习,创建员工表的练习
    MySQL快速入门(一)—Java进阶学习第十五天

<code>    <span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> employee(         id <span class="hljs-keyword">int</span>,         name <span class="hljs-keyword">varchar</span>(<span class="hljs-number">20</span>),         gender <span class="hljs-keyword">varchar</span>(<span class="hljs-number">10</span>),         birthday <span class="hljs-keyword">date</span>,         entry_date <span class="hljs-keyword">date</span>,         job <span class="hljs-keyword">varchar</span>(<span class="hljs-number">100</span>),         salary <span class="hljs-keyword">double</span>,         resume text     );</span></code>

定义单表字段的约束

  • 主键约束(重点)

    • 主键约束 primary key : 信息记录某个字段可以唯一区分其他信息记录,这个字段就可以是主键 (唯一 非空)
    • auto_increment 数据库维护主键。自动增长。
    • primary key:不允许为空,不允许重复
    • 删除主键alter table tablename drop primary key ;
    • 如果主键约束类型为 数值型 int bigint ,添加auto_increment 自动增长
  • 唯一约束

    • 值是唯一的。使用unique声明
  • 非空约束

    • 值不能为空 not null
  • 创建新的标签employee2,把约束加上。

<code>    <span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> employee2(         id <span class="hljs-keyword">int</span> <span class="hljs-keyword">primary</span> <span class="hljs-keyword">key</span> auto_increment,         name <span class="hljs-keyword">varchar</span>(<span class="hljs-number">20</span>) <span class="hljs-keyword">unique</span> <span class="hljs-keyword">not</span> <span class="hljs-keyword">null</span>,         gender <span class="hljs-keyword">varchar</span>(<span class="hljs-number">10</span>) <span class="hljs-keyword">not</span> <span class="hljs-keyword">null</span>,         birthday <span class="hljs-keyword">date</span> <span class="hljs-keyword">not</span> <span class="hljs-keyword">null</span>,         entry_date <span class="hljs-keyword">date</span> <span class="hljs-keyword">not</span> <span class="hljs-keyword">null</span>,         job <span class="hljs-keyword">varchar</span>(<span class="hljs-number">100</span>) <span class="hljs-keyword">not</span> <span class="hljs-keyword">null</span>,         salary <span class="hljs-keyword">double</span> <span class="hljs-keyword">not</span> <span class="hljs-keyword">null</span>,         resume text <span class="hljs-keyword">not</span> <span class="hljs-keyword">null</span>     );</span></code>
查看数据表结构
  • desc 表名; 查看表的信息
  • show tables ; 查看当前库内所有表名
  • show create table 表名; 查看建表语句和字符集
删除表
  • 语法:drop table 表名;
    • drop table employee2;
修改表
  • alter table 表名 add 字段 类型(长度) 约束;添加字段
  • alter table 表名 drop 字段;删除字段
  • alter table 表名 modify 字段 类型(长度) 约束;修改类型或者约束
  • alter table 表名 change 旧字段 新字段 类型(长度) 约束修改字段的名称
  • rename table 表名 to 新表名;修改表名
  • alter table 表名 character set utf8;修改字符集

  • 练习

  • 在上面员工表的基本上增加一个image列。
    • alter table employee add image varchar(20);
  • 修改job列,使其长度为60。
    • alter table employee modify job varchar(60);
  • 删除gender列。
    • alter table employee drop gender;
  • 表名改为user。
    • rename table employee to user;
  • 修改表的字符集为utf8
    • alter table user character set utf8;
  • 列名name修改为username
    • alter table user change name username varchar(30);

数据–CRUD语句

添加数据

  • 语法:

    • insert into 表名 (字段1,字段2,字段3..) values(值1,值2,值3...); 有几列就插入多少的值
    • insert into 表名 values(值1,值2,值3...); 插入所有的列
  • 注意:

    • 插入的数据应与字段的数据类型相同
    • 数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
    • 在values中列出的数据位置必须与被加入的列的排列位置相对应。
    • 字符日期型数据应包含在单引号''中。
    • 插入空值:不指定或insert into table values (null)
  • 练习:

  • 向user表中插入数据
<code><span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> <span class="hljs-keyword">user</span> <span class="hljs-keyword">values</span> (<span class="hljs-number">1</span>,<span class="hljs-string">'xiaofeng'</span>,<span class="hljs-string">'1994-10-10'</span>,<span class="hljs-string">'2011-1-1'</span>,<span class="hljs-string">'HR'</span>,<span class="hljs-number">19000</span>,<span class="hljs-string">'aaa'</span>,<span class="hljs-string">'abc'</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> <span class="hljs-keyword">user</span> <span class="hljs-keyword">values</span> (<span class="hljs-number">2</span>,<span class="hljs-string">'美美'</span>,<span class="hljs-string">'1994-10-10'</span>,<span class="hljs-string">'2011-1-1'</span>,<span class="hljs-string">'HR'</span>,<span class="hljs-number">19000</span>,<span class="hljs-string">'aaa'</span>,<span class="hljs-string">'abc'</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> <span class="hljs-keyword">user</span> <span class="hljs-keyword">values</span> (<span class="hljs-number">3</span>,<span class="hljs-string">'小风'</span>,<span class="hljs-string">'1994-10-10'</span>,<span class="hljs-string">'2011-1-1'</span>,<span class="hljs-string">'WORKER'</span>,<span class="hljs-number">21000</span>,<span class="hljs-string">'aaa'</span>,<span class="hljs-string">'abc'</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> <span class="hljs-keyword">user</span> <span class="hljs-keyword">values</span> (<span class="hljs-number">4</span>,<span class="hljs-string">'芙蓉'</span>,<span class="hljs-string">'1994-10-10'</span>,<span class="hljs-string">'2011-1-1'</span>,<span class="hljs-string">'HR'</span>,<span class="hljs-number">1000</span>,<span class="hljs-string">'aaa'</span>,<span class="hljs-string">'abc'</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> <span class="hljs-keyword">user</span> <span class="hljs-keyword">values</span> (<span class="hljs-number">5</span>,<span class="hljs-string">'班长'</span>,<span class="hljs-string">'1994-10-10'</span>,<span class="hljs-string">'2011-1-1'</span>,<span class="hljs-string">'HR'</span>,<span class="hljs-number">100</span>,<span class="hljs-string">'aaa'</span>,<span class="hljs-string">'abc'</span>);</span></code>
  • 注意:字符和日期要写在 单引号中
    • show variables like ‘character%’;
    • set character_set_results=gbk;或者 set names gbk;

解决中文乱码的问题(重点)

  • 解决方案:通过修改my.ini 修改字符集编码,重启MySQL的服务
<code><span class="hljs-title">[client]</span> <span class="hljs-setting">port=<span class="hljs-value"><span class="hljs-number">3306</span></span></span> <span class="hljs-title">[mysql]</span> <span class="hljs-setting">default-character-set=<span class="hljs-value">gbk</span></span></code>
  • mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、system。
    • client是客户端使用的字符集。
    • connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。
    • database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
    • results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
    • server是服务器安装时指定的默认字符集设定。
    • system是数据库系统使用的字符集设定。(utf-8不可修改)

修改语句

  • 语法: update 表名 set 字段=值,字段=值... [where ]

    • 如果没有where条件,默认更新所有的记录。
    • 有where提交,选择某一条记录。
    • UPDATE语法可以用新值更新原有表行中的各列
    • SET子句指示要修改哪些列和要给予哪些值。
  • 练习:在上面创建的employee表中修改表中的纪录。

  • 将所有员工薪水修改为5000元。
    • update user set salary=5000;
  • 将姓名为’班长’的员工薪水修改为3000元。
    • update user set salary=3000 where username=’班长’;
  • 将姓名为’美美’的员工薪水修改为4000元,job改为BOSS。
    • update user set salary=4000,job=’BOSS’ where username=’美美’;
  • 将班长的薪水在原有基础上增加1000元。
    • update user set salary = salary+1000 where username=’班长’;

删除数据

  • 语法:

    • delete from 表名 [where];
    • truncate 表名; 删除所有的数据
  • truncate 和 delete的区别:

    • truncate删除数据,先删除整个表。再创建一个新的空的表。(效率)
    • delete删除数据,一条一条删除的。
    • 事物(insert update delete)(后面讲)
  • Delete语句练习

  • 删除表中名称为’班长’的记录。
    • delete from user where username=’班长’;
  • 删除表中所有记录。
    • delete from user;
  • 使用truncate删除表中记录。
    • truncate user;

查询语句

  • 语法:

    • select * from 表名; 查询所有(字段)
    • select 字段名1,字段名2,字段名3 from 表名; 显示查询字段名
    • select DISTINCT 字段名 from 表名; 去除重复的数据
  • select 指定查询哪些列的数据。

  • *号代表查询所有列。
<code><span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> stu(     id <span class="hljs-keyword">int</span> <span class="hljs-keyword">primary</span> <span class="hljs-keyword">key</span> auto_increment,     name <span class="hljs-keyword">varchar</span>(<span class="hljs-number">20</span>),     math <span class="hljs-keyword">int</span>,     english <span class="hljs-keyword">int</span>,     chinese <span class="hljs-keyword">int</span> );</span>  <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> stu <span class="hljs-keyword">values</span>(<span class="hljs-keyword">null</span>,<span class="hljs-string">'班长'</span>,<span class="hljs-number">18</span>,<span class="hljs-number">11</span>,<span class="hljs-number">62</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> stu <span class="hljs-keyword">values</span>(<span class="hljs-keyword">null</span>,<span class="hljs-string">'小风'</span>,<span class="hljs-number">98</span>,<span class="hljs-number">91</span>,<span class="hljs-number">92</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> stu <span class="hljs-keyword">values</span>(<span class="hljs-keyword">null</span>,<span class="hljs-string">'美美'</span>,<span class="hljs-number">68</span>,<span class="hljs-number">81</span>,<span class="hljs-number">52</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> stu <span class="hljs-keyword">values</span>(<span class="hljs-keyword">null</span>,<span class="hljs-string">'美女'</span>,<span class="hljs-number">98</span>,<span class="hljs-number">90</span>,<span class="hljs-number">65</span>);</span></code>

  • 练习
  • 查询表中所有学生的信息。
    • select * from stu;
  • 查询表中所有学生的姓名和对应的英语成绩。
    • select name,english from stu;
  • 过滤表中重复数据。(面试题)
    • select distinct english from stu;

select 语句中别名的使用
  • 在select语句中可使用as语句(as 可以省略)

    • SELECT column as 别名 from 表名;
  • 练习:

  • 在所有学生分数上加10分特长分。
    • select name,math+10,english+10,chinese+10 from stu;
  • 统计每个学生的总分。
    • select name,math+english+chinese from stu;
  • 使用别名表示学生分数。
    • select name,(math+english+chinese) as sum from stu;
使用where条件过滤
  • 在where子句中经常使用的运算符
    MySQL快速入门(一)—Java进阶学习第十五天

  • 查询姓名为班长的学生成绩

    • select * from stu where name=’班长’;
  • 查询英语成绩大于90分的同学

    • select name,english from stu where english < 15;
  • 查询总分大于200分的所有同学

    • select name,math+english+chinese from stu where (math+english+chinese) > 200;

  • like – 模糊查询

    • 写法:like ‘张_或者%’;
    • _%区别:占位符。_只一个%可以有多个
    • %的写法 :
      • like ‘%张’; 结果XXX张
      • like ‘张%’; 结果张XXX
      • like ‘%张%’; 只要有张就行
  • 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的语句末尾
<code><span class="hljs-keyword">SELECT</span> column1, column2. column3..     <span class="hljs-keyword">FROM</span>    table;     <span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> column <span class="hljs-keyword">asc</span>|<span class="hljs-keyword">desc</span></code>
  • 练习
  • 对数学成绩排序后输出。

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

聚集函数

  • 聚集函数 指SQL语句中内置函数

聚集函数-count
  • Count(列名)返回某一列的总数
<code><span class="hljs-operator"><span class="hljs-keyword">Select</span> <span class="hljs-aggregate">count</span>(*)|<span class="hljs-aggregate">count</span>(列名) <span class="hljs-keyword">from</span> tablename         [<span class="hljs-keyword">WHERE</span> where_definition] </span></code>
  • 练习:
  • 统计一个班级共有多少学生?
    • select count(*) from stu;
  • 统计数学成绩大于90的学生有多少个?
    • select count(*) from stu where math > 90;
  • 统计总分大于150的人数有多少?
    • select count(*) from stu where (math+english+chinese) > 150;

聚集函数-sum
  • sum函数返回满足where条件的列的和(忽略NULL:ifnull(xxx,0)
<code><span class="hljs-operator"><span class="hljs-keyword">Select</span> <span class="hljs-aggregate">sum</span>(列名){,<span class="hljs-aggregate">sum</span>(列名)…} <span class="hljs-keyword">from</span> tablename         [<span class="hljs-keyword">WHERE</span> where_definition]  </span></code>
  • 统计一个班级数学总成绩?
    • select sum(math) from stu;
  • 统计一个班级语文、英语、数学各科的总成绩
    • select sum(math),sum(english),sum(chinese) from stu;
  • 统计一个班级语文、英语、数学的成绩总和
    • select sum(ifnull(math,0)+english+chinese) from stu;
    • select sum(math)+sum(english)+sum(chinese) from stu;
  • 统计一个班级语文成绩平均分
    • select sum(chinese) / count(*) from stu;

聚集函数-AVG

  • AVG函数返回满足where条件的一列的平均值

  • 练习:

  • 求一个班级数学平均分?
    • select avg(math) from stu;
  • 求一个班级总分平均分
    • select avg(ifnull(math,0)+english+chinese) from stu;

聚集函数-MAX/MIN

  • max/min函数返回满足where条件的一列的最大/最小值
<code><span class="hljs-operator"><span class="hljs-keyword">Select</span> <span class="hljs-aggregate">max</span>(列名) <span class="hljs-keyword">from</span> tablename         [<span class="hljs-keyword">WHERE</span> where_definition] </span></code>
  • max 最大值
    • select max(math) from stu;
  • min 最小值
    • select min(math) from stu;

聚集函数-GROUP

  • GROUP BY子句可以将查询结果按属性列或属性列组合在的方向上进行分组,每组在属性列或属性列组合上具有相同的值。

  • 注意,使用GROUP BY 时,SELECT 子句中只能由以下部分组成:

    • 汇总函数
    • GROUP BY 中出现的列名
    • 上面两个条件通过函数和表达式的结果
    • 条件过滤需要是having,不能使用where
  • 例如:

    • SELECT A_ID ,COUNT(*) FROM C GROUP BY A_ID; =>合法
    • SELECT A_DATE,COUNT(*) FROM C GROUP BY A_ID; =>不合法,如图示中的按A_ID分组后,对于其他各列的查询只能是汇总查询,否则没有意义
  • 练习:对订单表中商品归类后,显示每一类商品的总价

<code><span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> orders(     id <span class="hljs-keyword">int</span>,     product <span class="hljs-keyword">varchar</span>(<span class="hljs-number">20</span>),     price <span class="hljs-keyword">float</span> );</span>  <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> orders(id,product,price) <span class="hljs-keyword">values</span>(<span class="hljs-number">1</span>,<span class="hljs-string">'电视'</span>,<span class="hljs-number">900</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> orders(id,product,price) <span class="hljs-keyword">values</span>(<span class="hljs-number">2</span>,<span class="hljs-string">'洗衣机'</span>,<span class="hljs-number">100</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> orders(id,product,price) <span class="hljs-keyword">values</span>(<span class="hljs-number">3</span>,<span class="hljs-string">'洗衣粉'</span>,<span class="hljs-number">90</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> orders(id,product,price) <span class="hljs-keyword">values</span>(<span class="hljs-number">4</span>,<span class="hljs-string">'桔子'</span>,<span class="hljs-number">9</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> orders(id,product,price) <span class="hljs-keyword">values</span>(<span class="hljs-number">5</span>,<span class="hljs-string">'洗衣粉'</span>,<span class="hljs-number">90</span>);</span>  <span class="hljs-operator"><span class="hljs-keyword">select</span> product,<span class="hljs-aggregate">count</span>(*),<span class="hljs-aggregate">sum</span>(price) <span class="hljs-keyword">from</span> orders <span class="hljs-keyword">group</span> <span class="hljs-keyword">by</span> product;</span> </code>

  • 练习:查询购买了几类商品,并且每类总价大于100的商品
    • select product,sum(price) from orders group by product having sum(price) > 100;

  • select 语句总结 :
    • S-F-W-G-H-O 组合
      • select … from … where … group by… having… order by … ;
      • 顺序不能改变

备份、恢复数据库

  • 备份数据库
  • 备份命令 mysql/bin/mysqldump 将数据库SQL语句导出

    • 语法:mysqldump -u 用户名 -p 数据库名 > 磁盘SQL文件路径
  • 例如: 备份day12数据库 — c:/day12.sql

  • cmd > mysqldump -u root -p day12 > c:/day12.sql 回车输入密码

  • 恢复数据库(前提创建空的数据库,并且use)

  • 恢复命令 mysql/bin/mysql 将sql文件导入到数据库

    • 语法: mysql -u 用户名 -p 数据库名 < 磁盘SQL文件路径
    • 导入SQL 必须手动创建数据库 ,SQL不会创建数据库
  • 例如:将c:/day12.sql 导入 day12数据库

    • cmd > mysql -u root -p day12 < c:/day12.sql 回车密码
  • 补充知识:恢复SQL也可以在数据库内部执行 source c:/day12.sql

  • 练习

    • 备份test库中的数据,并恢复

未经允许不得转载:冰点网络 » MySQL快速入门(一)—Java进阶学习第十五天

分享到:更多 ()

评论 抢沙发

评论前必须登录!