本周JavaEE知识点总结

Day25:

1.IO流的分类
按流的方向划分:
1)输入流
2)输出流
按流的类型划分:
1)字节流
字节输入流:InputStream(抽象类)
FileInputStream:针对文件操作的字节输入流(读)
字节缓冲输入流(字节高效输入流):BufferedInpuStream
字节输出流:OutputStream(抽象类)
FileOutputStream:针对文件操作的字节输出流(写)
字节缓冲输出流(字节高效输出流):BufferedOutputStream
2)字符流:
字符输入流:Reader:读
字节输入流通向字符输入流的桥梁(转换输入流):InputStreamReader
为了书写简单:FileReader
字符缓冲输入流(字符高效输入流):BufferedReader
特有功能:String readLine() :一次读取一行
字符输出流:Writer:写
字节输出流流通向字符输出流的桥梁(转换输出流):OutputStreamWriter
字符缓冲输出流(字符高效输出流):BufferedWriter
特有功能:
 public void newLine():写入一个行的分隔

字节流:
字节输出流:OutputStreamStream抽象类
提供具体的子类:FileOutputStream

2.字节输出流:写的功能

public void write(int b) throws IOException:给当前字节输出流中写入一个字节
public void write(byte[] b) throws IOException:写入一个字节数组
public void write(byte[] b,int off,int len)throws IOException:写一个字节数组的一部分

3.构造方法

public FileOutputStream(String name,boolean append) throws FileNotFoundException
创建一个文件输出流对象,第二个参数为true,在文件字节末尾处追加!

问题:输出一句内容,如何换行?

在windows操作系统中,使用换行符号"\r\n"

4.流中异常操作

流中加入异常操作

解决方案:try...catch...finally 标准格式

使用代码实现:

package com.zyc.io_01;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 

public class FileOutputStreamDemo {
    public static void main(String[] args) {

method3() ;


    }

  private static void method3() {
        FileOutputStream fos = null ;
        try {
           fos = new FileOutputStream("fos4.txt") ;
           fos.write("hello,i'm coming...".getBytes());
        } catch (IOException e) {
            e.printStackTrace(); 
        }finally {
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }


    }
5.复制文件操作

需求:将当前项目下的FileOutputStreamDemo.java 复制到D:\JavaEE_2104\EE_day25\code  

代码实现:

public class CopyFileDemo {

    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java") ;
        FileOutputStream fos  = new FileOutputStream("D:\\JavaEE_2104\\EE_day25\\code\\Copy.java") ;

        long start = System.currentTimeMillis() ;
        byte[] bytes = new byte[1024] ;
        int len = 0 ;
        while((len=fis.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }

        long end = System.currentTimeMillis() ;
        System.out.println("共耗时:"+(end-start)+"毫秒");
        fos.close();
        fis.close();
    }
}

6.抽象类的概念及其使用

抽象类:InputStream:表示字节输入流的所有类的超类
提供的针对文件操作的输入流:FileInputStream
 使用步骤:
1)创建文件操作输入流对象
public InputStream()
 2)通过 文件字节输入流对象,读取指定的文件中的内容
读取数据的功能:
public int read() throws IOException:一次读取一个字节
public int read(byte[] b) throws IOException: 读取一个字节数组,返回的是读取的实际字节数
public int read(byte[] b,int off,int len) throws IOException:读取一部分字节数组
3)释放资源
 一次读取一个字节:
读取一些文件,中文会出现乱码,原因就是将实际的字节数强制转为char类型

7.缓冲流
BufferedOutputStream
BufferedOutputStream(OutputStream out) :指定默认的缓冲长度
写操作
public void write(int b)
public void write(byte[] b,int off,int len)
BufferedInputStream
BufferedInputStream(InputStream in)
读操作
public int read()
public int read(byte[] bytes)
public int read(byte[] bytes,int offset,int len)
内部只是提供一个字节数组(缓冲区):长度8192个长度
构造方法都是默认的缓冲区大小,文件的操作还需要通过最底层的基本的字节流操作
缓冲流都是不直接操作文件,仅仅是提供内部缓冲区(提高读写效率!)

8.文件读写的复制方式

基本的字节流:一次一个字节
基本的字节流:一次一个字节数组
字节缓冲流:一次一个字节
字节缓冲流:一次一个字节数组

9.字符缓冲输入流和字符缓冲输出流

