MySQL知识总结
1.MySQL数据库
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,从而增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中
小型网站的开发都选择 MySQL 作为网站数据库,搭配 PHP 和 Apache 可组成良好的开发环境。
2.MySQL存储方式
一台数据库服务器中会创建很多数据库,在数据库中会创建很多张表,在表中会有很多记录。
3.SQL结构化查询语言
SQL是高级的非过程化编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚
本文件的扩展名,可以嵌套,具有极大的灵活性和强大的功能。
4.SQL语言的分类
(1)DDL(数据定义语言)
(2)DML(数据操作语言)
(3)DCL(数据控制语言)
(4)DQL(数据查询语言)
5.MySQL数据库的创建、修改和删除
(1)创建数据库
语法: create database 数据库名称 [character set 字符集 collate 字符集校对规则](一般忽略);
(2)查看数据库
查看所有数据库:
语法: show databases;
查看某个数据库:
语法: show create database 数据库名称;
(3)修改数据库:
语法:alter database 数据库名称 [character set 字符集 collate 字符集校对规则](一般忽略);
(4)删除数据库:
语法:drop database 数据库名称;
(5)使用或者切换数据库:
语法:use 数据库名称;
6.MySQL表的创建、修改和删除
(1)创建表
语法:create table 表名(
数据名称 数据类型(长度) 约束,
.......
);
注:括号内的语句用逗号进行多次创建,最后的语句不加任何标点符号
数据类型:(MySQL所对应的Java类型)
Java中的类型 MySQL中的类型
byte/short/int/long tinyint/smallint/int/bigint
float float
double ouble
boolean bit
char/String char和varchar类型
char和varchar的区别:
char代表是固定长度的字符或字符串。
定义类型char(8),向这个字段存入字符串hello,那么数据库使用三个空格将其补全。
varchar代表的是可变长度的字符串。
定义类型varchar(8), 向这个字段存入字符串hello,那么存入到数据库的就是hello。
Date date/time/datetime/timestamp
datetime和timestamp区别
datetime就是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用null存入
到数据库中
timestamp也是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用当前的
系统时间存入到数据库中。
File BLOB/TEXT
约束:
约束作用:保证数据的完整性
单表约束:
主键约束:primary key (主键约束默认就是唯一 非空的)
唯一约束:unique
非空约束:not null
(2)查看表
查看一个数据库下的所有的表:
语法:show tables;
查看单独一个表:
语法:desc 表名;
(3)删除表
语法:drop table 表名;
(4)修改表
增添列:
语法: alter table 表名 add 列名 数据类型(长度) 约束;
修改列类型,长度和约束:
语法: alter table 表名 modify 列名 数据类型(长度) 约束;
删除列:
语法: alter table 表名 drop 列名;
修改列名称:
语法: alter table 表名 change 旧列名 新列名 数据类型(长度) 约束;
修改表名:
语法: rename table 表名 to 新的表名;
修改表的字符集:
语法: alter table 表名 character set 字符集;
7.MySQL数据的增删改查
(1)添加表记录
向表中插入某些列:
语法: insert into 表名 (列名1,列名2,列名3…) values (值1,值2,值3…);
向表中插入所有列:
语法: insert into 表名 values (值1,值2,值3…);
注意:
1.值的类型与数据库中表列的类型一致;
2.值的顺序与数据库中表列的顺序一致;
3.值的最大长度不能超过列设置最大长度;
4.值的类型是字符串或者是日期类型,使用单引号引起来。
(2)修改表记录
语法: update 表名 set 列名=值,列名=值 [where 条件];
注意:
1.值的类型与列的类型一致;
2.值的最大长度不能超过列设置的最大长度;
3.字符串类型和日期类型添加单引号。
(3)删除表记录
语法: delete from 表名 [where 条件];(或者truncat from 表名;)<注:truncat删除表数据无法恢复>
注意:
1.删除表的记录,指的是删除表中的一行记录;
2.删除如果没有条件,默认是删除表中的所有记录。
(4)查看表记录
语法: select *(或者列名) from 表 [条件];
8.MySQL解决向数据库中插入中文记录会出现错误
解决方法:
需要将MySQL数据库服务器中的客户端部分的字符集改为gbk,找到MySQL的安装路径:my.ini文件,修改文件中[client]下的字符集,将
[default-charaacter-set=ISO-8895-1]改成[default-charaacter-set=gbk],然后再重新启动MySQL的服务器。
9.按不同方式查看表记录
(1)按条件查询:
使用where 字句
> ,< ,<= , >= , <> *不等 , =
like:模糊查询 , in:范围 查询 , 条件关联:and or not
查询李四信息: select * from 表名 where 列名[name = 李四] = '李四';
查询李四信息并且英语大于90: select * from 表名 where 列名[name = 李四] ='李四' and 列名[Englist]>90;
在lik可以使用: _ , % _只能带表一个字符 %带表多个字符 * %王% 带表中间包含着个字就行
查询姓李的学生信息: select * from 表名 where name like '%李%'
查询英语成绩是69,75,89的学生: select * form 表名 where 列名[english] in (69 , 75 , 89);
(2)查询排序:
使用order by 字段名称 asc/desc; *默认是用asc , 倒序desc;
查询学生信息按成绩排: selech * from order by 列名[english];
查询学生成绩按倒序: selech * from order by 列名[english] desc;
查询学生按语文成绩倒序再按英语升序排列: select * from order by 列名[chinese] desc, 列名[english] asc;
查询姓李的学生,英语按倒序排列: select * from 表名 where 列名[name] like '李%' order by 列名[english] desc;
(3)分组统计查询:
聚合函数:
sum(); 获得总数: count();*个数; 最大值:max() 最小值:min() 平均值:avg;
获得所有成绩的和: select sum(exam)from 表名;
count();
获得所有的计数: select count(*) from 表名;
max()/min();
获得某门考试的最大和最小成绩: select max(math) from 表名;/select min(math) from 表名;
avg()
获得平均数:select avg(chinese) from 表名;
分组查询
语法:使用group by 字段名称;
按商品名称统计,每类商品所花费的总金额:select product,sum(price) from orderitem group by product;
注意:
where的子句后面不能跟着聚合函数。如果现在使用带有聚合函数的条件过滤(分组后条件过滤)需要使用一个关键字HAVING;
例:select product,sum(price) from orderitem group by product having sum(price) > 5000 order by sum(price) asc;
10.单表查询的执行顺序流程
select ... from ... where ... group by ... having ...order by ...;
11.多表查询
表与表之间的关系-外键
作用:保证多张表之间的数据如果有关联,则关联的数据的完整性。
设计与建表原则
一对多:将外键设置在多的一方,指向一的主键
多对多:必须有第三张表,这张表中最少会有两个字段作为外键,指向多对多的两张表的主键
一对一:唯一外键约束
主键对应:
实质就是建立外键并且让这个外键唯一。
查询:
准备环境:多表分析创建
连接查询:关联条件就是外键
内连接:交集, select * from 表1, 表2 where 条件
左外连接:左表的数据和交集数据
select * from 表1 left join 表2 on 条件
右外连接:右表的数据和交集数据
select * from 表1 right join 表2 on 条件
子查询
12.分页查询
select * from 表名 limit begin, length :begin 从0开始,表示索引;length:表示查询多少条记录
select * from 表名 limit number; 从第一条数据开始,总共查询number条数据。
13.MySQL常见bug
select * from 表名 where score = '80abc' 实质就是:SELECT * FROM stu where score = 80, 会将不能转化为数值的字符舍弃
select * from 表名 where NAME = 'abC' :MySQL查询的时候不区分大小写
解决方法:
select * from stu where BINARY NAME = 'Abc'