MySQL学习笔记

 

1.1 MySQL的概述

1.1.1 数据库的概述

1.1.1.1 什么是数据库

数据库就是一个文件系统,经过标准的SQL语句获取数据web

1.1.2 MySQL的概述

1.1.2.1 什么是MySQL数据库

 

1.1.3 关系型数据库概述

1.1.3.1 什么是关系型数据库

关系型数据库存放的是实体之间的关系数据库

 

1.1.3.2 常见的关系型数据库

l MySQL服务器

l Oracle函数

l SQLServerspa

l DB2视频

l SyBase对象

1.2 MySQL的安装

1.2.1 MySQL安装步骤

参见《MySQL的安装》视频排序

1.3 MySQL的数据存储方式的概述

1.3.1 服务器的概念

1.3.1.1 什么是服务器

服务器要从硬件和软件两个方面来讲:事务

硬件:指的就是一台计算机。rem

软件:须要在这台电脑上安装数据库服务器。

1.3.2 MySQL数据库存储的方式

1.3.2.1 存储方式的描述

 

一台数据库服务器中会建立不少数据库(一个项目,会建立一个数据库)。在数据库中会建立不少张表(一个实体会建立一个表)。在表中会有不少记录(一个对象的实例会添加一条新的记录)。

1.4 SQL的概述

1.4.1 SQL的概念

1.4.1.1 什么是SQL

 

1.4.2 SQL的分类

1.4.2.1 DDL:数据定义语言

createdropalter..

1.4.2.2 DCL:数据控制语言

grantif

1.4.2.3 DML:数据操纵语言

insertupdatedelete

1.4.2.4 DQL:数据查询语言

select

1.5 使用SQL

1.5.1 SQL对数据库进行操做

1.5.1.1 建立数据库

语法:

n create database 数据库名称 [character set 字符集 collate 字符集校对规则];

 

1.5.1.2 查看数据库

语法:

查看数据库服务器中全部的数据库:show databases;

 

查看某个数据库的定义信息: show create database 数据库名称;

 

1.5.1.3 修改数据库

语法:

n alter database 数据库名称 character set 字符集 collate 校对规则;

 

1.5.1.4 删除数据库

语法:

n drop database 数据库名称;

 

1.5.1.5 其余数据库操做

切换数据库:use 数据库名称;

 

查看当前正在使用的数据库:

 

1.5.2 SQL对数据库表进行操做

1.5.2.1 SQL建立表

语法:

n create table 表名称(字段名称 字段类型(长度) 约束,字段名称 字段类型(长度) 约束…);

字段类型

一个实体对应一个表,一个实体属性对应表的一个字段。

Java中的类型 MySQL中的类型

byte/short/int/long tinyint/smallint/int/bigint

float float

double double

boolean bit

char/String charvarchar类型

charvarchar的区别:

* char表明是固定长度的字符或字符串。

* 定义类型char(8),向这个字段存入字符串hello,那么数据库使用三个空格将其补全。

* varchar表明的是可变长度的字符串。

* 定义类型varchar(8), 向这个字段存入字符串hello,那么存入到数据库的就是hello

Date date/time/datetime/timestamp

datetimetimestamp区别

* datetime就是既有日期又有时间的日期类型,若是没有向这个字段中存值,数据库使用null存入到数据库中

* timestamp也是既有日期又有时间的日期类型,若是没有向这个字段中存值,数据库使用当前的系统时间存入到数据库中。

File BLOB/TEXT

约束

约束做用:保证数据的完整性

单表约束分类:

主键约束:primary key 主键约束默认就是惟一 非空的

惟一约束:unique

非空约束:not null

建表语句:

create database web_test1;

use web_test1;

create table user(

id int primary key auto_increment,

username varchar(20) unique,

password varchar(20) not null,

age int,

birthday date

);

 

1.5.2.2 SQL查看表

查看某个数据库下的全部的表

语法:show tables;

 

查看某个表的结构信息

语法:desc 表名;

 

 

1.5.2.3 SQL删除表

删除表

语法:drop table 表名;

 

1.5.2.4 SQL修改表

修改表:添加列

n alter table 表名 add 列名 类型(长度) 约束;

 

修改表:修改列类型,长度和约束

n alter table 表名 modify 列名 类型(长度) 约束;

 

修改表:删除列

n alter table 表名 drop 列名;

 

修改表:修改列名称

n alter table 表名 change 旧列名 新列名 类型(长度) 约束;

 

修改表:修改表名

n rename table 表名 to 新的表名;

 

修改表:修改表的字符集

n alter table 表名 character set 字符集;

 

1.5.3 SQL对数据库表的记录进行操做(重点)

1.5.3.1 SQL添加表的记录

语法:

向表中插入某些列:insert into 表名 (列名1,列名2,列名3…) values (1,2,3…)

向表中插入全部列:insert into 表名 values (1,2,3…);

注意事项

1.值的类型与数据库中表列的类型一致。

2.值的顺序与数据库中表列的顺序一致。

3.值的最大长度不能超过列设置最大长度。

4.值的类型是字符串或者是日期类型,使用单引号引发来。

添加记录

添加某几列

insert into user (id,username,password) values (null,'aaa','123');

 

添加全部列

insert into user values (null,'bbb','123',23,'1993-09-01');

 

添加中文记录

insert into user values (null,'张三','123',23,'1993-09-01');

 

直接向数据库中插入中文记录会出现错误!!!

解决方法:

show variables like '%character%';  --查看数据库中与字符集相关参数:

须要将MySQL数据库服务器中的客户端部分的字符集改成gbk

找到MySQL的安装路径:my.ini文件,修改文件中[client]下的字符集

 

* 从新启动MySQL的服务器

services.msc

