您的位置:首页 > 编程语言 > Java开发

JAVAWEB开发之数据库简介、MySQL的安装与卸载(处理中文乱码)、以及MySQL语言(DDL、DML、DCL、DQL)的详解和使用

2017-02-13 14:04 1201 查看
 SQL:Structured query language  即 结构化查询语句、

数据库简介

什么是数据库?

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

关系型数据库:存储的都是实体与实体之间的关系。

可以通过ER模型图来描述之间的关系



常见的数据库:

Oracle:甲骨文公司的数据库产品,大型的收费的数据库。

SQLServer:微软公司的数据库产品,中型的收费的数据库(一般与.NET一块使用)。

MySQL:是开源的,免费的数据库产品。在5.x版本是免费的,后来被oracle收购(6.x是收费的)

DB2:IBM公司的数据库产品,大型的收费的数据库。

SyBASE:已经退出了历史舞台,PowerDesigner(数据库建模工具)

常见的关系化数据库如下图所示:



MySQL的卸载:

卸载步骤一:先找到MySQL的安装路径,找到my.ini的配置文件,找到两个路径,basedir和datadir

卸载步骤二:然后卸载数据库,再找到以上两个路径删除文件夹。

开始卸载:(首先关闭MySQL服务)

(1)找到MySQL安装目录下的my.ini用编辑器打开,复制以上两个路径

basedir="D:/MySQL/"

datadir="C:/ProgramData/MySQL/MySQL Server 6.0/Data/"





(2)打开控制面板,开始卸载MySQL



    原因:这种错误是由于安装权限不足造成的,解决方案如下

打开任务管理器,结束explorer.exe ,再以管理员身份创建一个新的explorer.exe进程





然后就可以卸载了

如果这种还不能卸载 就直接安装360卫士进行卸载。

(3)然后删除以上两个文件夹

basedir="D:/MySQL/"
datadir="C:/ProgramData/MySQL/MySQL Server 6.0/Data/"

OK MySQL已经完全卸载了

推荐:最好的方式是安装360 直接卸载,然后删除上述的两个目录

MySQL的安装和配置:

一、安装步骤
(1)切记:千万不要双击进行打开,以为可能会涉及到管理员权限问题
右键开始菜单,以管理员方式 cmd打开DOS命令 ,输入msiexec(空格)/i(空格)安装文件所在目录\文件名



(2)选择同意



(3)选择安装类型,有“Typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项,选择“Custom”,按“next”键继续。



(4)选择MySQL的安装路径和数据的安装路径。

选择MySQL Server,点击Browse..选择安装的路径。

还可以选择Server data files,点击Browse..选择安装的路径。



确认一下先前的设置,如果有误,按“Back”返回重做。按“Install”开始安装。

继续next 直到出现下面的界面





点击Finish完成安装。

二、MYSQL的配置

(1)安装完成了,出现如下界面将进入mysql配置向导。



(2)选择配置方式,“Detailed Configuration(手动精确配置)”、“Standard Configuration(标准配置)”,我们选择“Detailed Configuration”,方便熟悉配置过程。



(3)选择服务器类型,“Developer Machine(开发测试类,mysql占用很少资源)”、“Server Machine(服务器类型,mysql占用较多资源)”、“Dedicated MySQL Server Machine(专门的数据库服务器,mysql占用所有可用资源)”



(4)选择mysql数据库的大致用途,“Multifunctional Database(通用多功能型,好)”、“Transactional Database Only(服务器类型,专注于事务处理,一般)”、“Non-Transactional Database Only(非事务处理型,较简单,主要做一些监控、记数用,对MyISAM数据类型的支持仅限于non-transactional),按“Next”继续。



默认选择next



(5)选择网站并发连接数,同时连接的数目,“Decision Support(DSS)/OLAP(20个左右)”、“Online Transaction Processing(OLTP)(500个左右)”、“Manual Setting(手动设置,自己输一个数)”。 