字符缓冲输入流和字符缓冲输出流:提供默认的缓冲区大小,读写的操作还需要交给底层字节流
为了针对文本文件操作,提高执行效率!
BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
构造方法
BufferedWriter(Writer out)
成员方法:
public void newLine():换行功能
字符缓冲输入流:BufferedReader
构造方法:
public BufferedReader(Reader in)
特有功能:
public String readLine()

10.键盘录入的三种方式

(1)main方法的参数
(2)jdk5以后提供的Scanner
(3)BufferedReader

package com.zyc.io_04;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) throws Exception{

        InputStream in = System.in ;
        Reader r = new InputStreamReader(in) ;

        BufferedReader br = new BufferedReader(r) ;
        System.out.println("请您输入一个int类型的内容:");
        String line = br.readLine(); 

        int i = Integer.parseInt(line); 
        System.out.println("您输入的数据是:"+i);
    }
}


Day26

1.Properties

Properties 继承自Hashtable<K,V>---->实现Map<K,V>接口
表示了一个持久的属性集
Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
构造方法
public Properties()

关于属性集合类的特有功能:
添加方法
public Object setProperty(String key,String value)
 遍历:
public Set<String> stringPropertyNames()
通过键获取值
public String getProperty(String key)

关于属性集合类的应用;
1)因为键和值都是String,所以可能将键和值的保存在文本文件或者配置文件中 :加载过程
public void load(Reader reader)throws IOException
public void load(InputStream in)throws IOException
2)将属性集合类中的内容写出到某个文件中:保存过程
public void store(OutputStream out,String comments) throws IOException
参数1:当前字节输出流
参数2:给当前属性列表中写入完毕之后,注释的内容
public void store(Writer writer,String comments) throws IOException
将当前项目下的name.txt内容加载到属性集合类中

2.UDP协议

UDP协议接收端实现
1)创建接收端的Socket
public DatagramSocket(int port) throws SocketException:绑定端口号
2)数据一个数据报包对象:DatagramPacket
接收容器
public DatagramPacket(byte[] buf, int length) :获取的是缓冲区的数据(不是真实数据)
一般情况:byte[] bytes = new byte[1024] ; 自定义字节缓冲区
3)接收
public void receive(DatagramPacket p):阻塞式方法:在接收数据之前,一直处于阻塞状态,直到
当前接收端监听客户端口号了
4) 获取缓冲区的传递的真实数据
public byte[] getData():获取真实的字节数组
public int getLength():获取实际长度
将获取的字节数据---->String(byte[] bytes,int offset,int length)
获取哪个发送端传递的数据:ip 文本形式:
public InetAddress getAddress()
IntegerAddss--->public String getHostAddress()
5)使用完毕,关闭接收端
注意:接收端不能运行多次,否则出现异常了,端口号被占用!

3.UDP协议发送端的实现步骤

DatagramSocket表示用来发送和接收"数据报包"的套接字
1)创建发送端的Socket:  DatagramSocket
public DatagramSocket() throws SocketException{}
2) 创建 "数据报包"对象
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
3)发送数据报包
public void send(DatagramPacket p) throws IOException
4)释放资源
close()关闭socket对象

代码实现:

public class SendDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket() ;

       
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
        String messageStr = "hello,UDP,我来了" ;
        byte[] bytes = messageStr.getBytes();
        int length = bytes.length ;
        InetAddress inetAddress = InetAddress.getByName("10" +   ".12.152.129");
        int port = 10086 ;
        DatagramPacket dp = new DatagramPacket(bytes, length, inetAddress, port);
        ds.send(dp);
        System.out.println("当前数据已经发送...");
        ds.close();
    }
}
 

Day27

1.什么是反射?

反射就是获取一个类的字节码文件,然后加载该类的所有的成员
成员变量所在类---->Field
成员方法所在类---->Method
构造方法所在类--->Constructor
给成员变量赋值通过Field,调用成员方法Method,通过构造器创建的对象...

MySQL部分

什么是数据库?

存储数据的仓库!
特点:
        永久存储
        可以支持一些事务
        (数据库的事务----将整个业务操作看成一个整体)
        执行效率高(通过sql语句)
        
之前存储方式:
                1)临时变量   存储在内存中,方法结束 局部变量就消失了
                2)数组     存储同一种类型元素,但是长度固定的!
                3)StringBuffer: 字符串缓冲区  :里面存储的可变的字符序列
                4)集合    存储任意类型元素,必须引用类型 
                                取元素: 遍历 (单例集合:Iterator)
                                                增强for循环
                         存储大量大数据,效率太低
                5)IO流:也能存储数据
                                太耗时(读写过程)

