mysql复习(1)

mysql数据库

1. Mysql数据库简介

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作

User  id  name  age        pojo   bean   

id

name

age

 

 

 

 

 

1

lisi

李思思

 

 

 

 

 

2

zs

89

 

 

 

 

 

3

zs

89

 

 

 

 

 

mysql   列  添加

 

数据类型

约束  一行数据的正确

 

 

 

由于mysql数据库体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库

c s  

b s

 

 

 

 

 

 

 

2. 数据库服务器安装

2.1. 下载

官网:https://www.mysql.com/ 

下载:https://dev.mysql.com/downloads/mysql/ 

 

官方版和社区版的区别:

① 企业版只包含稳定后的工程,社区版包含所有的Mysql的最新功能。

② 社区版不提供官方技术支持。

③ 社区版免费,企业版收费。

 

2.2. 安装

 Sc delete MySQL   ----先删除

安装包安装:

① 解压mysql-5.7.17-winx64.zip压缩包(32位操作系统的请解压winx32的压缩包)

② 添加环境变量:

 

MYSQL_HOME追加到系统的path变量的末尾, 注意用英文分号(;)隔开。:

追加内容:;%MYSQL_HOME%\bin;

 

③ MySQL添加到系统服务中并启动:

1) 右键“开始”——> “运行(R)”或者快捷键:“开始”+R(以管理员身份运行cmd)

 

2) cd MySQL所在的本地磁盘路径的bin目录,然后回车:

 

执行:mysqld install MySQL --defaults-file="D:\big331\mysql-5.7.17-winx64\my-default.ini"(自己实际解压的位置)

启动:net start mysql

此时会出现MySQL服务无法启动,服务没有报告任何错误。

解决办法:

执行:

mysqld --install

mysqld --initialize  

net start mysql

④ 修改mysql密码

Mysql在启动后会初始化一个默认密码,该密码在mysql的安装目录data/xxx.err结尾的文件中。

 

cmd下执行:mysql -uroot -p

输入上面文件中的密码:lsix6)UhXhsJ

修改密码,执行:SET PASSWORD = PASSWORD('root');

退出使用新密码123456登录。

2.3. 链接

cmd下执行:mysql -uroot -p

输入正确的密码后就能登录到mysql中。

 

3. 对数据库操作

创建数据库

1.使用默认的字符集与校对

create database 数据库名;

2.可以指定数据库字符

create database 数据库名  CHARACTER  set gbk 

 

3查看当前数据库服务器下所有数据库

show databases;

4 查看创建数据库的语句

show create database 数据库名;

5删除数据库

      drop database 数据库名

6.切换数据库

      use 数据库名称

7查看当前所使用的事数据库

       select database();

 

4. 对数据库表结构操作

数据库中表数据和java中的实体bean比较,用来面描述和存储数据

4.1. 数据类型

类型

描述

int

整型,和java中的int类型一样;

double

浮点型,例如double(5,2)表示该列存放的数据最多是5位,而且其中必须有2位小数,它的最大值是:999.99

decimal

浮点型,用于保存对准确精度有重要要求的值,例如与金钱有关的数据。

char (120)  aa

固定长度字符串类型,如果没有指定长度,默认长度是255,如果存储的字符没有达到指定长度,mysql将会在其后面用空格补足到指定长度;

varchar(120)  aa

可变长度字符串类型,它的长度可以由我们自己指定,它能保存数据长度的最大值是65535,如果存储的字符没有达到指定的长度,不会补足到指定长度;

tinytext

可变长度字符串类型,其存储范围是28-1B

text

也是可变长度字符串类型,其存储范围是216-1B

mediumtext

也是可变长度字符串类型,其存储范围是224-1B

longtext

也是可变长度字符串类型,其存储范围是232-1B

tinyblob

是可变长度二进制类型,其存储范围是28-1B

blob

是可变长度二进制类型,其存储范围是216-1B

mediumblob

也是可变长度二进制类型,其存储范围是224-1B

longblob

也是可变长度二进制类型,其存储范围是232-1B

date

日期类型,格式为yyyy-MM-dd,只有年月日,没有时分秒;

time

时间类型,格式为hh:mm:ss,只有时分秒,没有年月日;

timestamp

时间戳类型,格式为:yyyy-MM:dd hh:mm:ss,年月日,时分秒都有。

 

charvarchar区别?

char是一个定长字符串.指定长度不会随着内容的不足而改变

varchar是一个可变长度的字符串,它根据信息自动改变长度.(只在字符串长度小于指定长度情况下)

4.2. 约束

A. 主键约束    primary key,  primary key(id)

B. 唯一约束    某一列的值不为重复可以使用唯一约束. unique  

C. 非空约束    not null

D. 默认值约束 default

 

 

E. 外键约束  

4.3. 对表操作

创建表

create table 表名(

字段1 类型,

字段2 类型,

.....

) character set 字符集