(6)MySQL的默认端口号是3306,不要去修改,使用默认的端口号就OK。在这个页面上,您还可以选择“启用标准模式”(Enable Strict Mode),这样MySQL就不会允许细小的语法错误。如果是新手,建议您取消标准模式以减少麻烦。但熟悉MySQL以后,尽量使用标准模式,因为它可以降低有害数据进入数据库的可能性。按“Next”继续 



(7)对mysql默认数据库语言编码进行设置(重要),一般选UTF-8,按 “Next”继续。



(8)选择是否将mysql安装为windows服务,还可以指定Service Name(服务标识名称),是否将mysql的bin目录加入到Windows PATH(加入后,就可以直接使用bin下的文件,而不用指出目录名,比如连接,“mysql.exe -uusername -ppassword;”就可以了,不用指出mysql.exe的完整地址,很方便),我这里全部打上了勾,Service Name不变。按“Next”继续。



(9)询问是否要修改默认root用户(超级管理)的密码。“Enable root access from remote machines(是否允许root用户在其它的机器上登陆,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“Create An Anonymous Account(新建一个匿名用户,匿名用户可以连接数据库,不能操作数据,包括查询)”,一般就不用勾了,设置完毕,按“Next”继续。



(10)确认设置无误,按“Execute”使设置生效,即完成MYSQL的安装和配置





注意:设置完毕,按“Finish”后有一个比较常见的错误,就是不能“Start service”,一般出现在以前有安装mysql的服务器上,解决的办法,先保证以前安装的mysql服务器彻底卸载掉了;不行的话,检查是否按上面一步所说,之前的密码是否有修改,照上面的操作;如果依然不行,将mysql安装目录下的data文件夹备份,然后删除,在安装完成后,将安装生成的 data文件夹删除,备份的data文件夹移回来,再重启mysql服务就可以了,这种情况下,可能需要将数据库检查一下,然后修复一次,防止数据出错。

MySQL重置密码

如果忘记了MySQL密码,将无法连接MySQL,重置密码方案如下:

(1)停止MySQL服务

  运行—> services.msc 进入到服务器界面

(2)在cmd>输入一个命令

  mysqld  --skip-grant-tables  (开启一个MySQL服务,不需要进行认证)

(3)切记:不要关闭步骤(2)中打开的服务窗口。新打开一个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服务

具体步骤如下:

1、通过services.msc打开服务界面,关闭MySQL服务

2、









3、重启MySQL服务。测试如下:



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

 所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
为保存应用中实体的的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。
数据库服务器‘、数据库和表的关系如图所示:



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



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

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

创建数据库

CREATE  DATABASE  [IF  NOT  EXISTS ]  db_name
                   [create_specification [, create_specification] ...]
[DEFAULT]  CHARACTER SET  charset_name
[DEFAULT]  COLLATE  collation_name
CHARACTER  SET:指定数据库采用的字符集
COLLATE:指定数据库字符集的比较方式
语法:create  database  数据库名称;(创建数据库采用数据库服务器默认编码)
复杂写法:create  database  数据库名称  character  set 字符集  collate  比较规则;
创建一个名称为mydb1的数据库。create  database  mydb1;
创建一个使用utf-8字符集的mydb2数据库。create database mydb2  character set utf8;
创建一个使用utf-8字符集,并带校对规则的mydb3数据库。
    —create  database  mydb3 character set utf8 collate  utf8_bin;
注意:每次创建一个数据库都会在数据存放目录中生成一个文件夹,每个文件夹中存在db.opt存放默认字符集和校对规则。

查询数据库
show databases;——查看所有数据库
show create database 数据库名;  ——查看数据编码集
实例如下:





查看、删除数据库

显示数据库语句:SHOW  DATABASES;
显示数据库定义信息:SHOW CREATE DATABASE db_name;
数据库删除语句:DROP DATABASE  [IF  EXISTS]  db_name;

删除数据库
语法:drop  database  数据库名称;
查看当前数据库服务器中的所有数据库 show databases;

查看前面创建的mydb2数据库的定义信息 show create database mydb2;

删除前面创建的mydb1数据库 drop database mydb1;

修改数据库

ALTER  DATABASE  [IF  NOT  EXISTS]  db_name
             [alter_specification [, alter_specification] ... ]
alter_specification:
[DEFAULT] CHARACTER SET  charset_name
[DEFAULT] COLLATE  collation_name
切换数据库 use db_name;
查看当前使用的数据库select database();

修改数据库编码集:
语法:alter database 数据库名称 character set 字符集 collate  比较规则
修改mydb2字符集为gbk;  alter  database  mydb2  character set gbk;
切换当前使用数据库: use 数据库名称

查看当前正在使用数据库: select database();






创建表(基本语句)

  CREATE  TABLE  table_name
(
     field1  datatype,
     field2  datatype,
     field3  datatype
) character  set  字符集  collate  校对规则;
field:指定列名  datatype:指定类型
数据表的创建
                            create table 表名(
字段1 类型(长度) 约束,
字段2 类型(长度) 约束,
字段3 类型(长度) 约束,
字段4 类型(长度) 约束
                                         );

语法:create  table  表名(列名  类型(长度), 列名 类型(长度)...);
一个数据表可以存在很多列,每列具有类型和长度
注意:创建表时没有指定字符集的话,将采用数据库默认字符集
           创建表之前必须使用use db_name; 语法指定数据库
           表名小括号,后面要有分号。
   每一行字段后面要有逗号,但是最后一行没有逗号。
   数据的类型后面有长度,如果是字符串类型,长度必须加。如果其他类型可以不加。默认长度。int 默认长度11
例如:创建day12 数据库 create  database day12;
切换到day12数据库  use  day12;

MySQL常用数据类型

字符类型 (VARCHAR、CHAR)
大数据类型(BLOB、TEXT)
数值型(TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE)
逻辑性(BIT)
日期型(DATE、TIME、DATETIME、TIMESTAMP)

Java中的类型与数据库中类型进行对应
(1)Java中String  char——MySQL中字符串类型 char  varchar
char是定长  varchar是变长:varchar(经常使用)长度是可变的 name varchar(8)存入hello,但是存入helloworld就会报错了。而char 长度不可变的。name char(8) 存入的数据hello,如果不够用空格补全。相对而言char的效率高一点。注意:不管是char还是varchar超出了长度范围都会出错。
(2)Java中的byte  short int long float double ——MySQL中的数值类型TINYINT、SMALLINT、INT、BIGINT FLOAT  DOUBLE
(3)Java中的boolean—— MySQL 中逻辑性数据类型 bit  存放一位0或者1
(4)Java中的Date——MySQL中日期类型  date只包含日期 、time只包含时间(时分秒)、datetime(日期时间都有)、timestamp(时间戳,日期和时间都有)
        datetime和timestamp表现形式上完全相同,区别在于datetime需要手动录入时间,timestamp不传入数据时,会默认选择当前系统时间
(5)Java中的大数据类型inputStream   二进制文件Reader文本文件——MySQL大数据类型blob(存放大二进制数据)、text(存放大的文本文件)
        tinyblob  tinytext  255字节;   blob  text  64kb;mediumblob  mediumtext  16MB;longblob  longtext  4GB
创建表练习  (创建一个员工表employee)
查看表结构:desc 表名;
create table employee (

   id int,

   name varchar(20),

   gender varchar(20),

   birthday date,

   entry_date date,

   job varchar(30),

   salary double,

   resume longtext

);

查看表结构 desc 表名; 

注意:创建数据表时,只有字符串类型必须写长度,而其他类型都有默认长度 



定义单表字段的约束

作用:约束用来保证数据有效性和完整性
定义主键约束:
    主键约束primary  key:信息记录某个字段可以唯一区分其他信息记录,这个字段就可以是主键(唯一  非空)
    primary  key:不允许为空,不允许重复
    删除主键:alter  table  tablename  drop  primary  key;
    主键自动增长:auto_increment
定义唯一约束:
    unique   例如:name  varchar(20)  unique
定义非空约束:
    not  null  例如:salary  double  not  null
约束用来保证数据有效性和完整性 

主键约束 primary key : 信息记录某个字段可以唯一区分其他信息记录,这个字段就可以是主键 (唯一 非空)

唯一约束 unique : 该字段的值不允许重复 

* 一张表中可以有很多个唯一约束,只能有一个(两个)作为主键约束 

非空约束 not null :该字段的值不能为空 

create table employee2 (

   id int primary key auto_increment,

   name varchar(20) unique not null,

   gender varchar(20) not null,

   birthday date not null,

   entry_date date not null,

   job varchar(30) not null,

   salary double not null,

   resume longtext

);

如果主键约束类型为 数值型 int bigint ,添加auto_increment 自动增长 

查看删除表

数据表删除 :语法—drop  table  表名
desc 表名;  查看表结构
show  tables;  查看当前数据库内所有表名
show  create  table 表名;  查看建表语句和字符集

修改表

使用ALTER  TABLE 语句追加,修改,或删除列的语法
ALTER  TABLE table   ADD  (column datatype [DEFAULT expr]  [, column datatype]...);
ALTER  TABLE table   MODIFY (column datatype [DEFAULT expr]  [, column datatype]...);
ALTER  TABLE table   DROP  (column);
修改表的名称:rename  table 表名  to  新表名;
修改列的名称:change  [column] old_col_name column_definition;
修改表的字符集:alter table student character set utf8;
数据表结构修改
1)增加列  语法:alter  table  表名  add 列名  类型(长度)  约束;
2)修改现有列类型、长度和约束 语法
      alter  table  表名  modify  列名  类型(长度)  约束;