常见的数据库:

关系型数据库:Oracle,MySQL,SqlServer

非关系型数据库:NoSQL,MangoDb

DL语句(重点):
操作数据库
                
查询当前服务器软件中的所有的数据库
show databases;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |-- mysql服务器相关的配置
| mysql              |-- 存储很多相关的用户表user(权限用户)
| performance_schema |-- 跟mysql性能优化相关的表信息
| test               |-- 测试数据库
+--------------------+                

创建新的数据库
create database 数据库名称;
create database if not exists 数据库名称;

mysql> create database if not exists EE_2104;
Query OK, 1 row affected (0.01 sec)

查看创建的数据库的默认字符集
 show create database 数据库名称;
 mysql> show create database ee_2104;
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| ee_2104  | CREATE DATABASE `ee_2104` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

修改数据库的默认字符集
alter database 数据库名称 DEFAULT(可以省略) CHARACTER SET 字符集;
mysql> alter database ee_2104 character set gbk;
Query OK, 1 row affected (0.00 sec)

mysql> show create database ee_2104;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| ee_2104  | CREATE DATABASE `ee_2104` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-----------------------------------------------------------------+ 


删除数据库
drop database 数据库名称;
drop database if exists 数据库名称;
mysql> drop database if exists ee_2104;
Query OK, 0 rows affected (0.00 sec)


切换数据库(数据库本身就是一个文件夹,进入到某个文件夹中)
use 数据库名称;
mysql> use ee_2104;
Database changed


DDL语句:来操作表
mysql> show tables; 查询当前指定数据库中的所有表
Empty set (0.01 sec)

创建表的语法:
        create table 表名(
            字段名称1 字段类型1,
            字段名称2 字段类型2,
            字段名称3 字段类型3,
            ....
            字段名称n 字段类型n
        
        );
        
        mysql常见的字段类型
        int:整数类型(推荐):默认11位
            当给定的值,它获取到当前整数的实际长度(自动获取)
            age int,----age = 50
        int(位数):不推荐
            int(4)  ---age = 5       0005
            
        varchar(指定长度):就是java类的String  字符串类型:推荐使用'',也可以双引号 ,也可以不带引号
                举例
                        name varchar(20):name字段最大能支持20个字符
                        
        date:日期  : 仅仅只是表示日期,没有时间
        datetime:日期+当前时间
        timestap:时间戳  (就当前被访问/操作具体:当前系统时间)
        double(5,3):小数类型,可以5位数据,小数点后3位...
        double 小数类型:100  --->100.0
                
mysql> create table student(
    -> sid int,
    -> name varchar(10),
    -> age int,
    -> address varchar(10),
    -> gender varchar(5),
    -> birthday date
    -> );
Query OK, 0 rows affected (0.02 sec)


查询表的结构:desc 表名;
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid      | int(11)     | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| address  | varchar(10) | YES  |     | NULL    |       |
| gender   | varchar(5)  | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.03 sec)                    
                    
            
修改表:
给表中添加一列(添加一个字段)
alter table 表名 add 字段名称 字段类型;
mysql> alter table student add hobit varchar(20);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0            
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid      | int(11)     | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| address  | varchar(10) | YES  |     | NULL    |       |
| gender   | varchar(5)  | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
| hobit    | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+            

修改表的字段名称
alter table 表名 change 以前的列名称 新的列名称 以前的字段类型;            
mysql> alter table student change gender sex varchar(5);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid      | int(11)     | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| address  | varchar(10) | YES  |     | NULL    |       |
| sex      | varchar(5)  | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
| hobit    | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.02 sec)

修改表的字段类型
alter table 表名 modify 字段名称 更改后的字段类型;
mysql> alter table student modify sex varchar(3) ;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid      | int(11)     | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| address  | varchar(10) | YES  |     | NULL    |       |
| sex      | varchar(3)  | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
| hobit    | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.02 sec)


修改的表的名称
alter table 以前表名 rename to 新表名;
mysql> alter table student rename to stu;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+-------------------+
| Tables_in_ee_2104 |
+-------------------+
| stu               |
+-------------------+
1 row in set (0.02 sec)


创建表的时候复制一张相同的表
create table 新表名 like 存在的表名; 
mysql> create table teacher like stu;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+-------------------+
| Tables_in_ee_2104 |
+-------------------+
| stu               |
| teacher           |
+-------------------+
2 rows in set (0.00 sec)

