MySQL数据库
数据库概念:
数据库就是一个存储数据的文件系统,需要通过标准SQL语句才能访问。
MySQL的sql语句:
1.什么是SQL
SQL:结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
2.SQL的分类
* 数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。
* 数据操作语言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。
* 数据查询语言(DQL),例如:SELECT语句。(一般不会单独归于一类,因为只有一个语句)。
* 数据控制语言(DCL),例如:GRANT、REVOKE等语句。
* 事务控制语言(TCL),例如:COMMIT、ROLLBACK等语句。
SQL语言包括四类种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML) 及数据控制语言(DCL)还有事务控制语言(TCL)。
3.MySQL的数据类型
Java MySQL
int int
float float
double double
char/String char/varchar(char固定长度字符串,varchar可变长度的字符串)
Date date,time,datetime,timestamp
文件类型 BLOB、TEXT TEXT指的是文本文件 BLOB二进制文件
SQL语句的使用:
【创建数据库】
* create database 数据库名;
* create database 数据库名 character set 字符集;
【查看数据库】
* 查看数据库服务器中的所有的数据库:show databases;
* 查看某个数据库的定义的信息:show create database 数据库名;
【删除数据库】
* drop database 数据库名称;
【修改数据库】
* alter database 数据库名 character set 字符集;
【其他的数据库操作命令】
* 切换数据库:use 数据库名;
* 查看正在使用的数据库:select database();
【创建表】
create table 表名(
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);
【查看表】
查看数据库中的所有表:show tables;
查看表结构:desc 表名;
查看表的创建信息:show create table 表名;
【删除表】
drop table 表名;
【修改表】
alter table 表名 add 列名 类型(长度) 约束; 添加列
alter table 表名 modify 列名 类型(长度) 约束; 修改列的类型长度及约束
alter table 表名 change 旧列名 新列名 类型(长度) 约束; 修改列名,类型,长度,约束
alter table 表名 drop 列名; 删除列
alter table 表名 character set 字符集; 修改表的字符集
rename table 表名 to 新表名; 修改表名
【插入记录】
语法:
* insert into 表 (列名1,列名2,列名3..) values (值1,值2,值3..); 向表中 插入某些列
* insert into 表 values (值1,值2,值3..); 向表中插入所有列
注意:
* 1.列名数与values后面的值的个数相等
* 2.列的顺序与插入的值得数据类型要保持一致
* 3.插入值得时候不能超过最大长度.
* 4.值如果是字符串或者日期需要加’’.
【修改记录】
语法:
* update 表名 set 字段名=值,字段名=值 [where 条件];
注意:
* 1.列名的类型与修改的值要一致
* 2.修改值得时候不能超过最大长度
* 3.值如果是字符串或者日期需要加’’
where后的条件写法:
* > ,<,=,>=,<=
* like:使用占位符 _ 和 % _代表一个字符 %代表任意个字符.
* in:在某个范围中获得值.
* and:可以将多个条件拼接起来
【删除记录】
语法:
* delete from 表名 [where 条件];
注意:删除表中所有记录使用delete from 表名; 还是用truncate table 表名;
* 删除方式:delete 一条一条删除. 而truncate 直接将表结构记录删除.
* 事务控制DML(transaction),而delete属于DML.如果在一个事务中,delete数据,这些数据可以找回.truncate删除的数据找不回来.
start transaction;开启事务
commit;提交事务
rollback;回滚事务
【查询记录】
语法:
* select [distinct]*[列名,列名] from 表 [where 条件].
简单查询:
查询所有列:
SELECT * FROM 表名;
查询指定列:
SELECT 列名 FROM 表名;
查询时添加常量列:
SELECT 列名 AS '新名字' FROM 表名;
查询时去除重复记录(DISTINCT):
SELECT DISTINCT gender FROM student;
SELECT DISTINCT(gender) FROM student;
select运算查询:
查询时合并列:SELECT (列名+列名) FROM 表名;(注意:合并列只能合并数值类型的字段)
条件查询:
逻辑条件: and(与) or(或)
SELECT * FROM 表名 WHERE 条件 AND 条件;
SELECT * FROM 表名 WHERE 条件 OR 条件;
比较条件: > < >= <= = <>(不等于) between and (等价于>= 且 <=)
SELECT * FROM 表名 WHERE 列名>值;
SELECT * FROM 表名 WHERE 列名<值;
SELECT * FROM 表名 WHERE 列名>=值;
SELECT * FROM 表名 WHERE 列名<=值;
SELECT * FROM 表名 WHERE 列名=值;
SELECT * FROM 表名 WHERE 列名<>值;
SELECT * FROM 表名 WHERE 列名 BETWEEN 值 AND 值;
判空条件(null 空字符串):
is null / is not null / ='' / <>''
(order by)排序查询:
asc-升序,desc-降序
聚合函数:
* sum(),avg(),max(),min(),count();
分组:
使用group by分组和having进行条件查询
分页查询(limit 起始行,查询几行):
起始行从0开始
分页:当前页 每页显示多少条
分页查询当前页的数据的sql: SELECT * FROM 表名 LIMIT (当前页-1)*每页显示多少条,每页显示多少条;
【数据约束】
默认值
作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值。
DEFAULT
注意:
1)对默认值字段插入null是可以的。
2)对默认值字段可以插入非null
非空
作用: 限制字段必须赋值
NOT NULL
注意:
1)非空字符必须赋值
2)非空字符不能赋null
唯一
作用: 对字段的值不能重复
UNIQUE
注意:
1)唯一字段可以插入null
2)唯一字段可以插入多个null
主键
作用: 非空+唯一
PRIMARY KEY
注意:
1)通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。
2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的id字段。
自增长
作用: 自动递增
PRIMARY KEY AUTO_INCREMENT
外键
作用:约束两种表的数据
出现两种表的情况:
解决数据冗余高问题: 独立出一张表
例如: 员工表 和 部门表
问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入
使用外键约束:约束插入员工表的部门ID字段值,CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
解决办法: 在员工表的部门ID字段添加一个外键约束
注意:
1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!
2)主表的参考字段通用为主键!
3)添加数据: 先添加主表,再添加副表
4)修改数据: 先修改副表,再修改主表
5)删除数据: 先删除副表,再删除主表
【连续查询】
基本含义
连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”。
实际上,两个表的完全的连接是这样的一个过程:
左边的表的每一行,跟右边的表的每一行,两两互相“横向对接”后所得到的所有数据行的结果。
注意:连接之后,并非形成了一个新的数据表,而只是一种“内存形态”。
连接语法的基本形式
from 表1 [连接方式] join 表2 [on 连接条件];
连接方式
交叉连接
实际上,交叉连接是将两个表不设定任何条件的连接结果。
交叉连接通常也被叫做“笛卡尔积”——数学上可能比较多。
语法:
from 表1 [cross] join 表2 ; //可见交叉连接只是没有on条件而已。
cross这个词也可以省略,还可以使用inner这个词代替
内连接
语法:
from 表1 [inner] join 表2 on 表1.字段1=表2.字段2;
含义:找出(过滤)在交叉连接的结果表中的表1的字段1的值等于表2的字段2的值的那些行。
左[外]连接
形式:
from 表1 left [outer] join 表2 on 连接条件。
说明:
1,这里,left是关键字。
2,连接条件跟内连接一样。
3,含义是:内连接的结果基础上,加上左边表中所有不符合连接条件的数据,相应放右边表的字段的位置就自动补为“null”值。
右[外]连接
右连接跟左连接恰恰相反:
形式:
from 表1 right [outer] join 表2 on 连接条件。
说明:
1,这里,right是关键字。
2,连接条件跟内连接一样。
3,含义是:在内连接的结果基础上,加上右边表中所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补为“null”值。
全[外]连接
形式:
from 表1 full [outer] join 表2 on 连接条件;
说明:
1,含义:其实是左右连接的“并集”(消除重复项),即内连接的结果,加上左表中不满足条件的所有行(右边对应补null),再加上,右表中不满足条件的所有行(左边对应补null)。
2,mysql中其实不认识全[外]连接语法,即mysql这个软件本身不支持全连接的语法。
3,此概念在其他数据库有的存在,了解就可以。
子查询
子查询就是把一个查询的结果当作另一个查询的条件。
使用in子查询
in的基本语法形式为:
where 操作数 in (值1,值2, ....)
则in子查询就是:
where 操作数 in ( 列子查询 );
含义:
表示该操作数(字段值) 等于 该子查询的其中任意一个只,就算满足条件。
联合查询
联合查询的关键字是: union
基本含义
联合查询就是将两个select语句的查询结果“层叠”到一起成为一个“大结果”。
两个查询结果的能够进行“联合”的先觉条件是:结果字段数相等。
语法形式:
select 语句1
union [ALL | DISTINCT]
select 语句2;
说明:
1,两个select语句的输出段(结果字段)一样数目一样,应用中通常类型一样才有意义。
2,结果集中的字段以第一个select语句的字段为准。
3,第一个select语句的字段可以做别名,但如果做别名,则后续的where,group,order等子句应该用该别名。
4,联合查询默认是会消除重复项的(DISTINCT),要想不消除,则必须明确些“ALL”。
5,如果要对整个联合结果进行排序或limit,则应该对各自的select语句加括号:
(select 语句1)
union
(select 语句2)
order by ..... limit ....;