查看表

l查看表结构

desc 表名;

l查看当前数据库下所有表

show tables;

l查看表的字符编码集就是表的创建语句

show create table 表名;

修改表 基本不用  迫不得已也别用

1.add----添加列操作   alter table 表名  add 列名 类型;

2.modify--修改列的类型 alter table 表名  modify 列名  类型;                     

3.drop --删除列  alter table 表名  drop 列名.    

4.change--修改 列名称  alter table 表名 change 旧列名  新列名  类型;

删除表    一般不用  

drop table 表名;

TRUNCATE TABLE 表名   

   区别  前者有条件,自增主键不初始化 ,

         后者不可回退 , 速度快 , 相当于新建一个一样的空表

Insert into 表名 (files) values (values)

1 约束条件  长度  约束类型  

2 数据类型

3 (files  values  一一对应

5. 对数据库单表数据操作

5.1. Insert 插入操作

 

① 插入所有列值

    insert into 表名(列名1,列名2, ...) values(列值1, 列值2, ...);

表名后面是当前表中所有字段名称

INSERT INTO Persons (lastName,FirstName,Address,City) VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')

 

 

② 插入部分列值

insert into 表名(列名1,列名2) values(列值1, 列值2);

表名后面是当前表中部分字段名称

INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')

 

③ 不指定列名

insert into 表名 values(列值1, 列值2, ...);

u 没有给出要插入的列,那么表示插入所有列;

u 值的个数必须是该表的列的个数;

u 值的顺序,必须与表创建时给出的列的顺序相同。

 

INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')

 

 

注意

u 插入的数据应与字段的数据类型相同

u 数据的大小应该在列的长度范围内

values中列出的数据位置必须与被加入的列的排列位置相对应。

u .除了数值类型外,其它的字段类型的值必须使用引号引起。

如果要插入空值,可以不写字段,或者插入 null.

u  注意:对于自动增长的列在操作时,直接插入null值即可.

5.2. update更新操作

Update 语句用于修改表中的数据。

语法:

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

 

更新某一行中的一个列

我们为 lastname "Wilson" 的人添加 firstname

UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'

 

更新某一行中的若干列

UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'

WHERE LastName = 'Wilson'

 

 

 

5.3. delete删除操作

DELETE 语句用于删除表中的行。用于删除表中的数据

语法

DELETE FROM 表名称 WHERE 列名称 = 值

删除某行

DELETE FROM Person WHERE LastName = 'Wilson'

删除所有行

可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:

DELETE FROM table_name

或者

DELETE * FROM table_name

truncate table 表名  删除表中的数据

truncate table  Person

 

删除表   drop table 表名  删除的是整个表

关于delete truncate的区别

ü  delete是一行一行删除   truncate是将表结构销毁,在重新创建表结构.

ü  如果数据比较多,truncate的性能高。

ü  delete是受事务控制. 可以回滚数据.

ü  truncate是不受事务控制. 不能回滚.

5.4. select基本查询

SELECT 语句用于从表中选取数据。

语法

SELECT 列名称 FROM 表名称

或者

SELECT * FROM 表名称

 

查询指定列

 select 字段 from 表名;

 查询指定字段信息,如果要查询多个字段

 select 字段1,字段2,...from 表名;

SELECT LastName,FirstName FROM Persons

查询所有列

select * from 表名;

查询表中所有字段.

注意:使用"*"在练习,学习过程中可以使用,在实际开发中,

SELECT * FROM Persons

去掉重复记录

select distinct 字段 from 表名;

distinct它的作用是去除重复.

 

SELECT DISTINCT Company FROM Orders

 

使用别名

使用as 别名可以给表中的字段,表设置别名.

SELECT LastName  as lname ,FirstName as fname  FROM Persons

或者  直接用空格隔开

SELECT LastName lname ,FirstName  fname  FROM Persons

 

 

 

ifnull函数

在对数值类型的列做运算的时候,如果做运算的列的值为null的时,运算结果都为null,为了解决这个问题可以使用ifnull函数

 

SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)

FROM Products

如果有 "UnitsOnOrder" 值是 NULL,那么结果是 NULL

使用ifnull函数

SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))

FROM Products

5.4.1. Where子句

WHERE 子句用于规定选择的标准规定查询条件查询范围

语法

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

5.4.1.1. 常用运算符  

5.4.1.1.1. > >= < <= =    !=   ( <> )

 

SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

这是正确的:

SELECT * FROM Persons WHERE FirstName='Bush'

这是错误的:

SELECT * FROM Persons WHERE FirstName=Bush

数值不能加引号

这是正确的:

SELECT * FROM Persons WHERE Year>1965

这是错误的:

SELECT * FROM Persons WHERE Year>'1965'

 

5.4.1.1.2. 逻辑运算符

and  or  

select * from  tb_item where id = 536563 AND num = 99999  

