黑马程序员技术交流社区

标题: 『黑马程序员济南』JavaEE就业笔记串讲--MySQL [打印本页]

作者: 小鲁哥哥    时间: 2017-8-24 17:35
标题: 『黑马程序员济南』JavaEE就业笔记串讲--MySQL
本帖最后由 小鲁哥哥 于 2017-8-24 17:39 编辑

『黑马程序员济南』JavaEE就业笔记串讲--MySQL


1.1.1  MySQL的概述:
1.1.1.1        什么是数据库:
数据库:就是一个文件系统,这个文件必须通过标准的SQL访问.
1.1.1.2        什么是关系型数据库:
关系型的数据库存放的都是实体之间的关系.
关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加•科德于1970年首先提出的,并配合“科德十二定律”。现如今虽然对此模型有一些批评意见,但它还是数据存储的传统标准。标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。
1.1.1.3        常用的关系型数据库:
MySQL                :免费的小型的数据库,现在被Oracle收购.
Oracle                :Oracle公司收费的大型的数据库.
SQLServer        :微软公司收费中型的数据库.
DB2                        :IBM公司收费的大型的数据库.
SyBase                :SyBase公司收费的数据库.已经被淘汰.PowerDesigner数据建模的工具.
SQLite                :小型的嵌入式的数据库.
***** Java程序中经常使用的数据库
MySQL
Oracle

1.1.2  SQL的概述:
1.1.2.1        什么是SQL:
SQL:结构化的查询语言.
1.1.2.2        SQL分类:
DDL:数据定义语言
    * create,alter,drop...
DML:数据操纵语言
    * update,insert,delete
DCL:数据控制语言
    * grant,if..
DQL:数据查询语言
    * select
1.1.2.3        SQL的特点:
非过程性语言:一条语句就会有一个运行的结果.

1.1.3  使用SQL
1.1.3.1        对库的CRUD的操作
【创建数据库】
语法:
* create database 数据库名称 [character set 字符集 collate 字符集校对];
练习:
* 创建db1;
    *
[SQL] 纯文本查看 复制代码
 create database db1;

* 创建一个带有字符集的数据库db2;
    *  
[SQL] 纯文本查看 复制代码
create database db2 character set gbk;

* 创建一个带有字符集和校对规则的数据库db3;
    *
[SQL] 纯文本查看 复制代码
create database db3 character set utf8 collate  utf8_bin;

【查看数据库】
语法:
* 查看数据库服务器中所有的数据库:
    *
[SQL] 纯文本查看 复制代码
show databases;

* 查看某个数据库的定义信息.
    *
[SQL] 纯文本查看 复制代码
show create database 数据库名;

* 查看当前正在使用的数据库信息.
    *
[SQL] 纯文本查看 复制代码
select database();

【删除数据库】
语法:
* 删除数据库:
    * drop database 数据库名;
【修改数据库】
语法:
* 修改数据库修改的是的数据库的字符集和校对规则.
    * alter database 数据库名 character set 新字符集 collate 校对规则;
【切换数据库】
语法:
* use 数据库名称;
1.1.3.2        对表CRUD的操作
【创建表】
        语法:
* create table 表名 (
    字段名 类型(长度) 约束,
    字段名 类型(长度) 约束,
    字段名 类型(长度) 约束
);
        约束:
单表约束:
* 主键约束:primary key (默认就是唯一非空的)
* 唯一约束:unique
* 非空约束:not null
        创建一个表:
        ***** 创建表之前先选择数据库:use 某个数据库;
[SQL] 纯文本查看 复制代码
create table employee(
    eid int primary key auto_increment,
    ename varchar(20) not null,
    email varchar(30) unique,
    birthday date,
    job varchar(20),
    resume text
);

【表的查看】
        查看数据库中有哪些表:
*
[SQL] 纯文本查看 复制代码
show tables;

        查看表结构:
* desc 表名;
【表的删除】
        表的删除:
* drop table 表名;
【表的修改】
    修改表添加列:
* alter table 表名 add 列名 类型(长度) 约束;
     
[SQL] 纯文本查看 复制代码
alter table employee add image varchar(50);

   修改表删除列:
* alter table 表名 drop 列名;
   
[SQL] 纯文本查看 复制代码
alter table employee drop job;

    修改表的列的类型长度及约束:
* alter table 表名 modify 列名 类型(长度) 约束;
   
[SQL] 纯文本查看 复制代码
alter table employee modify image varchar(80) not null;

     修改表的列名
* alter table 表名 change 旧列名 新列名 类型(长度) 约束;
   
[SQL] 纯文本查看 复制代码
alter table employee change image eimage varchar(60);

    修改表名
* rename table 旧表名 to 新表名;
   
[SQL] 纯文本查看 复制代码
rename table employee to user;

        修改表的字符集:
* alter table 表名character set 字符集;
   
[SQL] 纯文本查看 复制代码
alter table user character set gbk;


1.1.3.3        对表中记录的CRUD的操作
【插入记录】
        语法
* insert into 表名 (列名,列名,...) values (值1,值2,...);                ---插入指定列的值
* insert into 表名 values (值1,值2,...);                                        ---插入所有列的值
        注意事项:
* 列名的个数与值的个数对应.
* 列的类型与值的类型对应.位置也要对应.
* 列的类型如果是字符串或者日期,写值的时候使用单引号将值引起来.
* 插入的值的最大长度不能超过列的最大长度.
        插入记录:
* 插入某几列的值:
    *
[SQL] 纯文本查看 复制代码
insert into employee (eid,ename,email) values (null,'aaa','aaa@itcast.cn');

* 插入所有列的值:
    *
[SQL] 纯文本查看 复制代码
insert into employee values (null,'bbb','bbb@itcast.cn','1990-09-01','HR','I am HR');

        插入中文:
[SQL] 纯文本查看 复制代码
insert into employee (eid,ename,email) values (null,'张三','aaa@163.cn');

ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'ename' at row 1
***** 插入中文问题的解决:
*
[Shell] 纯文本查看 复制代码
show variables like '%character%';


**** 重新加载mysql的配置文件:
* services.msc
* 停止mysql的服务,重新启动mysql服务.
* 执行之前的SQL语句.
【修改记录】
        语法:
* update 表 set 列名=值,列名=值 [where 条件];
        注意事项:
* 列名和值类型也要一致.
* 值不能超过列的最大长度.
* 值是字符串或日期,需要使用单引号.
【删除记录】
        语法:
* delete from 表 [where 条件];
        注意事项:
* 删除表中的一行记录,不能删除某列值
* 如果没有条件删除表中的所有列.
        练习:
* 删除id为8的记录:
    *
[SQL] 纯文本查看 复制代码
 delete from employee where eid = 8;

* 删除所有记录:
    *
[SQL] 纯文本查看 复制代码
delete from employee;

        删除表中的所有记录truncate table 表名  和 delete from 表  区别?
* 区别:
    * truncate table 删除表的记录:将整个表删除掉,重新创建一个新的表.truncate属于DDL.
    * delete from 删除表的记录:一条一条进行删除. delete属于DML。
        * 事务管理 只能作用在DML语句上.如果再一个事务中使用delete删除所有记录,可以找回.
【基本查询】
        查询语句:
* select [distinct] *|列名 from 表 [where 条件];
        准备:
[SQL] 纯文本查看 复制代码
create table exam(
        id int primary key auto_increment,
        name varchar(20),
        english int,
        chinese int,
        math        int
);

[SQL] 纯文本查看 复制代码
insert into exam values (null,'张三',85,74,91);
insert into exam values (null,'李四',95,90,83);
insert into exam values (null,'王五',85,84,59);
insert into exam values (null,'赵六',75,79,76);
insert into exam values (null,'田七',69,63,98);
insert into exam values (null,'李四',89,90,83);

        查询所有记录:
*
[SQL] 纯文本查看 复制代码
select * from exam;

        查询这个班级人的姓名和英语成绩:
*
[SQL] 纯文本查看 复制代码
select name,english from exam;

        查询英语成绩,将重复英语成绩去掉:
*
[SQL] 纯文本查看 复制代码
select distinct english from exam;

        查询李四的学生成绩:
[SQL] 纯文本查看 复制代码
select * from exam where name='李四';

        查询名称叫李四并且英语成绩大于90的
[SQL] 纯文本查看 复制代码
select * from exam where name='李四' and english >90;

        将成绩+10分进行显示:
[SQL] 纯文本查看 复制代码
select name ,english+10,chinese+10 ,math+10 from exam;

        显示这个人的名称和对应总成绩的分数:
[SQL] 纯文本查看 复制代码
select name,english+chinese+math from exam;

        使用as起别名,as可以省略.
[SQL] 纯文本查看 复制代码
select name , english+chinese+math as sum from exam;

【条件查询】
        where语句后面可以加:
条件的关键字:
= , > , >= , <, <= , <>
like中可以使用占位符: _ 和 %  :下划线匹配一个字符, %:可以匹配任意多个字符.
* like ‘张%’;  like ‘张_’; like ‘%明’; like ‘%明%’;
in 后跟着一组值.
* id in (1,2,3)
and or not
【排序查询】
   order by 对数据进行排序.默认升序. (asc升序,desc降序)
* 查询所有学生的信息,并且按语文成绩进行排序.
    *
[SQL] 纯文本查看 复制代码
select * from exam order by chinese;

* 查询所有学生的信息,并且按语文成绩进行降序排序.
    *
[SQL] 纯文本查看 复制代码
select * from exam order by chinese desc;

* 查询学生的信息,按照英语成绩降序排序,如果英语成绩相同,按照语文降序.
    *
[SQL] 纯文本查看 复制代码
select * from exam order by english desc, chinese desc;

* 查询姓李的学生的信息,同时按照英语升序排序.
    *
[SQL] 纯文本查看 复制代码
select * from exam where name like '李%' order by english asc;

【聚合函数】
        sum()
        count()
        max()
        min()
        avg()
* 查询每个学生总成绩:
   
[SQL] 纯文本查看 复制代码
select name,(english+chinese+math) from exam;

* 统计所有学生的总分:
   