3)  修改现有列名称 语法:
      alter table  表名  change 旧列名 新列名  类型(长度)  约束;    
4)删除现有列 语法:alter table  表名 drop 列名;
5)修改表名  rename table 旧表名 to 新表名;
实例练习:
在上面员工表的基础上增加一个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语句(增加数据)
Update语句(更新数据)
Delete语句(删除数据)
Select语句(查找数据)

Insert语句与处理插入字符中文乱码

使用INSERT语句向表中插入数据
INSERT  INTO  table  [ (column [,  column ...]) ]    VALUES  (value  [,  value...] );
insert into 表名 (字段1,字段2,字段3..) values(值1,值2,值3...);  需要插入几列就插入对应几列的值。
insert into 表名 values(值1,值2,值3...);插入所有的列
注意:

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

插入一条中文记录
insert into employee(id,name,job,salary) values(4,'小明','清洁员',1500);

出错了:

ERROR 1366 (HY000): Incorrect string value: '\xC3\xF7' for column 'name' at row 1 ; 

错误原因:mysql client 采用默认字符集编码 gbk 

查看系统所有字符集 : show variables like 'character%';

解决办法:修改客户端字符集为gbk 

MYSQL中共有6个地方字符集 :client connetion result 和客户端相关 、database server system 和服务器端相关 

mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、system。

client是客户端使用的字符集。 
connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。       
database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。    
results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。       
server是服务器安装时指定的默认字符集设定。       
system是数据库系统使用的字符集设定。(utf-8不可修改)

通过修改my.ini 修改客户端字符集编码,重启MySQL的服务

    修改客户端字符集 [mysql] 后字符集  default-character-set=gbk

    切记:修改的是客户端的配置编码,如下图所示:



重启MySQL服务
往user表中插入几条数据如下所示,中文乱码问题已解决



Update语句更新数据

UPDATE tbl_name    
        SET col_name1=expr1 [, col_name2=expr2 ...]    
[WHERE where_definition]


UPDATE语法可以用新值更新原有表行中的各列。

SET子句指示要修改哪些列和要给予哪些值。

WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行

实例演示如下:
将所有员工薪水修改为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删除数据

使用delete语句删除表中的数据
delete from  tab1_name  [WHERE  where_definition]

如果不使用where字句,将删除表中所有数据。
Delete语句不能删除某一列的值(可以使用update进行修改)
使用delete语句仅删除记录,不删除表本身。如果要删除表,使用drop table语句
同insert和update一样,从一个表中删除记录将引起其他表的参照完整性问题,在修改数据库数据时 切记注意外键约束
删除表中数据也可以使用truncate table_name语句,它与delete不同 truncate等于把表drop掉再重新建立一张同样结构的空表。