1.5.3.2 SQL修改表的记录

语法:

n update 表名 set 列名=,列名=[where 条件];

注意事项

1.值的类型与列的类型一致。

2.值的最大长度不能超过列设置的最大长度。

3.字符串类型和日期类型添加单引号。

修改某一列的全部值

update user set password = 'abc';

 

按条件修改数据

update user set password = 'xyz' where username = 'bbb';

 

按条件修改多个列

update user set password='123',age=34 where username='aaa';

 

1.5.3.3 SQL删除表的记录

语法:

n delete from 表名 [where 条件];

注意事项

1.删除表的记录,指的是删除表中的一行记录。

2.删除若是没有条件,默认是删除表中的全部记录。

删除某一条记录

delete from user where id = 2;

 

删除表中的全部记录

delete from user;

 

删除表中的记录有两种作法:

delete from user;

删除全部记录,属于DML语句,一条记录一条记录删除。事务能够做用在DML语句上的

truncate table user;

删除全部记录,属于DDL语句,将表删除,而后从新建立一个结构同样的表。事务不能控制DDL

1.5.3.4 SQL查看表的记录(重点)

基本查询

语法:select [distinct] *|列名 from [条件];

环境的准备:

create table exam(

id int primary key auto_increment,

name varchar(20),

english int,

chinese int,

math int

);

 

insert into exam values (null,'张三',85,74,91);

insert into exam values (null,'李四',95,90,83);

insert into exam values (null,'王五',85,84,59);

insert into exam values (null,'赵六',75,79,76);

insert into exam values (null,'田七',69,63,98);

insert into exam values (null,'李老八',89,90,83);

查询全部学生考试成绩信息

select * from exam;

 

查询全部学生的姓名和英语成绩

select name,english from exam;

 

查询英语成绩信息(不显示重复的值)

select distinct english from exam;

 

查看学生姓名和学生的总成绩

select name,english+chinese+math from exam;

 

别名查询

select name,english+chinese+math as sum from exam;

 

条件查询

使用where子句

> , < , >= , <= , <> ,=

like:模糊查询

in:范围查询

条件关联:and , or ,not

查询李四学生的成绩:

select * from exam where name = '李四';

 

查询名称叫李四学生而且英文大于90

select * from exam where name = '李四' and english > 90;

 

查询姓李的学生的信息

like能够进行模糊查询,like子句中能够使用_或者%做为占位符。_只能表明一个字符,而%能够表明任意个字符。

* like ‘_’ :名字中必须是两个字,并且是姓李的。

* like ‘%’ :名字中姓李的学生,李子后能够是1个或任意个字符。

* like ‘%:名字中以四结尾的。

* like ‘%%:只要名称中包含这个字就能够。

 

select * from exam where name like '%';

 

查询英语成绩是69,75,89学生的信息

select * from exam where english in (69,75,89);

 

排序查询

使用order by 字段名称 asc/desc;

查询学生信息,而且按照语文成绩进行排序:

select * from exam order by chinese;

 

查询学生信息,而且按照语文成绩倒序排序:

select * from exam order by chinese desc;

 

查询学生信息,先按照语文成绩进行倒序排序,若是成绩相同再按照英语成绩升序排序

select * from exam order by chinese desc,english asc;

 

查询姓李的学生的信息,按照英语成绩降序排序

select * from exam where name like '%' order by english desc;

 

分组统计查询

聚合函数使用

sum();

获取全部学生的英语成绩的总和:

select sum(english) from exam;

 

获取全部学生的英语成绩和数学成绩总和:

select sum(english),sum(math) from exam;

 

查询姓李的学生的英语成绩的总和

select sum(english) from exam where name like '%';

 

查询全部学生各科的总成绩:

select sum(english)+sum(chinese)+sum(math) from exam;

 

select sum(english+chinese+math) from exam;

与上面的语句有什么不一样?

* 上面的语句是按照列的方式统计,英语成绩总和+语文成绩总和+数学成绩总和。

* 下面的语句先计算英语+数学+语文而后再求和。

* 使用ifnull的函数

 

count();

得到学生的总数

select count(*) from exam;

 

得到姓李的学生的个数

select count(*) from exam where name like '%';

 

max();

得到数学成绩的最高分:

select max(math) from exam;

 

min();

得到语文成绩的最小值

select min(chinese) from exam;

 

avg();

获取语文成绩的平均值

select avg(chinese) from exam;

 

分组查询

语法:使用group by 字段名称;

环境准备

create table orderitem(

id int primary key auto_increment,

product varchar(20),

price double

);

insert into orderitem values (null,'电视机',2999);

insert into orderitem values (null,'电视机',2999);

insert into orderitem values (null,'洗衣机',1000);

insert into orderitem values (null,'洗衣机',1000);

insert into orderitem values (null,'洗衣机',1000);

insert into orderitem values (null,'冰箱',3999);

insert into orderitem values (null,'冰箱',3999);

insert into orderitem values (null,'空调',1999);

按商品名称统计,每类商品所购买的个数:

select product,count(*) from orderitem group by product;

 

按商品名称统计,每类商品所花费的总金额:

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

 

按商品名称统计,统计每类商品花费的总金额在5000元以上的商品

***** where的子句后面不能跟着聚合函数。若是如今使用带有聚合函数的条件过滤(分组后条件过滤)须要使用一个关键字having

select product,sum(price) from orderitem  group by product having sum(price) > 5000;

 

按商品名称统计,统计每类商品花费的总金额在5000元以上的商品,而且按照总金额升序排序

select product,sum(price) from orderitem  group by product having sum(price) > 5000 order by sum(price) asc;

 

总结

S(select) F(from)W(where)G(group by)H(having)O(order by);

相关文章
相关标签/搜索