mysql> desc teacher;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid      | int(11)     | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | NULL    |       |
| address  | varchar(10) | YES  |     | NULL    |       |
| sex      | varchar(3)  | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
| hobit    | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.01 sec)


删除表
drop table 表名;
drop table if exists 表名;
mysql> drop table teacher;
Query OK, 0 rows affected (0.02 sec)

Day28

1.数据库的操作语句

插入语法
语法1:insert into 表名 values(字段值1,字段值2,...n:全部字段) ;

语法2:插入部分字段
inset into 表名 (字段名称1,字段名称2,字段名称3..) values(值1,值2,值3..) ;

语法3:插入全表字段或者部分字段的时候,可以一次性插入多条记录
insert into 表名 values(字段值1,字段值2,...n:全部字段),(字段值1,字段值2,...n:全部字段),(...)

注意事项
    插入数据的时候,必须保证插入值对应的字段类型一致,否则会存在潜在问题(类型不匹配)
    插入全表字段的值必须总数据要和字段列名的总数一致

update语句:修改
基本的用法:带条件进行修改 
update 表名 set 字段名称 = 值 where xx =xx ;

删除:带条件来删除 delete from 表名  where ...

delete from 表名:
     TRUNCATE TABLE 表名; 
     
     都是删除全表数据,那么有什么不同?
delete from 表名:只是删除表中的全部数据,那么当前表的结构还存在,针对自增长主键id,下次
从之前id值继续自增;
    
     TRUNCATE TABLE 表名; 会将当前表的全部数据以及表都删除掉,
并且自动创建一张一模一样的表,直接影响自增长主键,从0继续开始自增!    

2.DQL语句: 数据库查询语句(重点)        

基本查询

DQL语句的基本查询
带指定字段的查询
查询student表中学生信息(id,name,age,sex,address)
SELECT
    id,
    NAME,
    age,
    sex,
    address
FROM
    student ;
SELECT 
    address
FROM 
    student ;

DQL语句之带where条件的查询
where 赋值运算符  =
where  比较运算符 ==,<,<=,>,>=,!=,<>(不等于)
 where  其他符号:&& ,|| , and ,or , between  and ...
-- where  字段名称 in(值1,值2,值3) 
-- where 字段名称 是否为null  (is null)  :为空   is not null 

DQL语句的模糊查询
select 字段列表 from 表名 字段名称 like(关键字) '%xx%'
 %:表示可以匹配的任意的多个字符  一般都是 '%字符值%':包含指定的字符的信息 模糊查询出来
 _:表示代替一个字符: 模糊查询 名字为三个字符的人 '___'   
-- : 模糊查询姓名为两个字符的人,'_化'    
-- 模糊查询当前mysql服务器中所有的字符集的编码
 

DQL语句聚合函数查询    
count(字段名称):查询总记录数
avg(字段名称):查询当前字段的平均值
max(字段名称):查询当前字段的最大值
min(字段名称):查询当前字段的最小值
sum(字段名称):当前字段的求和值

多表查询---子查询
    查询数学平均分的学生信息
        select
             *
             from 
             
             student
              where avg(math) = 70;

DQL之 排序查询
select 字段列表 from 表名 order by 字段名称 排序方式
排序方式:asc :升序(默认值)    desc :降序
将的数学成绩升序排序 查询全部学生信息

分组查询:关键字:group by
    针对分组查询的时候,可以查询什么?
        1)可以查询分组的字段
        2)查询聚合函数  
        
        select 字段列表 ,聚合函数 from 表名 group by 分组的字段;
        注意:group by 后面不能跟聚合函数,否则语法通过不了

分组查询:group by 带条件查询,必须先使用条件,然后在参与分组    
where 语句必须放置在group by之前;
   查询时候
    分析:查询哪个字段
         带什么条件查
         有没有分组(需要分组,where条件必须在前)
         有没有筛选,如果有筛选,有分组
         先where,
         再分组
         再筛选...

筛选:having 
    筛选后面可以使用聚合函数,而且如果sql语句有where条件,有group by ,有having
    where必须置于group by之前,
    group by 必须置于having 之前!

     

分页查询
-- mysql:limit 起始行数,每页显示的条数;

-- select 字段列表 from 表名 limt 起始行数,每页显示的条数;

Day29   

1.数据库的约束
就是约束用户操作表的行为
针对一些字段设置用户的限制!