Select语句(1)

基本的select语句
SELECT  [DISTINCT] *|{ column, column, column ...}  FROM  table_name;
select  指定查询哪些列的数据。
column 指定列名
* 号代表查询所有列
from 指定查询哪张表
DISTINCT 可选,指显示结果时,是否剔除重复数据
select * from 表名;查询所有(字段)
select 字段名1,字段名2,字段名3 from 表名;
显示查询字段名
select DISTINCT 字段名 from 表名;
去除重复的数据。
实例如下:新创建一个学生表 并插入数据
create table student(
id int,
name varchar(20),
chinese float,
english float,
math float
);

insert into student(id,name,chinese,english,math) values(1,'张小明',89,78,90);
insert into student(id,name,chinese,english,math) values(2,'李进',67,53,95);
insert into student(id,name,chinese,english,math) values(3,'王五',87,78,77);
insert into student(id,name,chinese,english,math) values(4,'李一',88,98,92);
insert into student(id,name,chinese,english,math) values(5,'李来财',82,84,67);
insert into student(id,name,chinese,english,math) values(6,'张进宝',55,85,45);
insert into student(id,name,chinese,english,math) values(7,'黄蓉',75,65,30);
查询表中所有学生的信息

select * from student;



查询表中所有学生的姓名和对应的英语成绩
 select name,english from student;



过滤表中重复数据



Select语句(2)

在select语句中可使用表达式对查询的列进行运算
SELECT   *|{ column1 | expression, column2 | expression , ...}  FROM table_name;
在select语句中可以使用as语句(并且as可以省略)
SELECT column as 别名 from 表名;
练习:
在所有学生分数上加上10分特长分(在查询结果上)
select name,math+10,english+10,chinese+10 from student;



查询总分大于200 的学生
select name,math+english+chinese from student where (math+english+chinese) > 200;



Select语句(3)where过滤

在where字句中经常使用的运算符



like语句中,%代表0个或多个任意字符,_代表一个字符
练习:
(1)查询英语分数在80—90之间的同学。
       select * from student where english between 80  and 90;



(2)查询数学分数为80,90,91的同学。
select * from student where math in (80,90,91);



(3)查询所有姓李的学生成绩。
select * from student where name like '李%' ;



(4)查询数学分>80 , 语文分>80的同学。
select * from student where math>80 and chinese >80;



Select语句(5)order by排序

使用order by子句排序查询结果
SELECT column1,column2,column3 .. 
       FROM  table order by column  asc|desc;
Order by     指定排序的列,排序的列既可以是表中的列名,也可以是select语句后指定的列名。
ASC  升序   Desc 降序
ORDER  BY 子句应位于SELECT语句的结尾
练习:
(1)对数学成绩排序后输出
    select name, math from student order by math;



(2)对总分排序按从高到低的顺序输出。
 select name,math+english+chinese from student order by (math+english+chinese) desc; 



(3)对学生成绩按照英语进行降序排序 ,英语相同的学员按照数学进行降序排序。
select * from student order by english desc,math desc;



(4)对姓李的学生成绩排序输出
 select * from student where name like '李%' order by english desc;



 聚集函数—count

Count(列名) 返回某一列,行的总数
SELECT  count(*)|count(列名)   from tablename  [ WHERE  where_definition];
练习:
(1)统计一个班级共有多少学生?
select count(*)  from student;