[SQL] 纯文本查看 复制代码
 select sum(english+chinese+math) from exam;   -- ifnull(english,0)
    select sum(english)+sum(chinese)+sum(math) from exam;
* 统计学生的个数:
   
[SQL] 纯文本查看 复制代码
 select count(*) from exam;

* 统计英语成绩的最高分:
   
[SQL] 纯文本查看 复制代码
select max(english) from exam;

* 统计语文成绩的最低分:
   
[SQL] 纯文本查看 复制代码
select min(chinese) from exam;

* 统计英语成绩平均分:
   
[SQL] 纯文本查看 复制代码
select avg(english) from exam;

【分组】
        group by
创建一个订单详情的表:
* 统计订单中的每类商品所购买的个数:
   
[SQL] 纯文本查看 复制代码
SELECT product,COUNT(*) FROM orderitem GROUP BY product;

* 统计订单中的每类商品所花的金额:
   
[SQL] 纯文本查看 复制代码
SELECT product,SUM(price) FROM orderitem GROUP BY product;

* 统计订单中的每类商品所花总金额大于2000信息.
   
[SQL] 纯文本查看 复制代码
SELECT product,SUM(price) FROM orderitem GROUP BY product HAVING SUM(price) > 2000;

* 统计订单中名称有电子的商品并且所花金额大于1500同时按照价格降序排序:
   
[SQL] 纯文本查看 复制代码
SELECT product,SUM(price) FROM orderitem WHERE product LIKE '电%' GROUP BY product HAVING SUM(price) > 1500 ORDER BY SUM(price) DESC;

【SQL的查询语句的总结】
顺序:        s...f...w...g...h...o...;

表结构进行分析
【数据库的多表设计】
数据库都是关系型的数据库,存的是实体之间的关系.实体之间有哪些关系?
实体的关系总结起来就有三种关系:
一对多:
    * 客户和订单:一个客户可以产生多个订单,一个订单只能属于是某一个客户.
    * 部门和员工:一个部门下可以有多个员工,一个员工只能属于某一个部门.
多对多:
    * 学生和课程:一个学生可以选择多门课程,一门课程可以被多个学生选择.
    * 订单和商品:一个订单中包含多个商品,一个商品也可以出现多个订单中.
一对一:
    * 公司和地址:一个公司只能有一个注册地址,一个地址也只能被一个公司注册.
【多表的设计】
        一对多的关系的建表原则:
* 在多的一方创建一个字段,这个字段作为外键执向一的一方的主键.
        多对多的关系的建表原则:
* 创建一个第三种表,中间表中至少需要两个字段分别作为外键执向多对多双方的各自的主键.
        一对一的关系的建表原则:
* 唯一外键对应:假设一对一的双方是一对多的关系.在多的一方创建外键执向一的一方的主键.需要在外键上添加一个unique约束.
* 主键对应:将一对一的双方的主键建立映射.
【使用SQL创建一对多的关系】
创建客户表:
[SQL] 纯文本查看 复制代码
create table customer(
    cid int primary key auto_increment,
    cname varchar(20)
);

[SQL] 纯文本查看 复制代码
create table orders(
    oid int primary key auto_increment,
    addr varchar(50),
    cid int
);

***** 约束:用来保证数据的完成型.
* 多表约束:外键约束!!!
***** 给orders表中的cid添加外键约束.
* alter table orders add foreign key (cid) references customer(cid);

1.1.3.4        SQL完成多表的查询
【多表的查询的SQL】
        多表的查询的方式:
* 交叉连接:
    * select * from A,B;   --- 获得的是两个表的笛卡尔积.
* 内连接: inner join -- inner 可以省略
    * 显式内连接:select * from A inner join B on 条件;
        
[SQL] 纯文本查看 复制代码
SELECT * FROM customer c INNER JOIN orders o ON c.cid = o.cid;

    * 隐式内连接:select * from A,B where 条件;
      
[SQL] 纯文本查看 复制代码
SELECT * FROM customer c ,orders o WHERE c.cid = o.cid;

* 外连接:outer join -- outer 可以省略
    * 左外连接:left outer join  -- select * from A left outer join B on 条件;
        
[SQL] 纯文本查看 复制代码
SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.cid = o.cid;

    * 右外连接:right outer join -- select * from A right outer join B on 条件;
        
[SQL] 纯文本查看 复制代码
SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.cid = o.cid;

【多表查询的子查询】
        一个SQL语句查询的过程中需要依赖另一个查询语句.
[SQL] 纯文本查看 复制代码
SELECT * FROM customer c,orders o WHERE c.cid = o.cid AND  c.cid IN (SELECT cid FROM orders WHERE addr LIKE '海淀%');


点进这个帖子的同学肯定是要奋发图强,学技术拿高薪的有志青年,这里我看你骨骼惊奇,是个绝世的练武奇才,你我有缘,今天我就把这个武林秘籍如来神掌传授于你! 什么?不想学如来神掌?不要紧!这里有各个门派的武林绝学,链接拿好!!哈哈哈哈
     【黑马程序员济南】小鲁哥哥全学科技术整合帖(一贴在手!天下我有!)







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2