默认约束 :default(当用户没有插入指定的这个字段,启用默认约束--->默认值)

2.唯一约束

唯一约束 unique (限定某个字段的不能重复,必须唯一的)
CREATE TABLE emp(
    id INT UNIQUE, -- 唯一约束
    NAME VARCHAR(10) ,
    age INT
) ;

3.删除唯一约束

删除唯一约束

atler table 表名 drop index 唯一约束所作用的字段名称
ALTER TABLE emp DROP INDEX id ;

4.添加唯一约束

添加唯一约束
ALTER TABLE emp MODIFY id INT UNIQUE ;

5.主键约束

主键约束:primary key 
-- 特点:非空+唯一
CREATE TABLE emp(
     id INT PRIMARY KEY, -- 主键约束
     NAME VARCHAR(10)
 );

6.删除主键约束

删除主键约束 
-- alter table 表名 drop PRIMARY KEY ;

7.添加主键约束

添加主键约束
ALTER TABLE emp MODIFY id INT PRIMARY KEY ;

UPDATE emp SET id = 4 WHERE NAME = '周冬雨' ;

8.自增长约束

自增长约束:auto_increment和主键一块使用

-- 一般都作用于非业务字段(xxid)

-- (默认值:0开始,当前插入数据之后,自增长的主键的值会依次自增1)

9.级联操作

有外键的表--->删除和修改都比较麻烦 (操作从表---主表)
CASCADE:级联操作
on update cascade  级联修改
 当修改主表字段,那么跟从表相关的信息一会被更改
on delete cascade  级联删除

 添加外键的同时--添加级联修改和级联删除
ALTER TABLE employee
        ADD      
        CONSTRAINT
     fk_dept_emp 
    FOREIGN KEY 
        (dept_id)
    REFERENCES 
        dept(id) 
        ON UPDATE CASCADE   --  添加级联修改
        ON DELETE CASCADE ; --  添加级联删除

10.数据库的备份和还原

方式1:
    命令行的方式
    数据库的备份
    
    mysqldump.exe 指令 :备份指令
    
    进入dos
     输入 :mysqldump -uroot -p密码  数据库名 > 路径
     mysqldump -uroot -p123456 ee_2104 > D:\JavaEE_2104\EE_day29\code\my.sql
     
     将ee_2104这个库中所有表都存储在D:\JavaEE_2104\EE_day29\code\my.sql文件中
     
     
     数据库还原
     1)通过dos先登录mysql
     2)删除原来备份过的数据库
     3)创建空数据库
     4)source 指定之前备份的路径的sql文件 : 自动的进行创建以及表中数据进行插入...
     
     source D:\JavaEE_2104\EE_day29\code\my.sql
     
    
   方式2:图形界面化:直观简单 
       sqlYog /navicat
      
      备份:
        鼠标选择指定数据库,右键--->备份--->以sql文件转存数据库---指定路径
        
      还原: 
    1)删除当前数据库
    2)创建新的数据库
    3)选择新建的数据库名---右键--->导入--->以sql转储文件数据库

11.数据库范式

数据库范式:就是设计关系型数据库使用的一种规范要求!

 常用的范式:三大范式
 1NF:第一范式
 
        在设计关系数据数据库是,最低要求必须遵循1NF
  表中的每一列是不可再拆分的!(独立的原子项)
 
2NF:第二范式
      在1NF的基础上,非主键字段(属性字段)必须完全依赖于主键字段
 
3NF:第三范式


  在第二范式基础上,非主键字段(主键字段和非主键字段)之间不能产生传递依赖!
    A字段-->B字段--->C字段
    A字段--->C字段  (传递依赖)

12.多表查询

多表查询之显示内连接:就是通过where 设置条件 

隐式内连接和显示内连接 :内连接查询
 
 优先采用显示内连接 :where语句 ,然后其次使用隐式内连接

13.外连接(推荐左外)

左外:(推荐)select 字段列表 from 表名1 left outer(可以省略) join 表名2  on 表名1和表名2的连接条件
将左表中的全部数据以及交集(符号连接条件)的数据查询出来

右外:将右表的数据全部查询以及多个表之间的交集数据查询出来
格式: select 字段列表 from 表名1 right outer join 表名2 on 连接条件;

14.子查询

select语句嵌套select语句

多行单例
in语句---使用or 进行或的关系
 

 

 


        

 

 

                                
                         
    

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值