JavaWeb——MySQL_总结
2015-09-11 23:35
375 查看
一.mysql:数据库软件
2.1 卸载:1.停止服务
Win+R-->services.msc-->mysql-->右击-->停止服务
2.卸载 win+r-->appwiz.cpl-->mysql-->右击-->卸载
3.手动删除目录
* 找到myql的安装目录”D:\Program Files\MySQL\MySQL Server 5.5” 下的my.ini (mysql的配置文件),
在在这个文件中 找到datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/",找到datadir对应的
文件夹(寻找过程中放开隐藏文件属性),将mysql文件夹删除
* 删除mysql的安装目录
2.2 安装
详见安装文档
2.3访问:
进入: Win+R-->cmd-->mysql -u root -p-->root-->enter
退出: exit--exit
2.4 如何修改root密码
在my.ini的文件做末尾加入 skip-grant-tables
重启mysql服务,这时的mysql不需要密码即可登录数据库
然后进入mysql
mysql>use mysql;
mysql>更新 user set password=password('新密码') WHERE User='root';
mysql>flush privileges;
运行之后最后去掉my.ini中的skip-grant-tables,重启mysqld即可。
2.5 my.ini文件
2.6 各种错误参考安装报错文档
二.SQL:Structured Query Language 结构化查询语言
3.1 概念:用于操作关系型数据库的一门语言,它定义了一种操作关系型数据库的规范
3.2 SQL分类
DDL(*)(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
DML(***)(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
DQL(*****)(Data Query Language):数据查询语言,用来查询记录(数据)。
3.3 DDL:操作数据库和数据表,表中的列
3.3.1 操作数据库
c: create 创建
* create database 数据库名称;
r: read 查询
* show databases; //查询所有的数据库名称
* show create database 数据库名称;//查询创建的数据库的详细信息
u: update 修改
* 修改数据库的编码
alter database 数据库名称 character set 字符集名称;//修改数据库编码
d: delete 删除
* drop database 数据库名称;//删除数据库
3.3.2 操作表:
3.3.2.1 C:创建表
* 数据类型:
int:整型
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
char:固定长度字符串类型; char(5) "aa"
varchar:可变长度字符串类型; varchar(5) "aa"
text:字符串类型;
blob:字节类型;
date:日期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss
* 创建表语法:
create table 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
...
);
create table stu(
id int,
name varchar(20),
age int,
gender varchar(6)
);
* 每一个字段需要使用逗号(,)隔开。 最后一个字段后 不能加 逗号(,)
* 要想创建表,需要进入数据库 use 数据库名称;
* 向仓库的表中插入数据
insert into stu values(2,'mary','male',18,'AA is a good student!','1990-02-23 12:34:44');
insert into stu values(3,'lucy','male',18,'BB is a good student!','1990-02-23 12:34:44');
insert into stu values(4,'lily','female',18,'CC is a good student!','1990-02-23 12:34:44');
insert into stu values(5,'smith','male',18,'DD is a good student!','1990-02-23 12:34:44');
insert into stu values(6,'piter','female',18,'EE is a good student!','1990-02-23 12:34:44');
insert into stu values(7,'jack','female',18,'FF is a good student!','1990-02-23 12:34:44');
* 中文插入乱码的解决方案,执行以下命令
set character_set_client=gbk;
set character_set_results=gbk;
* 查看stu表中的所有数据
select * from stu;
* 完整性约束:保证数据的正确性和完整性
• 非空约束:not null
• 唯一约束:unique
• 主键约束:primary key 非空且唯一。一张表只能有一个主键
• 主键自增长:auto_increment 应该给值null
• 外键约束:foreign key
• 外键关联的必须是另一张表的主键
• 外键和主键之间数据类型必须一致
* 表与表的关系:
* 一对一:如果是一对一的关系,外键在两张表加上都可
* 一对多(多对一):一对多或多对一,外键应该添加在多的一方
* 多对多:多对多的关系,需要使用中间表来关联两张表。中间表的两个字段都是外键
Eg: Create table test(id int ,name varchar(30), FOREIGN KEY (id) REFERENCES tb_tea(id) );
3.3.2.2. R:查询表
* show tables; //查询该库下的所有表名
* desc 表名; // 查询表的详细信息
3.3.2.3.:U修改:
* 修改表中的列(字段):
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;
* 修改表的名称
alter table stu rename student;
3.3.2.4.: D:删除表
* drop table 表名;//删除表 表没有了,表上的数据自然也没有了
3.4 DML: 操作表中的数据 (增、删、改)
3.4.1 查询:
select * from stu;
3.4.2 增:添加数据
向表中插入一行数据(所有列上的数据都插入)
insert into stu values(7,'jack','female',18,'FF is a good student!','1990-02-23 12:34:44');
向表中插入一行数据(部分列上的数据都插入)
insert into stu(stuNum,stuName,stuSex,stuAge) values(7,'jack','female',18);
一次插入多行数据
insert into stu values
(2,'mary','male',18,'AA is a good student!','1990-02-23 12:34:44'),
(3,'lucy','male',18,'BB is a good student!','1990-02-23 12:34:44'),
(4,'lily','female',18,'CC is a good student!','1990-02-23 12:34:44'),
(5,'smith','male',18,'DD is a good student!','1990-02-23 12:34:44'),
(6,'piter','female',18,'EE is a good student!','1990-02-23 12:34:44'),
(7,'jack','female',18,'FF is a good student!','1990-02-23 12:34:44');
3.4.3 删除数据
删除部分数据
delete from stu where stuNum>=6;
delete
4000
from tbName [where 条件];
删除全部数据
delete from stu; //删除表中的全部数据
truncate stu; //截断表中的数据 效率高
3.4.4 改:修改表中的数据
* update 表名 set 字段名称1=值1, 字段名称2=值2... [where 条件];
* update stu set stuAge=20; //更新所有人的年纪为20
* update stu set stuAge=20 where stuNum=5; //更新学号为5的学生的年龄
* update stu set stuName='jack' ,stuSex='female', stuAge=19 , stuSelf='jack is a good student' where stuNum=5;
修改学号为5的学生的姓名为jack,性别为female,年龄为19,自我简介为”jack is a good student”
3.5 DQL:查询表中的数据
3.5.1 语法:
select 字段名1 ,字段名2,..... From 表名 where [条件];
3.5.2 条件查询:
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;
IN(set);
IS NULL;
AND;
OR;
NOT;
导入初始化语句 Init_Stu.sql
-- select 字段名1,字段名2 .... FROM tableName where [条件];
-- 查询所有的学生信息 查询所有列
SELECT * FROM stu; -- 效率比较低
SELECT stuId,stuNum,stuName,stuSex,stuAge,stuQQ,stuAddr,stuSkillScore,stuQualityScore FROM stu; --相对上条语句效率高
-- 查询所有的学生的学号和姓名 查询部分列
SELECT stuNum,stuName FROM stu;
-- 查询所有男生的信息 1个限制条件
SELECT stuId,stuNum,stuName,stuSex,stuAge,stuQQ,stuAddr,stuSkillScore,stuQualityScore FROM stu WHERE stuSex='男';
-- 查询所有19岁男生的学号和姓名 2个限制条件 = and
SELECT stuNum,stuName FROM stu WHERE stuSex='男' AND stuAge=19;
-- 查询所有大于19岁男生的全部信息 2个限制条件 > &&
SELECT * FROM stu WHERE stuAge>19 AND stuSex='男';
-- 查询所有大于20岁或小于19岁同学的学号和姓名 or
SELECT stuNum,stuName FROM stu WHERE stuAge>20 OR stuAge<19;
-- 查询所有大于等于18岁同时小于等于21岁同学的学号和姓名 >= <= between and
SELECT stuNum,stuName FROM stu WHERE stuAge>=18 AND stuAge<=21;
SELECT stuNum,stuName FROM stu WHERE stuAge BETWEEN 18 AND 21;
-- 查询所有18岁的男生的全部信息或者年龄小于22岁的女生的全部信息 || ()
SELECT * FROM stu WHERE (stuAge=18 AND stuSex='男' ) OR ( stuAge < 22 AND stuSex='女' ) ;
-- 查询不是19岁学生的信息 !
SELECT * FROM stu WHERE stuAge !=19;
-- 查询18岁,20岁,22岁的所有男同学的姓名和性别 in
SELECT stuName,stuSex FROM stu WHERE stuSex='男' AND (stuAge =18 OR stuAge = 20 OR stuAge =22);
SELECT stuName,stuSex FROM stu WHERE stuSex='男' AND stuAge IN(18,20,22);
-- 查询家乡不明确的学生的信息
-- select * from stu where stuAddr = null; -- 包含null值的查询,我们不用=
SELECT * FROM stu WHERE stuAddr IS NULL;
3.5.3 模糊查询:
* like
* 通配符:
_:任意单个字符
%:任意多个字符
-- 查询姓"张"的学生的所有信息
SELECT * FROM stu WHERE stuName LIKE '张%';
-- 查询所有河北的学生
SELECT * FROM stu WHERE stuAddr LIKE '河北%';
-- 查询名字中包含a字符的学生的所有信息
SELECT * FROM stu WHERE stuName LIKE '%a%';
-- 查询QQ号码中包含5的所有学生的姓名和性别
SELECT stuName,stuSex FROM stu WHERE stuQQ LIKE '%5%';
-- 查询姓名2个字符,结尾为"明"的学生的所有信息
SELECT * FROM stu WHERE stuName LIKE '_明';
3.5.4字段控制
* null参与的运算,结果还为空
* 使用ifnull解决
ifnull(字段名称,0):判断字段是否为null 如果为null 就替换为0
* 别名: as(也可以不用,使用空格)
* 去除重复记录:DISTINCT
-- 查询所有学生的学号,姓名,性别,年龄,技能分,综合素质分,总成绩
SELECT stuNum,stuName,stuSex,stuAge,stuSkillScore,stuQualityScore,(stuSkillScore + IFNULL(stuQualityScore,0)) FROM stu;
-- 查询所有学生的学号,姓名,性别,年龄 要求显示结果集中的列名为中文 列的别名
SELECT stuNum AS 学号,stuName 姓名,stuSex 性别,stuAge 年龄,stuSkillScore 技能分,stuQualityScore 综合素质分,(stuSkillScore + IFNULL(stuQualityScore,0)) 总成绩 FROM stu;
-- 查询所有学生的家乡分布,去除多余选项
SELECT DISTINCT stuAddr FROM stu;
-- 查询所有学生的学号,姓名,性别,年龄,技能分,综合素质分,总成绩 表的别名
SELECT s.stuNum,s.stuName,s.stuSex,s.stuAge,stuSkillScore,stuQualityScore,(stuSkillScore + IFNULL(stuQualityScore,0)) FROM stu s;
3.5.5 排序:
* order by 字段名称 排序方式
* 排序方式:
* asc :默认值,升序
* desc:降序
* 聚合函数
聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
-- 查询学生的全部信息,以技能分降序排列 单条件排序
SELECT * FROM stu ORDER BY stuSkillScore DESC;
-- 查询学生的全部信息,以技能分降序排列,技能分相同的条件下,以综合素质分降序排序 多条件排序
SELECT * FROM stu ORDER BY stuSkillScore DESC ,stuQualityScore DESC ;
-- 查询学生的人数
SELECT COUNT(*) FROM stu; -- 效率低
SELECT COUNT(stuId) FROM stu; -- 效率高
-- 查询学生的平均年龄,最大年龄,最小年龄
SELECT AVG(stuAge) 平均年龄 ,MAX(stuAge) 最大年龄 ,MIN(stuAge) 最小年龄 FROM stu;
3.5.6 分组查询
* group by 字段
* 注意:在查询的字段中,建议只写分组字段和聚合函数
* 分组之后的条件筛选:having
* where 和 having 区别?
where 在分组前对数据进行过滤
having 在分组后进行过滤
-- 查看男生和女生的人数 单条件分组
SELECT stuSex,COUNT(*) FROM stu GROUP BY stuSex
-- 查看不同年龄段男生和女生的人数 多条件分组
SELECT stuAge , stuSex,COUNT(stuId) FROM stu GROUP BY stuAge , stuSex;
-- 查看2015JavaEE学科男生和女生的人数 条件过滤之后再进行分组
SELECT stuSex,COUNT(stuId) FROM stu WHERE stuNum LIKE '2015JavaEE%' GROUP BY stuSex;
-- 学习人数大于3个学员集中在哪些年龄 分组之后进行过滤
SELECT stuAge,COUNT(stuId) AS num FROM stu GROUP BY stuAge HAVING num>3;
3.5.7. 时间日期函数
* 获得当前日期+时间(date + time)函数:now()
* MySQL 获得当前时间戳函数:current_timestamp()
* 获取指定时间的年份,月份 year() month()
3.5.8 union all
3.5.7多表查询
* 笛卡尔积:
DROP TABLE xx;
DROP TABLE yy;
CREATE TABLE XX( aa INT, bb INT);
CREATE TABLE YY( cc INT, dd INT );
INSERT INTO XX VALUE(1,1),(2,2);
INSERT INTO YY VALUE(3,3),(4,4);
SELECT * FROM XX;
SELECT * FROM YY;
SELECT * FROM xx,yy; --SQL 92语法
SELECT * FROM xx JOIN yy; --SQL 99语法
* 内连接:等值连接 =
DELETE FROM xx;
DELETE FROM yy;
INSERT INTO XX VALUE(1,1),(2,2);
INSERT INTO yy VALUE(1,1),(3,3);
SELECT * FROM xx JOIN yy ON xx.aa=yy.cc;
* 外连接
* 左外连接
* 右外连接
SELECT * FROM XX LEFT JOIN YY ON xx.aa=yy.cc;
SELECT * FROM XX RIGHT JOIN YY ON xx.aa=yy.cc;
* 自连接
查询员工的姓名,职务以及上司的姓名.
SELECT e1.empName,e1.empSelf,e2.empName FROM emp e1 JOIN emp e2 ON e1.bossId=e2.empNum;
总结:我们开发的时候一般能够按照需求正确的建立好各种表即可,更改表结构的几率不是很多.重点是对数据的操作.
所以咱们今天的重点就是:
* 创建仓库
* 创建表(正确的使用各种约束,正确的创建具有关联关系的表)
* 表中数据增删改查操作
* 多表查询是今天的重难点
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- Android之获取手机上的图片和视频缩略图thumbnails
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- 数据库链接字符串查询网站
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法