• 笔记1


      1 sql: 专门操作数据库的语言  (数据库只认识sql)
      2 
      3 三大系统:操作系统  文件系统  数据库系统
      4 
      5 
      6 什么是数据库? 就是一个文件系统,通过标准SQL语言操作文件系统中数据 ---- 用来存放软件系统的数据    存数据  管理数据
      7 什么是关系型数据库 ? 保存关系数据模型     文件与文件有关系   最常用的  慢   安全
      8 对象数据库:db2(算是一个对象数据库)
      9 
     10 Oracle 甲骨文公司,专门数据库厂商 收购BEA 、SUN、MySQL ------- 收费 大型数据库 ,用于任何系统任何平台 
     11 MySQL 早期开源免费数据库产品,LAMP组合 Linux + Apache + MySQL + PHP 完全开源免费 ,自从mysql被oracle收购后,从6.0开始出现收费版本
     12 DB2 IBM数据库产品 大型收费数据库 websphere服务器一起使用 
     13 SYBASE 中等规模数据库 收费 PowerDesigner 数据库建模工具 
     14 SQL Server 微软公司数据库产品 收费中等规模数据库 ,操作系统要求是windows 结合.net 一起使用 
     15 
     16 Java开发者主要使用 MySQL 、Oracle、DB2 三种数据库
     17 
     18 =================================================================================================
     19 MySQL 安装配置   如果没有特殊要求   直接下一步 下一步安装即可!
     20 1、卸载
     21 在mysql安装目录 my.ini 
     22 datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"
     23 1) 在控制面板中卸载MySQL 
     24 2) 删除mysql 安装目录
     25 3) 删除MySQL数据文件目录 
     26 
     27 2、安装
     28 选择自定义安装
     29 MySQL Server 默认位置 c:program filesmysql目录
     30 Server Data File 数据文件 C:Documents and SettingsAll UsersApplication DataMySQL 目录
     31 
     32 安装后进行mysql配置
     33 1) 配置mysql 默认字符集 
     34 默认latin1 等价于 ISO-8859-1 改为 utf8
     35 2) Include Bin Directory in Window Path 将mysql/bin 目录配置环境变量path ---- 勾选
     36 3) 输入超级管理root 密码 
     37 
     38 测试mysql是否安装成功 启动cmd窗口 输入 mysql -u root -p 回车 输入密码 123 ==== 出现 mysql> 安装成功
     39 
     40 3、重置root密码
     41 1) 停止mysql服务器 运行输入services.msc 停止mysql服务
     42 2) 在cmd下 输入 mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口)
     43 3) 新打开cmd 输入mysql -u root -p 不需要密码 
     44 use mysql;
     45 update user set password=password('abc') WHERE User='root';
     46 4) 关闭两个cmd窗口 在任务管理器结束mysqld 进程 
     47 5) 在服务管理页面 重启mysql 服务
     48 密码修改完成 
     49 
     50 ========================================================================================================
     51 MySQL 服务器内部存储结果
     52 一个数据库服务器可以创建多个数据库
     53 一个数据库可以创建多张数据表 
     54 每张数据表 用来保存 数据记录   (简单认为 文件 存放数据,数据库看成文件夹)
     55 
     56 SQL语句 结构化查询语句        表达式
     57 特点:非过程性 一条SQL语句一个执行结果 
     58 为了使用SQL 编写复杂程序,各个数据库厂商对SQL 进行增强,SQL Server TSQL 、Oracle PLSQL 
     59 
     60 SQL语句分类 按功能(定义、操纵、控制、查询)分类
     61 DDL 数据定义语言,定义表、库、视图
     62 DML 对数据表记录 增加、修改和删除操作
     63 DCL 授权、事务控制、条件判断 
     64 DQL (不是W3C组织 给出分类) 数据表记录查询 
     65 * 知道SQL语句四个分类,能够识别SQL语言属于哪个分类 
     66 
     67 SQL语句学习流程 : 数据库操作语句 ----- 数据表结构操作语句 ---- 数据表记录操作语句 
     68 
     69 一、数据库操作语句
     70 1、创建数据库 会为每个软件系统创建单独数据库
     71 语法 : create database 数据库名称 ;  (创建数据库采用数据库服务器默认字符集 )
     72 复杂写法 create database 数据库名称 character set 字符集 collate 比较规则 ; 
     73 
     74 创建一个名称为mydb1的数据库。 create database mydb1;
     75 创建一个使用utf8字符集的mydb2数据库。 create database mydb2 character set utf8;
     76 创建一个使用utf8字符集,并带校对规则的mydb3数据库。create database mydb3 character set utf8 collate utf8_bin;
     77 
     78 补充:每次创建一个数据库在 数据存放目录中生成一个文件夹 , 每个文件夹中存在 db.opt 存放默认字符集和校对规则 
     79 datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"
     80 
     81 2、查询数据库 
     82 show databases; ----- 查看所有数据库 
     83 show create database 数据库名; ------ 查看数据编码集
     84 
     85 3、删除数据库
     86 语法 :drop database 数据库名称; 
     87 
     88 查看当前数据库服务器中的所有数据库 show databases;
     89 查看前面创建的mydb2数据库的定义信息 show create database mydb2;
     90 删除前面创建的mydb1数据库 drop database mydb1;
     91 
     92 4、修改数据库编码集 
     93 语法:alter database 数据库名称 character set 字符集 collate 比较规则; 
     94 
     95 修改mydb2字符集为gbk;  alter database mydb2 character set gbk;
     96 
     97 切换当前使用数据库: use 数据库名称
     98 查看当前正在使用数据库: select database();
     99 
    100 ==================================================== 所有数据库相关操作语句都属于DDL 语句
    101 二、数据表结构SQL语句 
    102 1、数据表的创建 
    103 语法:create table 表名(列名 类型(长度),列名 类型(长度)... );
    104 一个数据表 可以存在很多列,每列具有类型和长度 
    105 * 创建表时没有指定 字符集,将采用数据库默认字符集 
    106 * 创建表之前 必须使用use db 语法指定操作数据库 
    107 
    108 创建day12 数据库 create database day12;
    109 切换到day12 数据库 use day12; 
    110 
    111 例如: 
    112 User {
    113    id   int                              
    114    name string
    115    password string
    116    birthday date    
    117 }
    118 一个java类 对应数据库中一张数据表,一个java对象 对应数据表中一条数据记录 
    119 
    120 MySQL 常用数据类型
    121 java 中 String char  -----  mysql 中字符串型 char varchar  ''
    122 * char是定长 varchar是变长 
    123 例如:char(8) 保存 lisi,因为lisi 只有四个字符,所有会补充四个空格,成为8个字符存入 char(8)中 ,如果有 varchar(8) 自动根据存放内容改变长度
    124 
    125 java 中 byte short int long float double ----- mysql 中数值类型 TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
    126 
    127 java 中 boolean ---- mysql 逻辑性 bit 存放一位数值 0 或者1 
    128 
    129 java 中 Date ----- mysql 日期类型 date (只有日期) time(只有时间) datetime(日期时间都有) timestamp(日期时间都有 )
    130 * datetime和timestamp 表现形式上完全相同,区别就在于timestamp 在数据库可以自定更新(当前时间)
    131 
    132 java中 大数据类型 inputStream 二进制文件 Reader 文本文件 ------- mysql 大数据类型 blob(存放大二进制数据) text(存放大的文本文件)
    133 * tinyblob tinytext 255字节 blob text 64KB mediumblob mediumtext 16MB  longblob longtext 4GB
    134 
    135 例如: 
    136 User {
    137    id   int    ------ mysql int                        
    138    name string  ------ mysql varchar
    139    password string  ----- mysql varchar
    140    birthday date    ----- mysql date 
    141 }
    142 
    143 员工表建表语句
    144 create table employee (
    145    id int,
    146    name varchar(20),
    147    gender varchar(20),
    148    birthday date,
    149    entry_date date,
    150    job varchar(30),
    151    salary double,
    152    resume longtext
    153 );
    154 
    155 查看表结构 desc 表名; 
    156 
    157 *** 创建数据表时,只有字符串类型必须写长度,而其他类型都有默认长度  
    158 
    159 2、单表创建时约束
    160 约束用来保证数据有效性和完整性 
    161 主键约束 primary key : 信息记录某个字段可以唯一区分其他信息记录,这个字段就可以是主键 (唯一 非空)
    162 唯一约束 unique : 该字段的值不允许重复  可以null
    163 * 一张表中可以有很多个唯一约束,只能有一个(两个)作为主键约束 
    164 非空约束 not null :该字段的值不能为空 
    165 
    166 create table employee2 (
    167    id int primary key auto_increment,
    168    name varchar(20) unique not null,
    169    gender varchar(20) not null,
    170    birthday date not null,
    171    entry_date date not null,
    172    job varchar(30) not null,
    173    salary double not null,
    174    resume longtext
    175 );
    176 ***列级约束
    177 
    178 * 如果主键约束类型为 数值型 int bigint ,添加auto_increment 自动增长 
    179 
    180 3、数据表结构修改
    181 1) 增加列 语法: alter table 表名 add 列名 类型(长度) 约束; 
    182 2) 修改现有列类型、长度和约束 语法:alter table 表名 modify 列名 类型(长度) 约束;
    183 3) 修改现有列名称 语法:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
    184 4) 删除现有列 语法:alter table 表名 drop 列名 ;
    185 5) 修改表名 rename table 旧表名 to 新表名; 
    186 
    187 * 修改表的字符集:alter table student character set utf8;
    188 
    189 在上面员工表的基本上增加一个image列。---- alter table employee add image varchar(100) ;
    190 修改job列,使其长度为60。 ----alter table employee modify job varchar(60) not null;
    191 删除gender列。 ----alter table employee drop gender ;
    192 表名改为user。 ----rename table employee to user;
    193 修改表的字符集为utf8 ---- alter table user character set utf8;
    194 列名name修改为username  ----- alter table user change name username varchar(20) unique not null;
    195 
    196 查看当前数据库内所有表:show tables 
    197 查看当前数据表字符集 : show create table user;
    198 
    199 4、数据表删除 
    200 语法:drop table 表名; 
    201 
    202 5、查看数据表结构
    203 desc 表名; 查看表结构
    204 show tables ; 查看当前库内所有表名
    205 show create table 表名; 查看建表语句和字符集 
    206 
    207 ==================================================================== 所有数据表结构操作语句都是 DDL 
    208 三、数据表中数据记录的增删改查操作    ---dml
    209 1、向数据表插入记录 
    210 语法:insert into 表名(列名,列名,列名...) values(值,值,值...);  为数据表的每列进行赋值 
    211 
    212 注意事项
    213 1) 插入值 类型必须和 列类型匹配
    214 2) 值长度不能超过 列定义长度
    215 3) 值的顺序和 列顺序对应 
    216 4) 字符串和日期型值 必须写 单引号
    217 5) 插入空值 可以写 null    
    218 
    219 新建employee表,插入三个员工信息
    220 insert into employee(id,name,gender,birthday,entry_date,job,salary,resume) values(1,'zhangsan','male','1990-10-10','2010-01-01','sales',4000,'good boy !');
    221 
    222 语法2: 省略所有列名,但是后面值必须要和表中所有列进行匹配,按照表中列顺序 
    223 insert into employee values(2,'lisi','male','1988-10-01','2008-08-17','hr',3500,'good hr !');
    224 
    225 语法3:省略可以为空,有默认值部分列名,后面值要和前面列进行匹配    不为空的且没有默认值一定要插入
    226 insert into employee(id,name,job,salary) values(3,'wangwu','boss',20000);
    227 
    228 * 在插入记录后 ,通过select * from employee; 查看所有员工信息 
    229 
    230 插入一条中文记录
    231 insert into employee(id,name,job,salary) values(4,'小明','清洁员',1500);
    232 出错了:
    233 ERROR 1366 (HY000): Incorrect string value: 'xC3xF7' for column 'name' at row 1 ; 
    234 错误原因:mysql client 采用默认字符集编码 gbk 
    235 
    236 查看系统所有字符集 : show variables like 'character%';
    237 
    238 解决办法:修改客户端字符集为gbk 
    239 MYSQL中共有6个地方字符集 :client connetion result 和客户端相关 、database server system 和服务器端相关 
    240 
    241 第一种:当前窗口临时修改 set names gbk ;
    242 * 只对当前窗口有效,关闭后就会失效
    243 
    244 第二种:配置mysql/my.ini 文件
    245 [mysql] 客户端配置
    246 [mysqld] 服务器端配置 
    247 
    248 修改客户端字符集 [mysql] 后字符集  default-character-set=gbk
    249 
    250 使用mysql -u root -p 密码连入数据库后,如果进行数据库操作,直接操作,如果要进行数据表结构和数据记录操作,必须先切换到操作的数据库 use db;
    251 
    252 2、数据记录更改操作
    253 语法: update 表名 set 列名=值,列名=值.... where条件语句; 
    254 * 如果没有where条件语句,默认修改所有行数据 
    255 
    256 将所有员工薪水修改为5000元。 ----- update employee set salary = 5000;
    257 将姓名为’zhangsan’的员工薪水修改为3000元。 -------  update employee set salary = 3000 where name='zhangsan' ;
    258 将姓名为’lisi’的员工薪水修改为4000元,job改为ccc。 ------- update employee set salary=4000, job='ccc' where name='lisi';
    259 将wangwu的薪水在原有基础上增加1000元。    ------------ update employee set salary = salary+1000 where name ='wangwu';
    260 
    261 3、数据记录的删除操作
    262 语法:delete from 表名 where条件语句 ;
    263 * 如果没有where语句,将删除表中 所有记录
    264 
    265 如果要删除表中所有数据记录,使用 truncate table 表名; 等价于 delete from 表名; 
    266 
    267 试题:如果使用delete删除表中所有记录和使用truncate table删除表中所有记录 有何不同 ?
    268 truncate 删除数据,过程先将整个表删除,再重新创建 
    269 delete 删除数据,逐行删除记录 
    270 * truncate 效率要好于 delete 
    271 truncate 属于DDL ,delete 属于DML ======== 事务管理只能对DML 有效 ,被事务管理SQL语句可以回滚到SQL执行前状态 
    272 
    273 删除表中名称为’zhangsan’的记录。 ------ delete from employee where name='zhangsan';  
    274 删除表中所有记录。----- delete from employee; (可以事务回滚)
    275 使用truncate删除表中记录。 ---- truncate table employee;
    276 
    277 ====================================================================================== insert update delete 属于DML 语句
    278 4、数据表记录的查询 
    279 语法一 : select [distinct] * | 列名,列名... from 表名; 
    280 select * from 表名; 查询该表中所有列信息   *通配符
    281 select 列名,列名... from 表名;  查询表中指定列的信息 
    282 distinct 用于排重 
    283 
    284 create table exam(
    285    id int primary key auto_increment,
    286    name varchar(20) not null,
    287    chinese double,
    288    math double,
    289    english double
    290 ); 
    291 
    292 insert into exam values(null,'关羽',85,76,70);
    293 insert into exam values(null,'张飞',70,75,70);
    294 insert into exam values(null,'赵云',90,65,95);
    295 
    296 查询表中所有学生的信息。 ---------  select * from exam; 
    297 查询表中所有学生的姓名和对应的英语成绩。 ----- select name,english from exam;
    298 过滤表中重复数据 (查询英语成绩,排除完全相同重复数据) ---- select distinct english from exam; 
    299 
    300 语法二:select 表达式(列名执行运算) from 表名;
    301 select 列名 as 别名 from 表名; 
    302 
    303 在所有学生分数上加10分特长分。 ---- select name,chinese+10,math+10,english+10 from exam;
    304 统计每个学生的总分。------- select name,chinese+math+english from exam;
    305 使用别名表示学生分数。----- select name,chinese+math+english as 总分 from exam;
    306 
    307 ***  在对列起别名时,as可以省略 select name,chinese+math+english as 总分 from exam; ------ select name,chinese+math+english 总分 from exam;
    308 select name,math from exam; 查询name和math两列的值
    309 select name math from exam; 查询name列值,起别名math
    310 
    311 语法三: select 列名 from 表名 where条件语句
    312 
    313 查询姓名为关羽的学生成绩 -------select * from exam where name='关羽'; 
    314 查询英语成绩大于90分的同学 ----- select * from exam where english > 90;
    315 查询总分大于200分的所有同学 ----- select * from exam where chinese+math+english > 200;
    316 
    317 运算符 
    318 1) 相等= 不等 <>  
    319 2) between  ...and... 在两者之间取值 between 70 and 80 等价于 >=70 <=80  ----- 注意前面那个数要比后面那个数要小 
    320 3) in(值,值,值) 在指定值中任取一个 in(70,80,90) 值可以是70、80或者90 
    321 4) like '模糊查询pattern' 进行模糊查询 ,表达式有两个占位符 % 任意字符串 _ 任意单个字符 例如: name like '张%' 所有姓张学员  
    322 name like '张_' 所有姓张名字为两个字学员 
    323 5) is null 判断该列值为空
    324 
    325 6) and 逻辑与 or 逻辑或 not 逻辑非 
    326 
    327 查询英语分数在 90-100之间的同学。 -------- select * from exam where english>=90 and english <= 100;  select * from exam where english between 90 and 100;
    328 查询数学分数为65,75,85的同学。 ---- select * from exam where math in(65,75,85); 
    329 查询所有姓赵的学生成绩。---- select * from exam where name like '赵%';
    330 查询英语分>80,语文分>80的同学。 ---- select * from exam where english > 80 and chinese > 80;
    331 
    332 insert into exam values(null,'刘备',null,55,38);
    333 查询语文没有成绩学员 select * from exam where chinese is null;
    334 查询语文有成绩学员 select * from exam where chinese is not null;
    335 
    336 
    337 语法四: select * from 表名 order by 列名 asc|desc ;  ---- asc升序 desc降序 
    338 对数学成绩排序后输出。----------- select * from exam order by math; 默认asc升序 
    339 对总分排序按从高到低(降序)的顺序输出  ------------ select * from exam order by math+chinese+english desc;
    340 对学生成绩按照英语进行降序排序,英语相同学员按照数学降序 ------------- select * from exam order by english desc,math desc;
    341 
    342 聚集函数 指SQL语句中内置函数 ---------- 分组函数(用于统计)      **** 自动排null
    343 1) count 统计查询结果记录条数 select count(*)|count(列名) from 表名; 
    344 
    345 统计一个班级共有多少学生? ------------ select count(*) from exam; 
    346 统计英语成绩大于90的学生有多少个? ------- select count(*) from exam where english > 90;
    347 统计总分大于220的人数有多少? --------select count(*) from exam where chinese+math+english > 220;
    348 
    349 2) sum 统计某一列数据的和  select sum(列名) from 表名; 
    350 
    351 统计一个班级数学总成绩? ----- select sum(math) from exam;
    352 统计一个班级语文、英语、数学各科的总成绩 ---- select sum(chinese),sum(math),sum(english) from exam;
    353 统计一个班级语文、英语、数学的成绩总和 select sum(chinese+math+english) from exam;  
    354 select sum(chinese)+sum(math)+sum(english) from exam;
    355 **** 刘备语文null ,null进行所有运算 结果都是null 
    356 select sum(chinese)+sum(math)+sum(english) from exam; 含有刘备英语和数学成绩
    357 select sum(chinese+math+english) from exam;  不含刘备英语和数学成绩 
    358 * 使用ifnull函数处理 null情况 
    359 select sum(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;  含有刘备英语和数学成绩
    360 
    361 统计一个班级语文成绩平均分  ------ select sum(chinese)/count(*) from exam; 
    362 
    363 3) avg 统计某一列平均值 select avg(列名) from 表名;
    364 求一个班级数学平均分? ---- select avg(math) from exam;
    365 求一个班级总分平均分?---- select avg(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam; 
    366 select ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0) from exam; 
    367 
    368 4) max 统计一列最大值 min 统计一列最小值 
    369 求班级最高分和最低分(数值范围在统计中特别有用)
    370 select max(chinese+math+english) a ,min(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) i from exam; 
    371 
    372 语法五:select 分组函数 from exam group by 列名; 按照某列进行分组统计 ***一组可能有多条数据
    373 分组操作,就是具有相同数据记录分到一组中,便于统计 
    374 
    375 create table orders(
    376     id int,
    377     product varchar(20),
    378     price float
    379 );
    380 
    381 insert into orders(id,product,price) values(1,'电视',900);
    382 insert into orders(id,product,price) values(2,'洗衣机',100);
    383 insert into orders(id,product,price) values(3,'洗衣粉',90);
    384 insert into orders(id,product,price) values(4,'桔子',9);
    385 insert into orders(id,product,price) values(5,'洗衣粉',90);
    386 
    387 练习:对订单表中商品归类后,显示每一类商品的总价 ---- 需要按照商品名称进行分组
    388 select product,sum(price) from orders group by product;     select * from orders group by product;错误!!!
    389 在group by 语句后面 添加having 条件语句 ---- 对分组查询结果进行过滤 
    390 练习:查询购买了几类商品,并且每类总价大于100的商品
    391 select product,sum(price) from orders group by product having sum(price) > 100;
    392 
    393 试题:where 和 having 条件语句的区别 ? 
    394 where 是在分组前进行条件过滤,having 是在分组后进行条件过滤 
    395 使用where地方都可以用 having替换 , 但是having可以使用分组函数,而where后不可以用分组函数 
    396 
    397 小结 select 语句 : S-F-W-G-H-O 组合 select ... from ... where ... group by... having... order by ... ; 
    398 顺序不能改变 
    399 解析顺序 : from  - where -  group by - having - select - order by 
    400 
    401 =================================================================================================================
    402 MySQL 数据库的备份和恢复
    403 1、备份命令 mysql/bin/mysqldump 将数据库SQL语句导出 
    404 语法:mysqldump -u 用户名 -p 数据库名 > 磁盘SQL文件路径 
    405 
    406 例如: 备份day12数据库 --- c:day12.sql 
    407 cmd > mysqldump -u root -p day12 > c:day12.sql 回车输入密码 
    408 
    409 INSERT INTO `exam` VALUES (1,'关羽',85,76,70),(2,'张飞',70,75,70),(3,'赵云',90,65,95),(4,'刘备',NULL,55,38);
    410 
    411 2、恢复命令 mysql/bin/mysql 将sql文件导入到数据库 
    412 语法: mysql -u 用户名 -p 数据库名 < 磁盘SQL文件路径
    413 ***** 导入SQL 必须手动创建数据库 ,SQL不会创建数据库 
    414 
    415 例如:将c:day12.sql 导入 day12数据库
    416 cmd > mysql -u root -p day12 < c:day12.sql 回车密码 
    417 
    418 补充知识:恢复SQL也可以在数据库内部执行 source c:day12.sql 
    419 
    420 
    421 多表设计(外键约束)
    422 create table emp (
    423   id int primary key auto_increment,
    424   name varchar(20),
    425   job varchar(20),
    426   salary double
    427 );
    428 
    429 insert into emp values(null,'小丽','人力资源',4500);
    430 insert into emp values(null,'小张','Java工程师',5000);
    431 insert into emp values(null,'老李','财务经理',8000);
    432 insert into emp values(null,'小刘','项目经理',10000);
    433 
    434 create table dept(
    435    id int primary key auto_increment,
    436    name varchar(20)
    437 );
    438 
    439 insert into dept values(null,'人力资源部');
    440 insert into dept values(null,'财务部');
    441 insert into dept values(null,'技术研发部');
    442 
    443 让员工表和部门表发生关系,知道员工属于哪个部门 ,在员工表添加部门id字段 
    444 alter table emp add dept_id int ;
    445 update emp set dept_id = 1 where name = '小丽';
    446 update emp set dept_id = 2 where name = '老李';
    447 update emp set dept_id = 3 where name = '小刘';
    448 update emp set dept_id = 3 where name = '小张';
    449 
    450 公司因为财政问题,解散技术研发部 delete from dept where name ='技术研发部'; ----- 小张和小刘 失去了组织 
    451 
    452 emp表 中dept_id字段 引用 dept表 id 字段 ------- 添加外键约束 (保证数据有效和完整性)
    453 将emp表中dept_id 设置为外键约束 alter table emp add foreign key(dept_id) references dept(id) ;
    454 无法删除技术研发部 ,因为小刘和小张信息 依赖技术研发部 记录 !!!!!
    455 
    456 多表设计原则 :所有关系数据只能存在三种对应关系 (一对一、一对多、多对多)
    457 1、多对多关系 : 雇员和项目关系
    458 一个雇员可以参与多个项目
    459 一个项目可以由多个雇员参与
    460 ***老师 - 班级   学生-课程  
    461 
    462 建表原则:必须创建第三张关系表,在关系表中引用两个实体主键 作为外键 
    463 关系表中每条记录,代表一个雇员参与了一个项目 
    464 
    465 2、一对多关系: 用户和博客关系
    466 一个用户可以发表多篇博客
    467 一个博客只能由一个作者 
    468 
    469 建表原则:不需要创建第三方关系表,只需要在多方添加 一方主键作为 外键 
    470 
    471 3、一对一关系 : 这种关系很少见到  负责人和工作室
    472 一个负责人 管理一个工作室
    473 一个工作室 只有一个负责人 
    474 ***身份证 --人    学号  --学生
    475 
    476 建表规则:在任一方添加对方主键 作为外键 
    477 
    478 ====================================================================================================================
    479 多表查询——笛卡尔积 
    480 将A表中每条记录 与 B表中每条记录进行 匹配 获得笛卡尔积 
    481 select * from emp;
    482 select * from dept;
    483 
    484 select * from emp,dept; 显示结果就是笛卡尔积 
    485 笛卡尔积结果 就是 两个表记录乘积 例如A 表3条 B表4条 ---- 笛卡尔积 12条
    486 
    487 笛卡尔积结果是无效的,必须从笛卡尔积中选取有效的数据结果 !!!
    488 
    489 多表查询 连接查询 内连接查询 
    490 从A表中选择一条记录,去B表中找对应记录 ----- 内连接 必须A表和B表存在对应记录才会显示 
    491 
    492 create table A(A_ID int primary key auto_increment,A_NAME varchar(20) not null);
    493 insert into A values(1,'Apple');
    494 insert into A values(2,'Orange');
    495 insert into A values(3,'Peach');
    496 
    497 create table B(A_ID int primary key auto_increment,B_PRICE double);
    498 insert into B values(1,2.30);
    499 insert into B values(2,3.50);
    500 insert into B values(4,null);
    501 
    502 使用内连接 select * from a,b where a.a_id = b.a_id;
    503 * 内连接查询结果条数 一定小于 两个表记录较多哪个表 ----- 例如 A表3条 B表5条 ---- 内连接结果条数 <= 5
    504 
    505 select * from emp,dept where emp.dept_id = dept.id ; 将emp 表和dept 表进行内连接 
    506 在内连接查询时 添加条件,查询人力资源部有哪些 员工 ?? 
    507 select * from emp,dept where emp.dept_id = dept.id and dept.name ='人力资源部'; 
    508 工资大于7000员工来自哪个部门? select * from emp,dept where emp.dept_id = dept.id and emp.salary > 7000;
    509 
    510 select * from emp,dept where emp.dept_id = dept.id ; 写法一
    511 select * from emp inner join dept on emp.dept_id = dept.id ; 写法二 
    512 
    513 =======================================================================================================================
    514 内容小结:
    515 1、 mysql的安装配置 (卸载、root密码重置)
    516 2、 SQL语言的分类
    517 3、 SQL语句 database 操作
    518 4、SQL语句 table表结构 操作
    519 5、SQL语句 表数据记录操作 ***** insert update delete select 
    520 6、MySQL数据库备份和恢复
    521 7、多表建表规则和多表查询 ***** 
    522 
    523 数据库完整性约束 :primary key 主键、unique 唯一、not null非空 、foreign key 外键、check 条件约束(mysql不支持,oracle中使用)
    524 
    525 课外知识点:E-R图绘制、范式(1NF 不可再分、2NF 部分依赖 3NF 传递依赖)
    笔记1

    sql: 专门操作数据库的语言 (数据库只认识sql)

    三大系统:操作系统 文件系统 数据库系统


    什么是数据库? 就是一个文件系统,通过标准SQL语言操作文件系统中数据 ---- 用来存放软件系统的数据 存数据 管理数据
    什么是关系型数据库 ? 保存关系数据模型 文件与文件有关系 最常用的 慢 安全
    对象数据库:db2(算是一个对象数据库)

    Oracle 甲骨文公司,专门数据库厂商 收购BEA 、SUN、MySQL ------- 收费 大型数据库 ,用于任何系统任何平台
    MySQL 早期开源免费数据库产品,LAMP组合 Linux + Apache + MySQL + PHP 完全开源免费 ,自从mysql被oracle收购后,从6.0开始出现收费版本
    DB2 IBM数据库产品 大型收费数据库 websphere服务器一起使用
    SYBASE 中等规模数据库 收费 PowerDesigner 数据库建模工具
    SQL Server 微软公司数据库产品 收费中等规模数据库 ,操作系统要求是windows 结合.net 一起使用

    Java开发者主要使用 MySQL 、Oracle、DB2 三种数据库

    =================================================================================================
    MySQL 安装配置 如果没有特殊要求 直接下一步 下一步安装即可!
    1、卸载
    在mysql安装目录 my.ini
    datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"
    1) 在控制面板中卸载MySQL
    2) 删除mysql 安装目录
    3) 删除MySQL数据文件目录

    2、安装
    选择自定义安装
    MySQL Server 默认位置 c:program filesmysql目录
    Server Data File 数据文件 C:Documents and SettingsAll UsersApplication DataMySQL 目录

    安装后进行mysql配置
    1) 配置mysql 默认字符集
    默认latin1 等价于 ISO-8859-1 改为 utf8
    2) Include Bin Directory in Window Path 将mysql/bin 目录配置环境变量path ---- 勾选
    3) 输入超级管理root 密码

    测试mysql是否安装成功 启动cmd窗口 输入 mysql -u root -p 回车 输入密码 123 ==== 出现 mysql> 安装成功

    3、重置root密码
    1) 停止mysql服务器 运行输入services.msc 停止mysql服务
    2) 在cmd下 输入 mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口)
    3) 新打开cmd 输入mysql -u root -p 不需要密码
    use mysql;
    update user set password=password('abc') WHERE User='root';
    4) 关闭两个cmd窗口 在任务管理器结束mysqld 进程
    5) 在服务管理页面 重启mysql 服务
    密码修改完成

    ========================================================================================================
    MySQL 服务器内部存储结果
    一个数据库服务器可以创建多个数据库
    一个数据库可以创建多张数据表
    每张数据表 用来保存 数据记录 (简单认为 文件 存放数据,数据库看成文件夹)

    SQL语句 结构化查询语句 表达式
    特点:非过程性 一条SQL语句一个执行结果
    为了使用SQL 编写复杂程序,各个数据库厂商对SQL 进行增强,SQL Server TSQL 、Oracle PLSQL

    SQL语句分类 按功能(定义、操纵、控制、查询)分类
    DDL 数据定义语言,定义表、库、视图
    DML 对数据表记录 增加、修改和删除操作
    DCL 授权、事务控制、条件判断
    DQL (不是W3C组织 给出分类) 数据表记录查询
    * 知道SQL语句四个分类,能够识别SQL语言属于哪个分类

    SQL语句学习流程 : 数据库操作语句 ----- 数据表结构操作语句 ---- 数据表记录操作语句

    一、数据库操作语句
    1、创建数据库 会为每个软件系统创建单独数据库
    语法 : 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;

    补充:每次创建一个数据库在 数据存放目录中生成一个文件夹 , 每个文件夹中存在 db.opt 存放默认字符集和校对规则
    datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"

    2、查询数据库
    show databases; ----- 查看所有数据库
    show create database 数据库名; ------ 查看数据编码集

    3、删除数据库
    语法 :drop database 数据库名称;

    查看当前数据库服务器中的所有数据库 show databases;
    查看前面创建的mydb2数据库的定义信息 show create database mydb2;
    删除前面创建的mydb1数据库 drop database mydb1;

    4、修改数据库编码集
    语法:alter database 数据库名称 character set 字符集 collate 比较规则;

    修改mydb2字符集为gbk; alter database mydb2 character set gbk;

    切换当前使用数据库: use 数据库名称
    查看当前正在使用数据库: select database();

    ==================================================== 所有数据库相关操作语句都属于DDL 语句
    二、数据表结构SQL语句
    1、数据表的创建
    语法:create table 表名(列名 类型(长度),列名 类型(长度)... );
    一个数据表 可以存在很多列,每列具有类型和长度
    * 创建表时没有指定 字符集,将采用数据库默认字符集
    * 创建表之前 必须使用use db 语法指定操作数据库

    创建day12 数据库 create database day12;
    切换到day12 数据库 use day12;

    例如:
    User {
    id int
    name string
    password string
    birthday date
    }
    一个java类 对应数据库中一张数据表,一个java对象 对应数据表中一条数据记录

    MySQL 常用数据类型
    java 中 String char ----- mysql 中字符串型 char varchar ''
    * char是定长 varchar是变长
    例如:char(8) 保存 lisi,因为lisi 只有四个字符,所有会补充四个空格,成为8个字符存入 char(8)中 ,如果有 varchar(8) 自动根据存放内容改变长度

    java 中 byte short int long float double ----- mysql 中数值类型 TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE

    java 中 boolean ---- mysql 逻辑性 bit 存放一位数值 0 或者1

    java 中 Date ----- mysql 日期类型 date (只有日期) time(只有时间) datetime(日期时间都有) timestamp(日期时间都有 )
    * datetime和timestamp 表现形式上完全相同,区别就在于timestamp 在数据库可以自定更新(当前时间)

    java中 大数据类型 inputStream 二进制文件 Reader 文本文件 ------- mysql 大数据类型 blob(存放大二进制数据) text(存放大的文本文件)
    * tinyblob tinytext 255字节 blob text 64KB mediumblob mediumtext 16MB longblob longtext 4GB

    例如:
    User {
    id int ------ mysql int
    name string ------ mysql varchar
    password string ----- mysql varchar
    birthday date ----- mysql date
    }

    员工表建表语句
    create table employee (
    id int,
    name varchar(20),
    gender varchar(20),
    birthday date,
    entry_date date,
    job varchar(30),
    salary double,
    resume longtext
    );

    查看表结构 desc 表名;

    *** 创建数据表时,只有字符串类型必须写长度,而其他类型都有默认长度

    2、单表创建时约束
    约束用来保证数据有效性和完整性
    主键约束 primary key : 信息记录某个字段可以唯一区分其他信息记录,这个字段就可以是主键 (唯一 非空)
    唯一约束 unique : 该字段的值不允许重复 可以null
    * 一张表中可以有很多个唯一约束,只能有一个(两个)作为主键约束
    非空约束 not null :该字段的值不能为空

    create table employee2 (
    id int primary key auto_increment,
    name varchar(20) unique not null,
    gender varchar(20) not null,
    birthday date not null,
    entry_date date not null,
    job varchar(30) not null,
    salary double not null,
    resume longtext
    );
    ***列级约束

    * 如果主键约束类型为 数值型 int bigint ,添加auto_increment 自动增长

    3、数据表结构修改
    1) 增加列 语法: alter table 表名 add 列名 类型(长度) 约束;
    2) 修改现有列类型、长度和约束 语法:alter table 表名 modify 列名 类型(长度) 约束;
    3) 修改现有列名称 语法:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
    4) 删除现有列 语法:alter table 表名 drop 列名 ;
    5) 修改表名 rename table 旧表名 to 新表名;

    * 修改表的字符集:alter table student character set utf8;

    在上面员工表的基本上增加一个image列。---- alter table employee add image varchar(100) ;
    修改job列,使其长度为60。 ----alter table employee modify job varchar(60) not null;
    删除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(20) unique not null;

    查看当前数据库内所有表:show tables
    查看当前数据表字符集 : show create table user;

    4、数据表删除
    语法:drop table 表名;

    5、查看数据表结构
    desc 表名; 查看表结构
    show tables ; 查看当前库内所有表名
    show create table 表名; 查看建表语句和字符集

    ==================================================================== 所有数据表结构操作语句都是 DDL
    三、数据表中数据记录的增删改查操作 ---dml
    1、向数据表插入记录
    语法:insert into 表名(列名,列名,列名...) values(值,值,值...); 为数据表的每列进行赋值

    注意事项
    1) 插入值 类型必须和 列类型匹配
    2) 值长度不能超过 列定义长度
    3) 值的顺序和 列顺序对应
    4) 字符串和日期型值 必须写 单引号
    5) 插入空值 可以写 null

    新建employee表,插入三个员工信息
    insert into employee(id,name,gender,birthday,entry_date,job,salary,resume) values(1,'zhangsan','male','1990-10-10','2010-01-01','sales',4000,'good boy !');

    语法2: 省略所有列名,但是后面值必须要和表中所有列进行匹配,按照表中列顺序
    insert into employee values(2,'lisi','male','1988-10-01','2008-08-17','hr',3500,'good hr !');

    语法3:省略可以为空,有默认值部分列名,后面值要和前面列进行匹配 不为空的且没有默认值一定要插入
    insert into employee(id,name,job,salary) values(3,'wangwu','boss',20000);

    * 在插入记录后 ,通过select * from employee; 查看所有员工信息

    插入一条中文记录
    insert into employee(id,name,job,salary) values(4,'小明','清洁员',1500);
    出错了:
    ERROR 1366 (HY000): Incorrect string value: 'xC3xF7' for column 'name' at row 1 ;
    错误原因:mysql client 采用默认字符集编码 gbk

    查看系统所有字符集 : show variables like 'character%';

    解决办法:修改客户端字符集为gbk
    MYSQL中共有6个地方字符集 :client connetion result 和客户端相关 、database server system 和服务器端相关

    第一种:当前窗口临时修改 set names gbk ;
    * 只对当前窗口有效,关闭后就会失效

    第二种:配置mysql/my.ini 文件
    [mysql] 客户端配置
    [mysqld] 服务器端配置

    修改客户端字符集 [mysql] 后字符集 default-character-set=gbk

    使用mysql -u root -p 密码连入数据库后,如果进行数据库操作,直接操作,如果要进行数据表结构和数据记录操作,必须先切换到操作的数据库 use db;

    2、数据记录更改操作
    语法: update 表名 set 列名=值,列名=值.... where条件语句;
    * 如果没有where条件语句,默认修改所有行数据

    将所有员工薪水修改为5000元。 ----- update employee set salary = 5000;
    将姓名为’zhangsan’的员工薪水修改为3000元。 ------- update employee set salary = 3000 where name='zhangsan' ;
    将姓名为’lisi’的员工薪水修改为4000元,job改为ccc。 ------- update employee set salary=4000, job='ccc' where name='lisi';
    将wangwu的薪水在原有基础上增加1000元。 ------------ update employee set salary = salary+1000 where name ='wangwu';

    3、数据记录的删除操作
    语法:delete from 表名 where条件语句 ;
    * 如果没有where语句,将删除表中 所有记录

    如果要删除表中所有数据记录,使用 truncate table 表名; 等价于 delete from 表名;

    试题:如果使用delete删除表中所有记录和使用truncate table删除表中所有记录 有何不同 ?
    truncate 删除数据,过程先将整个表删除,再重新创建
    delete 删除数据,逐行删除记录
    * truncate 效率要好于 delete
    truncate 属于DDL ,delete 属于DML ======== 事务管理只能对DML 有效 ,被事务管理SQL语句可以回滚到SQL执行前状态

    删除表中名称为’zhangsan’的记录。 ------ delete from employee where name='zhangsan';
    删除表中所有记录。----- delete from employee; (可以事务回滚)
    使用truncate删除表中记录。 ---- truncate table employee;

    ====================================================================================== insert update delete 属于DML 语句
    4、数据表记录的查询
    语法一 : select [distinct] * | 列名,列名... from 表名;
    select * from 表名; 查询该表中所有列信息 *通配符
    select 列名,列名... from 表名; 查询表中指定列的信息
    distinct 用于排重

    create table exam(
    id int primary key auto_increment,
    name varchar(20) not null,
    chinese double,
    math double,
    english double
    );

    insert into exam values(null,'关羽',85,76,70);
    insert into exam values(null,'张飞',70,75,70);
    insert into exam values(null,'赵云',90,65,95);

    查询表中所有学生的信息。 --------- select * from exam;
    查询表中所有学生的姓名和对应的英语成绩。 ----- select name,english from exam;
    过滤表中重复数据 (查询英语成绩,排除完全相同重复数据) ---- select distinct english from exam;

    语法二:select 表达式(列名执行运算) from 表名;
    select 列名 as 别名 from 表名;

    在所有学生分数上加10分特长分。 ---- select name,chinese+10,math+10,english+10 from exam;
    统计每个学生的总分。------- select name,chinese+math+english from exam;
    使用别名表示学生分数。----- select name,chinese+math+english as 总分 from exam;

    *** 在对列起别名时,as可以省略 select name,chinese+math+english as 总分 from exam; ------ select name,chinese+math+english 总分 from exam;
    select name,math from exam; 查询name和math两列的值
    select name math from exam; 查询name列值,起别名math

    语法三: select 列名 from 表名 where条件语句

    查询姓名为关羽的学生成绩 -------select * from exam where name='关羽';
    查询英语成绩大于90分的同学 ----- select * from exam where english > 90;
    查询总分大于200分的所有同学 ----- select * from exam where chinese+math+english > 200;

    运算符
    1) 相等= 不等 <>
    2) between ...and... 在两者之间取值 between 70 and 80 等价于 >=70 <=80 ----- 注意前面那个数要比后面那个数要小
    3) in(值,值,值) 在指定值中任取一个 in(70,80,90) 值可以是70、80或者90
    4) like '模糊查询pattern' 进行模糊查询 ,表达式有两个占位符 % 任意字符串 _ 任意单个字符 例如: name like '张%' 所有姓张学员
    name like '张_' 所有姓张名字为两个字学员
    5) is null 判断该列值为空

    6) and 逻辑与 or 逻辑或 not 逻辑非

    查询英语分数在 90-100之间的同学。 -------- select * from exam where english>=90 and english <= 100; select * from exam where english between 90 and 100;
    查询数学分数为65,75,85的同学。 ---- select * from exam where math in(65,75,85);
    查询所有姓赵的学生成绩。---- select * from exam where name like '赵%';
    查询英语分>80,语文分>80的同学。 ---- select * from exam where english > 80 and chinese > 80;

    insert into exam values(null,'刘备',null,55,38);
    查询语文没有成绩学员 select * from exam where chinese is null;
    查询语文有成绩学员 select * from exam where chinese is not null;


    语法四: select * from 表名 order by 列名 asc|desc ; ---- asc升序 desc降序
    对数学成绩排序后输出。----------- select * from exam order by math; 默认asc升序
    对总分排序按从高到低(降序)的顺序输出 ------------ select * from exam order by math+chinese+english desc;
    对学生成绩按照英语进行降序排序,英语相同学员按照数学降序 ------------- select * from exam order by english desc,math desc;

    聚集函数 指SQL语句中内置函数 ---------- 分组函数(用于统计) **** 自动排null
    1) count 统计查询结果记录条数 select count(*)|count(列名) from 表名;

    统计一个班级共有多少学生? ------------ select count(*) from exam;
    统计英语成绩大于90的学生有多少个? ------- select count(*) from exam where english > 90;
    统计总分大于220的人数有多少? --------select count(*) from exam where chinese+math+english > 220;

    2) sum 统计某一列数据的和 select sum(列名) from 表名;

    统计一个班级数学总成绩? ----- select sum(math) from exam;
    统计一个班级语文、英语、数学各科的总成绩 ---- select sum(chinese),sum(math),sum(english) from exam;
    统计一个班级语文、英语、数学的成绩总和 select sum(chinese+math+english) from exam;
    select sum(chinese)+sum(math)+sum(english) from exam;
    **** 刘备语文null ,null进行所有运算 结果都是null
    select sum(chinese)+sum(math)+sum(english) from exam; 含有刘备英语和数学成绩
    select sum(chinese+math+english) from exam; 不含刘备英语和数学成绩
    * 使用ifnull函数处理 null情况
    select sum(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam; 含有刘备英语和数学成绩

    统计一个班级语文成绩平均分 ------ select sum(chinese)/count(*) from exam;

    3) avg 统计某一列平均值 select avg(列名) from 表名;
    求一个班级数学平均分? ---- select avg(math) from exam;
    求一个班级总分平均分?---- select avg(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;
    select ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0) from exam;

    4) max 统计一列最大值 min 统计一列最小值
    求班级最高分和最低分(数值范围在统计中特别有用)
    select max(chinese+math+english) a ,min(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) i from exam;

    语法五:select 分组函数 from exam group by 列名; 按照某列进行分组统计 ***一组可能有多条数据
    分组操作,就是具有相同数据记录分到一组中,便于统计

    create table orders(
    id int,
    product varchar(20),
    price float
    );

    insert into orders(id,product,price) values(1,'电视',900);
    insert into orders(id,product,price) values(2,'洗衣机',100);
    insert into orders(id,product,price) values(3,'洗衣粉',90);
    insert into orders(id,product,price) values(4,'桔子',9);
    insert into orders(id,product,price) values(5,'洗衣粉',90);

    练习:对订单表中商品归类后,显示每一类商品的总价 ---- 需要按照商品名称进行分组
    select product,sum(price) from orders group by product; select * from orders group by product;错误!!!
    在group by 语句后面 添加having 条件语句 ---- 对分组查询结果进行过滤
    练习:查询购买了几类商品,并且每类总价大于100的商品
    select product,sum(price) from orders group by product having sum(price) > 100;

    试题:where 和 having 条件语句的区别 ?
    where 是在分组前进行条件过滤,having 是在分组后进行条件过滤
    使用where地方都可以用 having替换 , 但是having可以使用分组函数,而where后不可以用分组函数

    小结 select 语句 : S-F-W-G-H-O 组合 select ... from ... where ... group by... having... order by ... ;
    顺序不能改变
    解析顺序 : from - where - group by - having - select - order by

    =================================================================================================================
    MySQL 数据库的备份和恢复
    1、备份命令 mysql/bin/mysqldump 将数据库SQL语句导出
    语法:mysqldump -u 用户名 -p 数据库名 > 磁盘SQL文件路径

    例如: 备份day12数据库 --- c:day12.sql
    cmd > mysqldump -u root -p day12 > c:day12.sql 回车输入密码

    INSERT INTO `exam` VALUES (1,'关羽',85,76,70),(2,'张飞',70,75,70),(3,'赵云',90,65,95),(4,'刘备',NULL,55,38);

    2、恢复命令 mysql/bin/mysql 将sql文件导入到数据库
    语法: mysql -u 用户名 -p 数据库名 < 磁盘SQL文件路径
    ***** 导入SQL 必须手动创建数据库 ,SQL不会创建数据库

    例如:将c:day12.sql 导入 day12数据库
    cmd > mysql -u root -p day12 < c:day12.sql 回车密码

    补充知识:恢复SQL也可以在数据库内部执行 source c:day12.sql


    多表设计(外键约束)
    create table emp (
    id int primary key auto_increment,
    name varchar(20),
    job varchar(20),
    salary double
    );

    insert into emp values(null,'小丽','人力资源',4500);
    insert into emp values(null,'小张','Java工程师',5000);
    insert into emp values(null,'老李','财务经理',8000);
    insert into emp values(null,'小刘','项目经理',10000);

    create table dept(
    id int primary key auto_increment,
    name varchar(20)
    );

    insert into dept values(null,'人力资源部');
    insert into dept values(null,'财务部');
    insert into dept values(null,'技术研发部');

    让员工表和部门表发生关系,知道员工属于哪个部门 ,在员工表添加部门id字段
    alter table emp add dept_id int ;
    update emp set dept_id = 1 where name = '小丽';
    update emp set dept_id = 2 where name = '老李';
    update emp set dept_id = 3 where name = '小刘';
    update emp set dept_id = 3 where name = '小张';

    公司因为财政问题,解散技术研发部 delete from dept where name ='技术研发部'; ----- 小张和小刘 失去了组织

    emp表 中dept_id字段 引用 dept表 id 字段 ------- 添加外键约束 (保证数据有效和完整性)
    将emp表中dept_id 设置为外键约束 alter table emp add foreign key(dept_id) references dept(id) ;
    无法删除技术研发部 ,因为小刘和小张信息 依赖技术研发部 记录 !!!!!

    多表设计原则 :所有关系数据只能存在三种对应关系 (一对一、一对多、多对多)
    1、多对多关系 : 雇员和项目关系
    一个雇员可以参与多个项目
    一个项目可以由多个雇员参与
    ***老师 - 班级 学生-课程

    建表原则:必须创建第三张关系表,在关系表中引用两个实体主键 作为外键
    关系表中每条记录,代表一个雇员参与了一个项目

    2、一对多关系: 用户和博客关系
    一个用户可以发表多篇博客
    一个博客只能由一个作者

    建表原则:不需要创建第三方关系表,只需要在多方添加 一方主键作为 外键

    3、一对一关系 : 这种关系很少见到 负责人和工作室
    一个负责人 管理一个工作室
    一个工作室 只有一个负责人
    ***身份证 --人 学号 --学生

    建表规则:在任一方添加对方主键 作为外键

    ====================================================================================================================
    多表查询——笛卡尔积
    将A表中每条记录 与 B表中每条记录进行 匹配 获得笛卡尔积
    select * from emp;
    select * from dept;

    select * from emp,dept; 显示结果就是笛卡尔积
    笛卡尔积结果 就是 两个表记录乘积 例如A 表3条 B表4条 ---- 笛卡尔积 12条

    笛卡尔积结果是无效的,必须从笛卡尔积中选取有效的数据结果 !!!

    多表查询 连接查询 内连接查询
    从A表中选择一条记录,去B表中找对应记录 ----- 内连接 必须A表和B表存在对应记录才会显示

    create table A(A_ID int primary key auto_increment,A_NAME varchar(20) not null);
    insert into A values(1,'Apple');
    insert into A values(2,'Orange');
    insert into A values(3,'Peach');

    create table B(A_ID int primary key auto_increment,B_PRICE double);
    insert into B values(1,2.30);
    insert into B values(2,3.50);
    insert into B values(4,null);

    使用内连接 select * from a,b where a.a_id = b.a_id;
    * 内连接查询结果条数 一定小于 两个表记录较多哪个表 ----- 例如 A表3条 B表5条 ---- 内连接结果条数 <= 5

    select * from emp,dept where emp.dept_id = dept.id ; 将emp 表和dept 表进行内连接
    在内连接查询时 添加条件,查询人力资源部有哪些 员工 ??
    select * from emp,dept where emp.dept_id = dept.id and dept.name ='人力资源部';
    工资大于7000员工来自哪个部门? select * from emp,dept where emp.dept_id = dept.id and emp.salary > 7000;

    select * from emp,dept where emp.dept_id = dept.id ; 写法一
    select * from emp inner join dept on emp.dept_id = dept.id ; 写法二

    =======================================================================================================================
    内容小结:
    1、 mysql的安装配置 (卸载、root密码重置)
    2、 SQL语言的分类
    3、 SQL语句 database 操作
    4、SQL语句 table表结构 操作
    5、SQL语句 表数据记录操作 ***** insert update delete select
    6、MySQL数据库备份和恢复
    7、多表建表规则和多表查询 *****

    数据库完整性约束 :primary key 主键、unique 唯一、not null非空 、foreign key 外键、check 条件约束(mysql不支持,oracle中使用)

    课外知识点:E-R图绘制、范式(1NF 不可再分、2NF 部分依赖 3NF 传递依赖)

  • 相关阅读:
    RDD, DataFrame or Dataset
    RDD的基础知识
    RDD的源码
    窄依赖与宽依赖&stage的划分依据
    HDFS中的读写数据流
    HDFS的Java API
    使用distcp并行拷贝大数据文件
    Flume+Morphlines实现数据的实时ETL
    磕碰,擦伤了,紧急处理方法
    redis linux 基本命令
  • 原文地址:https://www.cnblogs.com/1020182600HENG/p/6047418.html
Copyright © 2020-2023  润新知