select * from  tb_item where id = 536563 OR num = 99999

5.4.1.1.3. between ...and

相当于 >= and <=

注意:between 后面的值必须是小值 and后面的是大值

SELECT * FROM products WHERE price BETWEEN 100 AND price;

 

5.4.1.1.4. in

可以比较多个值

SELECT * FROM products WHERE price IN(65,100,190);

5.4.1.1.5. like

模糊查询

通配符使用:

1.% 匹配多个

2._ 匹配一个

查询出商品的名称中包含java的商品信息。

SELECT * FROM products WHERE NAME LIKE "%java%";

查询出书名是两个字的商品信息

SELECT * FROM products WHERE NAME LIKE "__";

5.4.1.1.6. null值操作

 is null; 判断为空

 is not null; 判断不为空

查询出商品价格不为null商品信息

SELECT * FROM products WHERE price IS NOT NULL;

SELECT * FROM products WHERE NOT price IS NULL;

5.4.1.2. order by排序

语法

select 字段from table where 条件 order by 字段  asc/desc  ,字段  asc/desc

asc 升序 (默认)

desc 降序

查询出所有商品,并根据价格进行升序排序

SELECT * FROM products ORDER BY price ASC;

查询出所有商品,根据数量进行升序排列,如果数量相同,根据价格进行降序排列

SELECT * FROM products ORDER BY pnum ASC, price DESC;

5.4.2. 聚合函数  ifnull

Select简单的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值

u count:统计指定列不为NULL的记录行数;

u sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0

u max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

u min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

u avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0

 

5.4.3. 分组操作

GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

分组操作中的having子名是用于在分组后对数据进行过滤的,作用类似于where条件

SQL GROUP BY 语法

SELECT column_name, aggregate_function(column_name)

FROM table_name

WHERE column_name operator value

GROUP BY column_name

HAVING 条件

对商品分类别统计,求出每一种类商品的总数量

SELECT category,SUM(pnum) FROM products GROUP BY category;

对商品分类别统计,求出每一种类商品的总数量,数量要大于100

SELECT category,SUM(pnum) FROM products GROUP BY category HAVING SUM(pnum)>100

 

总结

Havingwhere的区别

l having是在分组后对数据进行过滤.

 where是在分组前对数据进行过滤  

l having后面可以使用分组函数(统计函数)

 where后面不可以使用分组函数。

总结:

SELECT  category  ,,SUM(pnum),count(*) FROM products WHERE id <9 GROUP BY category HAVING SUM(pnum)>100 ORDER BY  SUM(pnum) DESC LIMIT 1 ,2

 

6. 多表设计

6.1. 外键约束

概念模型在数据库中就对应数据表,那么表与表之间的关系也包括:一对一,一对多,多对多。而表与表之间关系是通过外键来维护的。

                将两张表联系在一块 让表和表发生关系

外键约束特性如下:

l 外键必须是另一表或自身表的主键的值;

l 外键可以重复;

l 外键可以为空;

l 一张表中可以有多个外键。

CONSTRAINT FK_UID FOREIGN KEY orders(uid) REFERENCES USER(uid)

 

7. 多表数据关联操作

7.1. 交叉连接

语法

Select * from A cross join B;

Select * from A,B;

 

实现原理是  笛卡尔积

 order 主表

User      用户

Detai     明细

7.2. 内连接

内连接就是两张表同时都满足一定的条件的的结果

语法

显式内连接语法:

Select * from A inner join B on (连接条件[外键字段名=另一个表的主键字段])

 

隐式内连接语法:

Select * from A,B  where 条件

select * from orders A ,customer B where A.customer_id=B.id;

 

 

7.3. 外连接

左外连接 以左边表为主

语法

 Select * from A left join B on (A. 外键字段=B.主键字段)

查询到的结果是左边表全部显示右表补齐

 

右外连接  以右边表为主

语法:

 Select * from A right join B on (连接条件)

 

7.4. 联合查询

语法:

Select 字段  from A  where 条件

Union

Select 字段 from  B  where 条件

 

可以自动消除重复记录

7.5. 子查询

子查询:放在外面的查询语句称为父查询,放在里面查询称为子查询。

语法:

  

 Select * from A  where

                    Id in (

         Select id from B where 条件

                     )

 

 Select * from orders where customer_id=(select id from customer where name='zhangsan');

 

7.6. 补充的函数:

 NOW()
语法

SELECT NOW() FROM table_name

 

显示当天的日期所对应的名称和价格。

SELECT ProductName, UnitPrice, Now() as PerDate FROM Products

 

select year(now()); 取出年份

Md5()

select md5('123');

给添加的密码加密

INSERT into person (name,PASSWORD) values ('zhangsan' ,MD5('123') ) ;

Limit 起始行数 | 每页显示的行数

SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10  

 

你可能感兴趣的:(java)