MySQL学习笔记
2016-01-24 10:37
791 查看
MySQL数据库
* 数据库
* 数据库就是一个文件系统,访问数据的时候需要通过标准的SQL语言来完成。
多表操作
外键约束
有一个部门的表,还有一个员工表,
create database day16;
use day16;
create table dept(
did int primary key auto_increment,
dname varchar(30)
);
create table emp(
eid int primary key auto_increment,
ename varchar(20),
salaly double,
dno int
);
insert into dept values(null,’研发部’);
insert into dept values(null,’销售部’);
insert into dept values(null,’人事部’);
insert into dept values(null,’扯淡部’);
insert into dept values(null,’牛宝宝部’);
insert into emp values(null,’班长’,10000,1);
insert into emp values(null,’美美’,10000,2);
insert into emp values(null,’小凤’,10000,3);
insert into emp values(null,’如花’,10000,2);
insert into emp values(null,’芙蓉’,10000,1);
insert into emp values(null,’东东’,800,null);
insert into emp values(null,’波波’,1000,null);
update emp set salaly=2500 where eid = 5;
* 数据库
* 数据库就是一个文件系统,访问数据的时候需要通过标准的SQL语言来完成。
* 关系型的数据 * 保存的实体与实体之间的关系。(用户、商品、订单) * 常见的数据库 * Oracle 公司Oracle(甲骨文)数据产品,收费的大型的数据库。 * MySQL 开源的,被Oracle收购了,小型的数据库。5.x版本免费,6.x收费了。 * SQLServer 微软的,收费的中型的数据库。 * DB2 IBM公司收费的大型的数据库。 * SyBASE PowerDigener软件(非常牛) * MySQL的简介 * 卸载干净 * 找到MySQL的安装路径,找到my.ini的配置文件。 * basedir="C:/Program Files (x86)/MySQL/MySQL Server 5.5/" 安装的路径 * datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/" MySQL存储数据的路径 * 通过控制面板卸载MySQL * 找到上面的两个路径,删除就ok了。 * 安装了 * 安装路径不要有中文(*****) * MySQL默认端口是3306,不要修改。 * 设置MySQL的编码集(采用UTF-8的编码) * 要把黑窗口的勾勾选上。 * 设置用户名的密码:两行都是密码,第一行是密码,第二行是确认密码。 * 安装完成。 * 访问: cmd > 输入命令 mysql -u root -p 回车 输入密码 回车 * 密码重置 1.停止mysql服务: services.msc 进入到服务界面 2.在cmd>输入一个命令: mysqld --skip-grant-tables (开启一个mysql服务,不需要进行认证.) 3.新打开一个cmd窗口 mysql -u root -p 不需要输入密码.就可以进入. 4.输入命令 show databases;查看数据库,输入命令 use mysql;使用mysql数据库。 5.修改密码的语句: update user set password=password('root') WHERE user='root'; 6.将两个窗口都关闭. 7.任务管理器中结束(mysqld)进程. 8.重启mysql服务 * MySQL之间的关系(看图) * 总结:一个数据库的服务器中有多个数据库,一个数据库中有多个表, 每个表有多个字段。字段和Java中类的属性是对应的。 每一条记录对应是一个Java实例对象。 * SQL语句(*****) * SQL的简介 * Structured Query Language, 结构化查询语言 * 非过程性的语言 * 过程性的语言:我下一条语句,需要依赖上一条或者上几条语句。 * 非过程性的语言:写一条语句,就会执行一个结果。 * Oracle开发PL/SQL,只能在Oracle使用。 * SQL Server、Sybase的T-SQL * SQL语言分类 * DDL(数据定义语言) * 创建数据库、创建表 * DML(数据操纵语言)(*****) * 插入数据(insert) 修改数据(update) 删除数据(delete) * DCL (数据控制语言) * if else * DQL(数据查询语言)(*****) * 查询数据 select * 数据库(CURD -- 增删改查) * 创建数据库 * 语法:create database 数据名称; 创建一个数据了。 * create database 数据库名称 character set 编码 collate 校对规则; * 校对规则:和编码是成对出现的。 * 练习 创建一个名称为mydb1的数据库。 create database mydb1; 创建一个使用utf8字符集的mydb2数据库。 create database mydb2 character set 'utf8'; 创建一个使用utf8字符集,并带校对规则的mydb3数据库。 create database mydb3 character set 'utf8' collate 'utf8_bin'; * 查看数据库 show databases; * 查询数据库的定义 show create database 数据库; show create database mydb2; * 删除数据库 drop database 数据库名称; 练习 查看当前数据库服务器中的所有数据库 show databases; 查看前面创建的mydb2数据库的定义信息 show create database mydb2; 删除前面创建的mydb1数据库 drop database mydb1; * 修改数据库 * 语法:alter database 数据库 character set 编码 collate 校对规则; * 练习:查看服务器中的数据库,并把其中某一个库的字符集修改为gbk alter database mydb2 character set 'gbk'; * 其他的操作 * 切换数据库(*****) use db_name; * 查看当前使用的数据库 select database(); * 表(table)(CURD -- 增删改查) * 语法: create table 表名( 字段1 类型(长度) 约束, 字段2 类型(长度) 约束, 字段3 类型(长度) 约束, 字段4 类型(长度) 约束 ); 注意: * 表名小括号,后面要有分号。 * 每一行字段后面要有逗号,但是最后一行没有逗号。 * 数据的类型后面有长度,如果是字符串类型,长度必须加。如果其他类型可以不加。默认长度。int 默认长度11 public class User{ int id; String name; String pass; String eamil; String nikename; } * 数据的类型 字符串型 VARCHAR、CHAR * varchar和char区别: * varchar(经常使用) 长度是可变的。 name varchar(8) 存入数据hello,但是如果存入helloworld报错了。 * char 长度不可变的。 name char(8) 存入的数据hello,如果不够用空格补全。 * 效率高:char效果。 大数据类型(一般不用) BLOB、TEXT BLOB:二进制文件 TEXT:字符 数值型 TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE 逻辑性 对应boolean BIT 日期型 DATE、TIME、DATETIME、TIMESTAMP * date 只包含日期 * time 只包含时分秒 * datetime和timestamp包含日期和时分秒区别: * datetime需要手动录入时间。 * timestamp不传入数据,默认选择当前系统时间。 * 练习,创建表的练习 create table employee( id int, name varchar(20), gender varchar(10), birthday date, entry_date date, job varchar(100), salary double, resume text ); * 约束(单表) * 主键约束(*****) * 标识标记该条记录。 通过pramary key声明主键。(默认唯一、非空) * auto_increment 数据库维护主键。自动增长。 * 唯一约束 * 值是唯一的。使用unique声明 * 非空约束 * 值不能为空 not null * 创建新的标签employee2,把约束加上。 create table employee2( id int primary key auto_increment, name varchar(20) unique not null, gender varchar(10) not null, birthday date not null, entry_date date not null, job varchar(100) not null, salary double not null, resume text not null ); * 使用desc 表名; 查看表的信息 * show tables ; 查看当前库内所有表名 * show create table 表名; 查看建表语句和字符集 * 删除表 drop table employee2; * 修改表 alter table 表名 add 字段 类型(长度) 约束; -- 添加字段 alter table 表名 drop 字段; -- 删除字段 alter table 表名 modify 字段 类型(长度) 约束; -- 修改类型或者约束 alter table 表名 change 旧字段 新字段 类型(长度) 约束 -- 修改字段的名称 rename table 表名 to 新表名; -- 修改表名 alter table 表名 character set utf8; -- 修改字符集 * 练习 在上面员工表的基本上增加一个image列。 alter table employee add image varchar(20); 修改job列,使其长度为60。 alter table employee modify job varchar(60); 删除gender列。 alter table employee drop gender; 表名改为user。 rename table employee to user; 修改表的字符集为utf8 alter table user character set utf8; 列名name修改为username alter table user change name username varchar(30); * 数据(CURD -- 增删改查)(******) * 添加数据 * insert into 表名 (字段1,字段2,字段3..) values(值1,值2,值3...); 有几列就插入多少的值。 * insert into 表名 values(值1,值2,值3...); 插入所有的列 * 注意: * 数据与字段的类型相同。 * 字段长度需要控制。 * 字符串或者日期类型需要使用'' * 向user表中插入数据 insert into user values (1,'xiaofeng','1994-10-10','2011-1-1','HR',19000,'aaa','abc'); insert into user values (2,'美美','1994-10-10','2011-1-1','HR',19000,'aaa','abc'); insert into user values (3,'小风','1994-10-10','2011-1-1','WORKER',21000,'aaa','abc'); insert into user values (4,'芙蓉','1994-10-10','2011-1-1','HR',1000,'aaa','abc'); insert into user values (5,'班长','1994-10-10','2011-1-1','HR',100,'aaa','abc'); * 解决中文乱码的问题(*****) [client] port=3306 [mysql] default-character-set=gbk * 修改完需要重新启动服务。 * 修改语句 * 语法: update 表名 set 字段=值,字段=值... [where ] * 如果没有where条件,默认更新所有的记录。 * 有where提交,选择某一条记录。 将所有员工薪水修改为5000元。 update user set salary=5000; 将姓名为’班长’的员工薪水修改为3000元。 update user set salary=3000 where username='班长'; 将姓名为’美美’的员工薪水修改为4000元,job改为BOSS。 update user set salary=4000,job='BOSS' where username='美美'; 将班长的薪水在原有基础上增加1000元。 update user set salary = salary+1000 where username='班长'; * 删除数据 delete 语法:delete from 表名 [where ]; 删除数据 truncate 表名; 删除所有的数据 * truncate 和 delete的区别: * truncate删除数据,先删除整个表。再创建一个新的空的表。(效率) * delete删除数据,一条一条删除的。(*****) * 事物(insert update delete) 删除表中名称为’班长’的记录。 * delete from user where username='班长'; 删除表中所有记录。 * delete from user; 使用truncate删除表中记录。 * truncate user; * 查询语句 * 语法: select * from 表名; 查询所有(字段) select 字段名1,字段名2,字段名3 from 表名; 显示查询字段名 select DISTINCT 字段名 from 表名; 去除重复的数据。 查询表中所有学生的信息。 select * from stu; 查询表中所有学生的姓名和对应的英语成绩。 select name,english from stu; 过滤表中重复数据。(面试题) select distinct english from stu; * 查询的列可以运算 * 可以使用别名:使用as 别名 并且as可以省略。 练习: 在所有学生分数上加10分特长分。 select name,math+10,english+10,chinese+10 from stu; 统计每个学生的总分。 select name,math+english+chinese from stu; 使用别名表示学生分数。 select name,(math+english+chinese) as sum from stu; * 使用where条件过滤 查询姓名为班长的学生成绩 select * from stu where name='班长'; 查询英语成绩大于90分的同学 select name,english from stu where english < 15; 查询总分大于200分的所有同学 select name,math+english+chinese from stu where (math+english+chinese) > 200; * 常用的符号 > < <= >= = <>(不等于) in(范围内取内容) like -- 模糊查询 写法:like '张_或者%'; _和%区别:占位符。_只一个%可以有多个 %的写法 like '%张'; 结果XXX张 like '张%'; 结果张XXX like '%张%'; 只要有张就行 is null -- 判断是否为null and -- 并且 or -- 或者 not -- 不成立 * 练习 查询英语分数在 80-90之间的同学。 select * from stu where english >80 and english <90; select * from stu where english between 80 and 90; 查询数学分数为18,78,46的同学。(in) select * from stu where math in(18,78,46); 查询所有姓班的学生成绩。 select * from stu where name like '班%'; 查询数学分>80,语文分>80的同学。 select * from stu where math >80 or chinese > 80; * 排序 使用order by 升序默认的(asc)/降序(desc) * 出现select的语句末尾。 练习 对数学成绩排序后输出。 select name,math from stu order by math; 对总分排序按从高到低的顺序输出 select name,math+english+chinese from stu order by (math+english+chinese) desc; 对学生成绩按照英语进行降序排序,英语相同学员按照数学降序 select * from stu order by english desc,math desc; 对姓美的学生成绩排序输出 select * from stu where name like '美%' order by english desc; * 聚集函数 * count 获取数量 练习: 统计一个班级共有多少学生? select count(*) from stu; 统计数学成绩大于90的学生有多少个? select count(*) from stu where math > 90; 统计总分大于150的人数有多少? select count(*) from stu where (math+english+chinese) > 150; * sum 求和(忽略null值) 可以同ifnull(xxx,0) 统计一个班级数学总成绩? select sum(math) from stu; 统计一个班级语文、英语、数学各科的总成绩 select sum(math),sum(english),sum(chinese) from stu; 统计一个班级语文、英语、数学的成绩总和 select sum(ifnull(math,0)+english+chinese) from stu; select sum(math)+sum(english)+sum(chinese) from stu; 统计一个班级语文成绩平均分 select sum(chinese) / count(*) from stu; * avg 平均数 练习: 求一个班级数学平均分? select avg(math) from stu; 求一个班级总分平均分 select avg(ifnull(math,0)+english+chinese) from stu; * max 最大值 select max(math) from stu; * min 最小值 select min(math) from stu; * group by 分组(一起使用) 条件过滤需要是having,不能使用where 练习:对订单表中商品归类后,显示每一类商品的总价. select product,count(*),sum(price) from orders group by product; 练习:查询购买了几类商品,并且每类总价大于100的商品 select product,sum(price) from orders group by product having sum(price) > 100; * 小结 select 语句 : S-F-W-G-H-O 组合 select ... from ... where ... group by... having... order by ... ; 顺序不能改变
多表操作
外键约束
有一个部门的表,还有一个员工表,
create database day16;
use day16;
create table dept(
did int primary key auto_increment,
dname varchar(30)
);
create table emp(
eid int primary key auto_increment,
ename varchar(20),
salaly double,
dno int
);
insert into dept values(null,’研发部’);
insert into dept values(null,’销售部’);
insert into dept values(null,’人事部’);
insert into dept values(null,’扯淡部’);
insert into dept values(null,’牛宝宝部’);
insert into emp values(null,’班长’,10000,1);
insert into emp values(null,’美美’,10000,2);
insert into emp values(null,’小凤’,10000,3);
insert into emp values(null,’如花’,10000,2);
insert into emp values(null,’芙蓉’,10000,1);
insert into emp values(null,’东东’,800,null);
insert into emp values(null,’波波’,1000,null);
update emp set salaly=2500 where eid = 5;
* 把研发部删除? * 研发部下有人员?该操作不合理。 * 引入外键约束? * 作用:保证数据的完整性。 * 添加外键 语法:alter table emp add foreign key 当前表名(dno) references 关联的表(did); alter table emp add foreign key emp(dno) references dept(did); * 数据库的设计 * 一对多 生活中一个部门下有多个员工,一个员工属于一个部门。 * 在多方需要添加一个字段,并且和一放主键的类型必须是相同的。 * 把该字段作为外键指向一方的主键。 * 一方部门 * 多方员工 * 多对多 * 学生可以选择多门课程,课程又可以被多名学生选择。 * 建表原则: * 拆开两个一对多的关系,中间创建一个中间表,至少有两个字段。作为外键指向两个多对多关系表的主键。 * 一对一(了解) * 公司,地址,一个公司对应的是一个地址。 一张表包含公司名称、公司地址。 * 根据公司的业务需求,会把公司这张表拆开,形成一对一。 * 建表原则 * 主键对应 * 唯一外键对应 * 假如有一个(简单)购物的网站 * 包含哪些实体? 用户 订单 商品 分类 * 多表的查询 * 笛卡尔积的概念:(了解) 表A 表B aid aname bid bname a1 aa1 b1 bb1 a2 aa2 b2 bb2 b3 bb3 * 查询的语法 select * from 表A,表B; 返回的结果就是笛卡尔积。 结果: a1 aa1 b1 bb1 a1 aa1 b2 bb2 a1 aa1 b3 bb3 a2 aa2 b1 bb1 a2 aa2 b2 bb2 a2 aa2 b3 bb3 select * from dept,emp; * 多表查询 * 内连接(用的比较多) * 普通内连接 * 前提条件:需要有外键的。 * 提交关键字 inner join ... on select * from dept inner join emp on dept.did = emp.dno; * 隐式内连接(用的是最多的) * 可以不使用inner join ... on关键字 select * from dept,emp where dept.did = emp.dno; * 外连接 * 左外链接(看左表,把左表所有的数据全部查询出来) * 前提条件:需要有外键的。 * 语法: 使用关键字 left [outer] join ... on select * from dept left outer join emp on dept.did = emp.dno; * 右外链接(看右表,把右表所有的数据全部查询出来) * 前提条件:需要有外键的。 * 语法: 使用关键字 right [outer] join ... on select * from dept right join emp on dept.did = emp.dno; * 子查询 * 查询的内容需要另一个查询的结果。 select * from emp where ename > (select * from emp where 条件); any 任意 all 全部 >any 大于结果的最小值 >all 大于结果的最大值
相关文章推荐
- mysql外键约束
- VS2013与MySql建立连接;您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧
- 清空mysql表后,自增id复原
- mysql笔记03 查询性能优化
- mysql 分表真正的意义在哪里?
- mysql中如何提高大表之间复制效率
- MySQL优化技巧之二(sql优化总结)
- mysql字符集和校对规则(Mysql校对集)
- MySQL 主键与索引的联系与区别分析
- MySQL的表分区
- mysql-5.7.10-winx64 安装时遇到的问题
- MySQL存储过程中的3种循环
- 使用 sysbench对mysql进行压力测试介绍之一
- MySQL数据库事务隔离级别(Transaction Isolation Level)
- SqlServer Mysql数据库修改自增列的值及相应问题的解决方案
- mac 10.11 安装mysql5.7.10压缩版
- win7重启 MySQL服务丢失解决方法
- Mysql为什么企业一般使用InnoDB引擎而不是使用效率更高的MyISAM引擎?
- mysql集群方案整理之Galera Cluster简介
- mysql双主使用reset master清除日志要小心