(2)统计数学成绩大于90的学生有多少个?
select  count(*) from student where math > 90;



(3)统计总分大于220的人数有多少?
select count(*) from student where chinese+math+english > 220;



聚集函数—SUM

  Sum函数返回满足where条件的列的和(忽略NULL)
SELECT  sum(列名)  {, sum(列名) ...}  FROM  tablename  [ WHERE  where_definition];
注意:
sum仅对数值起作用,否则会报错。
对多列求和 ","不可少
ifnull(xxx, 0) 如果为null,则值是0
练习:
(1)统计一个班级数学总成绩?
      select sum(math)  from student;



(2)统计一个班级语文、英语、数学各科的总成绩?
select  sum(chinese), sum(math), sum(english) from student;



(3)统计一个班级语文、英语、数学的成绩总和?



使用ifnull函数处理null情况
select sum(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from student; 



(4)统计一个班级语文成绩平均分?
select sum(chinese)/count(*) from student;



聚集函数—AVG

AVG函数返回满足where条件的一列的平均值
SELECT  sum(列名) {, sum(列名) ... } from tablename  [WHERE  where_definition];
练习:
(1)求一个班级数学平均分?
select avg(math) from student;



(2)求一个班级总分平均分?
select avg(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from student;
 


 聚集函数—MAX/MIN

MAX/MIN函数返回满足where条件的一列最大/最小值
SELECT max(列名) from tablename  [WHERE  where_definition];
练习:
求班级最高分和最低分
select max(chinese+math+english) ,min(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from student;



Select语句(6)—GROUP BY



使用group by子句对列进行分组
SELECT  column1,column2,column3...FROM tablename  group by  column  having ...;
GROUP  BY子句可以将查询结果按照属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的值。
使用having 子句 对分组结果进行过滤

Having和where均可实现过滤,但在having可以使用聚集函数,having通常跟在group by后,它作用于分组

注意,使用GROUP BY时,select子句中只能由以下部分组成:
1)汇总函数
2)GROUP BY 中出现的列名
3)汇总函数和(GROUP BY中出现的列名) 通过函数和表达式的结果
例如:

SELECT A_ID ,COUNT(*) FROM C GROUP BY A_ID;    =>合法

SELECT A_DATE,COUNT(*) FROM C GROUP BY A_ID; =>不合法,如图示中的按A_ID分组后,对于其他各列的查询只能是汇总查询,否则没有意义

create table orders(
id int,
product varchar(20),
price float
);

insert into orders(id,product,price) values(1,'电视',900);
insert into orders(id,product,price) values(2,'洗衣机',100);
insert into orders(id,product,price) values(3,'洗衣粉',90);
insert into orders(id,product,price) values(4,'桔子',9);
insert into orders(id,product,price) values(5,'洗衣粉',90);




练习:对订单表中商品归类后,显示每一类商品的总价 ---- 需要按照商品名称进行分组

select product,sum(price) from orders group by product;



在group by 语句后面 添加having 条件语句 ---- 对分组查询结果进行过滤 

练习:查询购买了几类商品,并且每类总价大于100的商品

select product,sum(price) from orders group by product having sum(price) > 100;



试题:where 和 having 条件语句的区别 ? 

where 是在分组前进行条件过滤,having 是在分组后进行条件过滤 

使用where地方都可以用 having替换 , 但是having可以使用分组函数,而where后不可以用分组函数 
SELECT语句小结:S-F-W-G-H-O组合
select... from ... where...group by ... having ...order by ...;
顺序不能改变

MySQL数据库的备份与恢复

MySQL 数据库的备份和恢复

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

语法:mysqldump -u 用户名 -p 数据库名 > 磁盘SQL文件路径 

例如: 备份day12数据库 --- c:\day12.sql 

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

INSERT INTO student VALUES (1,'关羽',85,76,70),(2,'张飞',70,75,70),(3,'赵云',90,65,95),(4,'刘备',NULL,55,38);

2、恢复命令 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 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