【MySQL】综合示例和数据库设计步骤
SQL
DDL(Data Definition Language):数据定义语言,用来操作库,表。
DML(Data Manipulation Language):数据操作语言,用来操作表中存储的数据,但是只能完成增 , 删 , 改。
DCL(Data Control Language):数据控制语言,操作用户自己的,完成权限的相关控制。
DQL(Data Query Language):数据查询语言,用来操作表中存储的数据,但是只能完成查
DDL
操作库
--增
create database [if not exists] mydb ;
-- 删
drop database [if exists] mydb ;
-- 查
show databases ;
-- 改
alter database mydb character set utf-8 ;
查看前面创建的数据库的定义信息:
show create database mydb;
select database()
使用数据库:
use 数据库名称 ;
创建表:
create table 表名 (
字段名称数据类型 ,
字段名称数据类型 ,
...
字段名称数据类型
) ;
数据库中的数据类型
int:整型
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
char:固定长度字符串类型;
varchar:可变长度字符串类型;
text:字符串类型;
blob:字节类型;
date:日期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳类型格式为: yyyy-MM-dd hh:mm:ss
特点: 如果没有给该字段赋值,那么存储的就是当前的时间
查询:
show tables; 显示当前库下的所有的表
desc 表名; 显示表的结构
删除表
drop table 表名称
修改表
1. 添加列:给stu表添加classname列:
alter table stu add (classname varchar(100));
2. 修改列类型:修改stu表的gender列类型为CHAR(2):
alter table stu modify gender CHAR(2);
3. 修改列名:修改stu表的gender列名为sex:
alter table stu change gender sex CHAR(2);
4. 删除列:删除stu表的classname列:
alter table stu drop classname;
5. 修改表名称:修改stu表名称为student:
alter table stu rename to student;
DML
添加和完整约束
增加: insert into 表名 (字段列明集合) values(值得集合) ;
要保证数据的正确性和完整性
完整性约束
主键一条数据在数据库中的唯一标识, 特点: 非空唯一 primary key
主键自增长如果主键的是int,那么如果给主键赋值为null , 会自动根据上一条记录的值+1 ; primary key aoto_increment
唯一 unique
非空 not null
外键
外键约束: 一张表的主键作为另一张表的外键,就保证数据的完整性
注意事项: 主键必须和外键的数据类型一致,名称可以不一致
表和表之间的关系
一对一的关系主外键可以在任意一方
一对多或者多对一的关系外键添加到多的一方
多对多的关系定义中间表,中间表的两个字段都是外键,分别用于关联两个表的主键
删除和修改
删除: delete from 表名 [where 条件] ;
delete from 表名 ; -- 删除所有的数据逐行删除
truncate table 表名 ; -- 删除所有的数据(直接把表删除然后在在创建表)
修改:
update 表名 set 字段名 = 字段值 , 字段名 = 字段值 , ... [where 条件] ;
案例:
创建数据库
create databases mydb ;
查询所有数据库名称
show databases;
删除数据库
drop database stu ;
选择使用的数据库
use mydb ;
创建表
create table student (
-- 字段名数据类型
sid INT ,
sname VARCHAR(20),
gender CHAR(1),
score DOUBLE(4,2),
birthday TIMESTAMP
);
查看表名称
show tables;
删除表
drop table stu ;
查看表结构
desc student ;
修改表结构
修改之添加列:
给stu表添加classname列:
Alter table student add classname vercar(100);
修改之修改列类型:修改stu表的gender列类型为char(2):
ALTER TABLE student MODIFY gender CHAR(2);
修改之修改列名:修改stu表的gender列名为sex:
ALTER TABLE student CHANGE sex gender CHAR(1);
修改之删除列:删除stu表的classname列:
ALTER TABLE student DROP classname;
修改表名称
ALTER TABLE student RENAME TO tb_student;
插入数据
INSERT INTO tb_student(sid,sname,gender,score,birthday) VALUES(1,'风清','男',99.99,'1998-11-11');
INSERT INTO tb_student(sid,sname,gender,score,birthday) VALUES(2,'岳不群','女',88.99,NULL);
INSERT INTO tb_student(sid,sname) VALUES(3,'貂蝉');
INSERT INTO tb_student VALUES(4,'吕布','男',88.99,NULL);
删除数据
DELETE FROM tb_student WHERE sname = '貂蝉';
查询数据
SELECT * FROM tb_student;
清空表中所有记录
TRUNCATE TABLE tb_student;
先删除表
DROP TABLE tb_student;
再创建一张空表
CREATE TABLE tb_student(
字段名数据类型
sid INT ,
sname VARCHAR(20),
gender CHAR(1),
score DOUBLE(4,2),
birthday TIMESTAMP
);
修改数据
UPDATE tb_student SET
gender = '无',
score = 12.88
WHERE
sid = 2;
创建emp表
CREATE TABLE emp(
empno INT, -- 员工编号
ename VARCHAR(50), -- 员工姓名
job VARCHAR(50), -- 员工工种
mgr INT, -- 领导编号
hiredate DATE, -- 入职日期
sal DECIMAL(7,2), -- 工资
comm DECIMAL(7,2), -- 奖金
deptno INT -- 部门编号
) ;
添加数据
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
查询所有列数据
SELECT * FROM emp;
SELECT empno,ename,job FROM emp;
结果集
-- 查询工资是800块的员工信息
SELECT * FROM emp WHERE sal = 800;
-- 查询工资大于等于2500的员工信息
SELECT * FROM emp WHERE sal >= 2500;
-- 查询工资小于等于2500的员工信息
SELECT * FROM emp WHERE sal <= 2500;
-- 查询员工资在1500 到 2500 之间
SELECT * FROM emp WHERE sal >= 1500 AND sal <=2500;
-- 查询员工资在1500 到 2500 之间
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 2500;
-- 查询员工工资是1000 或者2000的人
SELECT * FROM emp WHERE sal = 800 OR sal = 5000;
-- 查询员工工资是1000 或者2000的人
SELECT * FROM emp WHERE sal IN(800,5000);
-- 查询员工工资不是800
SELECT * FROM emp WHERE sal != 800;
SELECT * FROM emp WHERE sal <> 800;
-- 查询有奖金的员工信息
SELECT * FROM emp WHERE comm IS NOT NULL;
-- 查询没有有奖金的员工信息
SELECT * FROM emp WHERE comm IS NULL;
-- 查询姓s的用户
SELECT * FROM emp WHERE ename LIKE 's%';
-- 查询姓名第三个字符是I的用户
SELECT * FROM emp WHERE ename LIKE '__I%';
-- 查询名字有五位的用户
SELECT * FROM emp WHERE ename LIKE '_____';
-- 查询名字包含A的用户
SELECT * FROM emp WHERE ename LIKE '%A%';
-- 起别名
SELECT ename 姓名,sal AS 工资, comm AS 奖金 FROM emp;
SELECT e.ename,e.job FROM emp e;
-- 计算
SELECT ename , sal , comm , (sal+IFNULL(comm,0)) 月薪 FROM emp;
-- 去除重复记录
SELECT DISTINCT sal FROM emp;
DQL
查询:
SELECT selection_list /*要查询的列名称*/
FROM table_list /*要查询的表名称*/
WHERE condition /*行条件*/
GROUP BY grouping_columns /*对结果分组*/
HAVING condition /*分组后的行条件*/
ORDER BY sorting_columns /*对结果排序*/
LIMIT offset_start, row_count /*结果限定*/
基础查询
* 查询所有的列: select * from 表名 ;
* 查询指定的列: select 列名1 , 列名2 , ... from 表名 ;
条件查询
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;
IN(set);
IS NULL;空不能使用 = 或者 != 进行判断. 需要使用is null 或者 is not null ;
AND;
OR;
NOT;
模糊查询
A: 模糊查询:
select 列名1 , 列名2 , ... from 表名 where 字段名 like '值' ;
通配符:
* _ 匹配任意单个字符
* % 匹配任意多个字符
B: 字段控制查
* 去除重复:
SELECT DISTINCT sal FROM emp;
* 字段运算: null 参与的运算结果都是null ; 如果是null我们就认为是0: IFNULL(字段名称 , 要取的值)
* 别名: 使用 AS 关键字
排序查询
A: 排序: order by 字段名 ; 后面可以跟多个排序字段,多个排序字段用”,”隔开
SELECT * FROM stu ORDER BY; 默认是升序
B: 升序: order by 字段名 asc ;
SELECT * FROM stu ORDER BY SUM ASC;
C: 降序: order by 字段名 desc ;
SELECT * FROM stu ORDER BY SUM ASC;
聚合函数和分组
A: 聚合函数: 用来做纵向运算的函数
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
B: 分组查询: group by 分组字段 ;
注意事项: 在分组以后 , 查询的字段只能是分组字段或者聚合函数
* Where在分组之前,having在分组之后
* 在分组之前对结果进行限定,使用where子句
* 在分组之后对结果进行限定,使用having子句
* 需求: 查询每一个部门的工资总和
Select deptno,sum(sal) from emp group by deptno;
* 需求: 查询每个部门的部门编号以及每个部门的人数
Select deptno,count(1) from emp group by deptno;
* 需求: 查询每个部门的部门编号以及每个部门工资大于1500的人数
Select deptno, count(1) from emp where sal>1500 group by deptno;
* 需求: 查询工资总和大于9000的部门编号以及工资和
Select deptno, count(1) from emp group by deptno having sum(sal)>9000;
C: 分页: limit 开始的记录角标 , 每一页的条数 ;
Select * from emp limit 0 , 5 ;
公式: 开始的记录角标 = (页码 - 1) * 每一页的条数
SELECT empno , ename , job from emp ;
SELECT * FROM emp WHERE ename = 'smith';
SELECT * FROM emp WHERE ename != 'smith';
SELECT * FROM emp WHERE ename <> 'smith';
SELECT * FROM emp WHERE sal >= 1100 ;
SELECT * FROM emp WHERE sal >= 1250 AND comm > 400 ;
SELECT * FROM emp WHERE sal >= 1250 OR comm > 400 ;
SELECT * FROM emp WHERE comm IS NULL ;
SELECT * FROM emp WHERE comm IS NOT NULL ;
查询emp表中empno是7369 或者 7499 或者 7521的员工信息
SELECT * FROM emp WHERE empno = 7369 OR empno = 7499 OR empno = 7521 ;
SELECT * FROM emp WHERE empno IN (7369 , 7499 , 7521) ;
SELECT * FROM emp WHERE empno NOT IN (7369 , 7499 , 7521) ;
SELECT * FROM emp WHERE empno BETWEEN 7782 AND 7902 ;
SELECT * FROM emp WHERE ename LIKE '%M%';
_: 表示匹配任意单个字符
%: 表示匹配任意多个字符
查询ename由4个字母组成的员工的数据
SELECT * FROM emp WHERE ename LIKE '____' ;
查询ename由M开始的员工的数据
SELECT * FROM emp WHERE ename LIKE 'M%' ;
SELECT DISTINCT sal FROM emp ;
SELECT * FROM emp ;
null在参与运算的时候结果都是null
ifnull(字段名称 , 值)
SELECT * , sal + comm FROM emp ;
SELECT * , sal + IFNULL(comm , 0) FROM emp ;
as 关键字用来起别名
SELECT * , sal + IFNULL(comm , 0) AS income FROM emp ;
Statement
作用:
boolean execute(String sql): 可以执行所有类型的sql,如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回false
int executeUpdate(String sql): 执行DML , 返回的int类型的值表达的意思是影响的行数
ResultSet executeQuery(String sql): 执行DQL , 返回的ResultSet是存储的查询结果的集合
数据库设计步骤
一、建模过程
需求分析阶段:分析客户的业务和数据处理需求
概要设计阶段:设计数据库的E-R模型图,确认需求信息的正确和完整
详细设计阶段:应用三大范式审核数据库结构
代码编写阶段:物理实现数据库,编码实现应用
软件测试阶段:
二、安装部署:
设计数据库的步骤:
收集信息
与该系统有关人员进行交流、座谈,充分了解用户需求,理解数据库需要完成的任务
标识实体 (Entity)
标识数据库要管理的关键对象或实体,实体一般是名词
标识每个实体的属性(Attribute)
标识实体之间的关系(Relationship)
仅有好的RDBMS并不足以避免数据冗余,必须在数据库的设计中创建好的表结构
Dr E.F.codd 最初定义了规范化的三个级别,范式是具有最小冗余的表结构
这些范式是:
第一范式(1st NF -First Normal Form)
第一范式的目标是确保每列的原子性
如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)
第二范式(2nd NF-Second Normal Form)
如果一个关系满足1NF,并且除了主键以外的其他列,都依赖于该主键,则满足第二范式(2NF,第二范式要求每个表只描述一件事情
第三范式(3rd NF- Third Normal Form)
如果一个关系满足2NF,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)
总结:
为满足某种商业目标,数据库性能比规范化数据库更重要通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间,通过在给定的表中插入计算列(如成绩总分),以方便查询在数据规范化。同时,要综合考虑数据库的性能!
完
码上加油站
一起来加油
长按扫码关注
点“在看”你懂得