十八、十九天筆記總結

一:網絡編程三要素+UDP協議
1.1
1.網絡通信介紹
2.tcp/ip
3.udp/ip
 
1.2
Socket通信
         *網絡編程三要素:
                   ip:
                            一個計算的標示(找到這個計算機)
                   端口:
                            應用程序都會對應一個端口,用來進行通信,有效端口:0~65535,其中0~1024系統使用或保留端口(360查看端口)。
                   協議:
                            總共有2種協議(TCP,UDP)
        
        
         *舉例說明:
                   1.找到劉詩詩(ip)
                   2.對着劉詩詩的而耳朵說話(端口)
                   3.協議
 
 
1.3            
         三要素詳解:
         特殊的IP地址:
                  
                   127.0.0.1 本地迴環地址         用來做一些本地測試    
                   ping IP地址     ; 用來檢測本機是否可以和指定的IP地址的計算機可以進行正常通訊
                   ipconfig                 用來查看IP地址
                   xxx.xxx.xxx.255廣播地址
                  
         端口號:
 
                   物理端口                   物理設備對應的端口     , 網卡口
                   邏輯端口                   用來標示我們的計算機上的進程 , 端口號的有效範圍應該是 0-65535         ,
                                                        其中0-1024被系統佔用或者保留
                  
         協議:
 
                   UDP
                            把數據打成一個數據包 , 不需要建立連接
                            數據包的大小有限制不能超過64k
                            因爲無連接,所以屬於不可靠協議(可能丟失數據)
                            因爲無連接 ,所以效率高     
                   TCP
                            需要建立連接,形成連接通道
                            數據可以使用連接通道直接進行傳輸,無大小限制
                            因爲有鏈接,所以屬於可靠協議
                            因爲有鏈接,所以效率低       
 
1.4   (InetAddress)
         *      
                   /*
                    * InetAddress:IP地址的描述類
                    *
                            A:InetAddress類的概述
                                     爲了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress供我們使用
                                     此類表示互聯網協議(IP) 地址。
                            B:InetAddress類的常見功能
                                     publicstatic InetAddress getByName(String host)( host: 可以是主機名,也可以是IP地址的字符串表現形式)
                                     publicString getHostAddress()返回 IP 地址字符串(以文本表現形式)。
                                     publicString getHostName()獲取此 IP 地址的主機名。
                            C:案例演示:    InetAddress類的常見功能
                    */
package com.edu_01;
 
import java.net.InetAddress;
import java.net.UnknownHostException;
 
/*
 * InetAddress:IP地址的描述類
 *
         A:InetAddress類的概述
                   爲了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress供我們使用
                   此類表示互聯網協議(IP) 地址。
         B:InetAddress類的常見功能
                   publicstatic InetAddress getByName(String host)( host: 可以是主機名,也可以是IP地址的字符串表現形式)
                   publicString getHostAddress()返回 IP 地址字符串(以文本表現形式)。
                   publicString getHostName()獲取此 IP 地址的主機名。
         C:案例演示:    InetAddress類的常見功能
 */
public class InetAddressDemo {
         publicstatic void main(String[] args) throws Exception {
                   //通過主機ip獲取InetAddress對象
                   InetAddressaddress = InetAddress.getByName("192.168.20.25");
                  
                   //publicString getHostAddress()返回 IP 地址字符串(以文本表現形式)。
                   System.out.println(address.getHostAddress());
                  
                   //publicString getHostName()獲取此 IP 地址的主機名。
                   System.out.println(address.getHostName());
                  
         }
 
}
                    
1.5(也叫socket編程,套接字編程,網絡編程,叫法不一樣都是一個東西)             
         *  Socket套接字:(利用qq聊天的案例畫圖進行講解)
                            網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字。
                           
                            Socket原理機制:
                            通信的兩端都有Socket。
                            網絡通信其實就是Socket間的通信。
                            數據在兩個Socket間通過IO傳輸。
         packagecom.edu_02;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
 
/**
 *UDP協議特點:
 * 1.數據通過打包之後進行發送
 * 2.不需要進行連接
 * 3.數據大小有限制
 * 4.協議屬於不安全協議
 * 5.效率比較高
 */
public class UdpClient {
         publicstatic void main(String[] args) throws Exception {
                   //1.創建udp協議發送端的socket對象
                   //publicDatagramSocket() throws SocketException
                   DatagramSocketds = new DatagramSocket();
                  
                   byte[]buf = "hello".getBytes();
                   intlength = buf.length;
                   InetAddressaddress = InetAddress.getByName("192.168.20.254");
                   intport = 8888;
                  
                   //2.創建數據包
                   //publicDatagramPacket(byte[] buf, int length,InetAddress address,int port)
                   DatagramPacketdp = new DatagramPacket(buf, length, address, port);
                   /**
                    * 1.你要發送的數據
                    * 2.發送的數據的長度
                    * 3.你要發送給的電腦ip
                    * 4.端口
                    */
                  
                   //發送數據
                   ds.send(dp);
                  
                   //釋放資源
                   ds.close();
                  
                  
         }
 
}
 
package com.edu_02;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
 
public class UdpServer {
         publicstatic void main(String[] args) throws Exception {
                   //創建接收端的socket對象
                   DatagramSocketds = new DatagramSocket(8888);
                  
                   //創建一個數據包,用來接收來自發送端的數據,是一個空的數據包
                   byte[]buf = new byte[1024];
                   intlength = buf.length;
                   DatagramPacketdp = new DatagramPacket(buf, length);
                  
                   //接受來自發送端的數據
                   //publicvoid receive(DatagramPacket p)throws IOException
                   //程序在這裏接收到來自發送端的數據之前一直處於阻塞狀態
                   ds.receive(dp);
                  
                   //解析一下數據包中的數據
                   //publicbyte[] getData()返回數據緩衝區
                   byte[]data = dp.getData();
                   //publicint getLength()返回將要發送或接收到的數據的長度
                   intlen = dp.getLength();
                  
                   System.out.println(newString(data,0,len));
                  
                   //釋放資源
                   ds.close();
                  
         }
 
}
1.6  
         分協議進行講解網絡編程
         *UDP協議:(寫一個標準demo)
                   特點:1.把數據打包
                              2.不需要建立連接,也稱爲面向無連接協議
                              3.數據需打包,數據大小有限制64k
                              4.無需建立連接,所以不可靠
                              5.速度快
                             
                              UDP通信步驟:
                                               發送端步驟:
                                               /*
                                                * UDP發送數據的步驟:
                                                * A:創建UDP發送數據端Socket對象
                                                * B:創建數據包,並給出數據,把數據打包
                                                * C:通過Socket對象發送數據包
                                                * D:釋放資源
                                                */
                                                
                                                接收端步驟:
                                               /*
                                                * UDP協議接收數據步驟:
                                                * A:創建UDP接收數據端Socket對象
                                                * B:創建一個接收數據的數據包
                                                * C:接收數據,數據在數據包中
                                                * D:解析數據包,並把數據顯示在控制檯
                                                * E:釋放資源
                                                */
 
 
1.8 鍵盤錄入數據實現數據的動態發送
package com.edu_03;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
 
/**
 *1.8 鍵盤錄入數據實現數據的動態發送
 *
 */
public class UdpClient {
         publicstatic void main(String[] args) throws Exception {
                   //1.創建發送端的socket對象
                   DatagramSocketds = new DatagramSocket();
                  
                   InetAddressaddress = InetAddress.getByName("192.168.20.254");
                   intport = 9999;
                  
                   //2.創建鍵盤錄入對象
                   Scannersc = new Scanner(System.in);
                   Stringline;
                   while((line=sc.nextLine())!=null) {
                            //鍵盤錄入的數據line
                            byte[]buf = line.getBytes();
                            intlength = buf.length;
                            DatagramPacketdp = new DatagramPacket(buf, length, address, port);
                            //發送數據包
                            ds.send(dp);
                   }
                  
                   //釋放資源
                   ds.close();
                  
         }
 
}
 
package com.edu_03;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
 
public class UdpServer {
         publicstatic void main(String[] args) throws Exception {
                   //創建接收端的socket對象
                   DatagramSocketds = new DatagramSocket(9999);
                  
                   //接受來自客戶端的數據
                   while(true) {
                            //創建數據包
                            byte[]buf = new byte[1024];
                            intlength = buf.length;
                            DatagramPacketdp = new DatagramPacket(buf, length);
                           
                            //接受來自客戶端的數據
                            ds.receive(dp);
                           
                            //解析數據包中的數據
                            byte[]data = dp.getData();
                            intlen = dp.getLength();
                            System.out.println(newString(data, 0, len));
                           
                   }
                  
         }
 
}
1.10 多線程實現聊天室(相當於是將發送數據端和接收數據端合併)
package com.edu_04;
 
import java.net.DatagramSocket;
import java.net.SocketException;
 
public class ChatRoom {
         publicstatic void main(String[] args) throws Exception {
                   //啓動發送線程和接收縣城
                   //啓動發送線程
                   newThread(new UdpCilent(new DatagramSocket())).start();
                  
                   //啓動接收線程
                   newThread(new UdpServer(new DatagramSocket(9999))).start();
                  
         }
 
}
package com.edu_04;
 
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
 
public class UdpCilent implements Runnable{
        
         DatagramSocketds ;
        
         publicUdpCilent(DatagramSocket ds){
                   this.ds= ds;
         }
 
         @Override
         publicvoid run() {
                   try{
                            InetAddressaddress = InetAddress.getByName("192.168.20.255");
                            intport = 9999;
                           
                            //2.創建鍵盤錄入對象
                            Scannersc = new Scanner(System.in);
                            Stringline;
                            while((line=sc.nextLine())!=null) {
                                     //鍵盤錄入的數據line
                                     byte[]buf = line.getBytes();
                                     intlength = buf.length;
                                     DatagramPacketdp = new DatagramPacket(buf, length, address, port);
                                     //發送數據包
                                     ds.send(dp);
                            }
                           
                            //釋放資源
                            ds.close();
                   }catch (Exception e) {
                            //TODO Auto-generated catch block
                            e.printStackTrace();
                   }
         }
 
}
 
package com.edu_04;
 
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
 
public class UdpServer implements Runnable{
         DatagramSocketds ;
        
         publicUdpServer(DatagramSocket ds){
                   this.ds= ds;
         }
 
         @Override
         publicvoid run() {
                   try{
                            //接受來自客戶端的數據
                            while(true) {
                                     //創建數據包
                                     byte[]buf = new byte[1024];
                                     intlength = buf.length;
                                     DatagramPacketdp = new DatagramPacket(buf, length);
                                    
                                     //接受來自客戶端的數據
                                     ds.receive(dp);
                                    
                                     //獲取發送信息的人的ip地址
                                     Stringip = dp.getAddress().getHostAddress();
                                    
                                     //解析數據包中的數據
                                     byte[]data = dp.getData();
                                     intlen = dp.getLength();
                                     System.out.println(ip+":"+newString(data, 0, len));
                                    
                            }
                   }catch (Exception e) {
                            //TODO Auto-generated catch block
                            e.printStackTrace();
                   }
         }
 
}
 
二:TCP協議要點
2.1                              
         *TCP協議:(寫一個demo)
                   特點:1.需要建立通道
                              2.傳送大量數據無限制
                              3.面向連接
                              4.可靠
                              5.速度慢
                              TCp協議書寫步驟:
                              發送端:
                              /*
                                      * TCP協議發送數據步驟:
                                      * A:創建TCP協議發送端Socket對象
                                      *             指定服務器IP及端口
                                      Socket sk = newSocket("192.168.3.120" , 9527) ;
                                      * B:獲取輸出流,並寫數據
                                      OutputStream outputStream =sk.getOutputStream() ;
                                      outputStream.write("hello,TCP我來了".getBytes());
                                      * C:釋放資源
                                      sk.close() ;
                                      *
                                      * java.net.ConnectException: Connectionrefused: connect
                                      * TCP協議是不能直接運行客戶端的,必須先運行服務器。因爲他是一種可靠的協議。
                                      */
                                      
                                      接收端:
                                      /*
                                                * TCP協議接收數據步驟:
                                                * A:創建TCP協議接收端Socket對象
                                                  ServerSocket ss = new ServerSocket(9527) ;
                                                * B:監聽客戶端連接
                                                  Socket sk = ss.accept() ;
                                                * C:獲取輸入流,並讀取數據,顯示在控制檯
                                                // 讀取數據
                                               byte[]bytes = new byte[1024] ;
                                               intlen = inputStream.read(bytes) ;
                                              
                                               //public InetAddress getInetAddress()獲取IP地址
                                               InetAddressinetAddress = sk.getInetAddress() ;
                                               Stringip = inetAddress.getHostAddress() ;
                                              
                                               //輸出
                                               System.out.println(ip+ "發來數據是: " + new String(bytes , 0 , len));
                                                * D:釋放資源
                                                sk.close() ;
                                                */
package com.edu_05;
 
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
 
/**
 *tcp:
 * 1.必須建立鏈接,這個協議又被稱爲面向鏈接協議
 * 2.發送數據沒有大小限制
 * 3.協議比較安全
 * 4.效率低
 *
 * 先運行客戶端的時候拋出異常:
 *java.net.ConnectException: Connection refused: connect
 * 因爲服務器端還沒有準備好跟你的客戶端建立連接呢,你就來了,所以拋出異常,因爲tcp
 * 協議是面向連接的一個協議
 *
 */
public class TcpClient {
         publicstatic void main(String[] args) throws Exception {
                   //創建tcp協議發送端的socket對象
                   //publicSocket(String host,int port)
                   Socketsk = new Socket("192.168.20.254", 10086);
                  
                   //2.publicOutputStream getOutputStream()throws IOException
                   //從通道中獲取輸出流對象
                   OutputStreamos = sk.getOutputStream();
                  
                   //3.給通道中寫數據
                   os.write("hello".getBytes());
                  
                   //4.釋放資源
                   sk.close();
                  
         }
 
}
package com.edu_05;
 
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class TcpServer {
         publicstatic void main(String[] args) throws Exception {
                   //1.創建服務器端的sokeck對象
                   //publicServerSocket(int port)throws IOException
                   ServerSocketss = new ServerSocket(10086);
                  
                   //2.堅挺來自客戶端的連接
                   //publicSocket accept()throws IOException偵聽並接受到此套接字的連接。此方法在連接傳入之前一直阻塞。
                   Socketsk = ss.accept();
                  
                   //3.從通道中讀取來自客戶端的數據
                   InputStreamis = sk.getInputStream();
                  
                   //4.讀取is
                   byte[]buf = new byte[1024];
                   intlen = is.read(buf);
                   System.out.println(newString(buf, 0, len));
                  
                   //5.釋放資源
                   sk.close();
         }
 
}
                                                
2.2  
用TCP協議寫一個數據的發送和接收,接收端接收到數據之後給發送端一個反饋
 
package com.edu_06;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class TcpClient {
         publicstatic void main(String[] args) throws Exception {
                   //創建tcp發送端的sockt對象
                   Socketsk = new Socket("192.168.20.254", 10000);
                  
                   //從通道中獲取輸出流
                   OutputStreamos = sk.getOutputStream();
                  
                   //網通道中寫數據
                   os.write("今晚約嗎".getBytes());
                  
                   //接受來自服務器端的反饋
                   InputStreamis = sk.getInputStream();
                   //解析is
                   byte[]buf = new byte[1024];
                  int len = is.read(buf);
                   System.out.println(newString(buf, 0, len));
                  
                   //釋放資源
                   sk.close();
                  
         }
 
}
package com.edu_06;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class TcpServer {
         publicstatic void main(String[] args) throws Exception {
                   //創建服務器端的socket對象
                   ServerSocketss = new ServerSocket(10000);
                  
                   //監聽來自客戶端的連接
                   Socketsk = ss.accept();
                  
                   //從通道中獲取輸入流讀取數據
                   InputStreamis = sk.getInputStream();
                  
                   //解析is
                   byte[]buf = new byte[1024];
                   intlen = is.read(buf);
                   System.out.println(newString(buf, 0, len));
                  
                  
                   //給客戶端一個反饋
                   OutputStreamos = sk.getOutputStream();
                   os.write("不約".getBytes());
                  
                  
                   //釋放資源
                   sk.close();
                  
                  
         }
 
}                          
2.4
需求: 客戶端鍵盤錄入數據,服務器端接收數據在控制檯輸出
package com.edu_07;
 
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
 
/**
 *  2.4
         需求: 客戶端鍵盤錄入數據,服務器端接收數據在控制檯輸出
 *  
 */
public class TcpClient {
         publicstatic void main(String[] args) throws Exception {
                   //創建tcp發送端socket對象
                   Socketsk = new Socket("192.168.20.254", 20000);
                  
                   //創建鍵盤錄入對象
                   Scannersc = new Scanner(System.in);
                   Stringline;
                   while((line=sc.nextLine())!=null) {
                            //將line這個數據寫如通道
                            OutputStreamos = sk.getOutputStream();
                            os.write(line.getBytes());
                           
                   }
                  
                   sk.close();
                  
         }
 
}
package com.edu_07;
 
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class TcpServer {
         publicstatic void main(String[] args) throws Exception {
                   //創建服務器端的socket對象
                   ServerSocketss = new ServerSocket(20000);
                  
                   //監聽來自客戶端的連接
                   Socketsk = ss.accept();
                   while(true) {
                            InputStreamis = sk.getInputStream();
                            byte[]buf = new byte[1024];
                            intlen = is.read(buf);
                            System.out.println(newString(buf, 0, len));
                   }
                  
                  
         }
 
}
2.5
需求:客戶端鍵盤錄入數據,服務端將數據寫入文件
package com.edu_08;
 
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
 
public class TcpClient {
         publicstatic void main(String[] args) throws Exception {
                   /**
                    * 2.5
                            需求:客戶端鍵盤錄入數據,服務端將數據寫入文件
                            客戶端
                            一次寫一行
                           
                            服務端:
                            一次讀取一行,將讀取到的內容寫入文件
                    */
                   //創建tcp客戶端socket對象
                   Socketsk = new Socket("192.168.20.254", 10010);
                   BufferedWriterbw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
                  
                   //創建鍵盤錄入對象
                   Scannersc = new Scanner(System.in);
                   Stringline;
                   while((line=sc.nextLine())!=null) {
                            //往通道中寫數據,一次寫一行
                            bw.write(line);
                            bw.newLine();
                            bw.flush();
                   }
                  
                   sk.close();
         }
 
}
package com.edu_08;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
 
public class TcpServer {
         publicstatic void main(String[] args) throws Exception {
                   //創建服務器端的socket對象
                   ServerSocketss = new ServerSocket(10010);
                  
                   //監聽客戶端連接
                   Socketsk = ss.accept();
                  
                   //從sk的通道中讀取數據,一次讀取一行
                   BufferedReaderbr = new BufferedReader(new InputStreamReader(sk.getInputStream()));
                   BufferedWriterbw = new BufferedWriter(new FileWriter("a.txt"));
                  
                   //一次讀取一行數據
                   Stringline;
                   while((line=br.readLine())!=null) {
                            //line就是已經讀取到的數據,我們現在需要將line這個數據寫入文件
                            bw.write(line);
                            bw.newLine();
                            bw.flush();
                   }
                  
                   sk.close();
                   bw.close();
                   br.close();
                  
         }
 
}
2.6  
需求:客戶端讀取文本文件中的內容發送給服務端,服務端將內容控制檯輸出                   packagecom.edu_09;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
 
/**
 *2.6      
         需求:客戶端讀取文本文件中的內容發送給服務端,服務端將內容控制檯輸出
 *     客戶端:
 *     1.讀取文本文件,一次讀取一行
 *  2.將讀取到的內容寫入通道,一次寫一行
 *  3.釋放資源
 *     服務器端:    
 *  1.從通道中讀取數據,一次讀取一行
 *  2.輸出
 */
public class TcpClient {
         publicstatic void main(String[] args) throws Exception {
                   //創建socket對象
                   Socketsk = new Socket("192.168.20.254", 2000);
                   BufferedWriterbw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
                  
                   //讀取文本一次讀取一行
                   BufferedReaderbr = new BufferedReader(new FileReader("a.txt"));
                   Stringline;
                   while((line=br.readLine())!=null) {
                            //line就是我讀取到的數據,我需要將這個數據寫入通道,一次寫一行
                            bw.write(line);
                            bw.newLine();
                            bw.flush();
                   }
                  
                   //釋放資源
                   br.close();
                   bw.close();
                   sk.close();
                  
         }
 
}
 
package com.edu_09;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
 
public class TcpServer {
         publicstatic void main(String[] args) throws Exception {
                   //創建服務器端的socket對象
                   ServerSocketss = new ServerSocket(2000);
                  
                   //蔣婷來自於客戶端的連接
                   Socketsk = ss.accept();
                  
                   //創建BufferedReader一次讀取一行數據
                   BufferedReaderbr = new BufferedReader(new InputStreamReader(sk.getInputStream()));
                   Stringline;
                   while((line=br.readLine())!=null) {
                            System.out.println(line);
                   }
                  
                   //釋放資源
                   br.close();
                   sk.close();
                  
         }
 
}       
 
2.7            
 * 需求: 上傳文本文件
 *
 *             客戶端:
 *                      a: 讀取文本文件中的數據
 *                      b: 發送到服務器端
 *
 *             服務器:
 *                      a: 讀取流通道中的數據
 *                      b: 把數據寫入到文本文件中
 
2.9
提問:我們以後倒是使用udp協議還是tcp協議呢?
在咱們以後使用的軟件當中基本都是udp和tcp混用的
 
 
 
 
 
 
 
 
 
MySql數據庫:
-- 寫sql語句,發送給服務端執行
-- 在後面可以寫註釋
-- 創建庫,day16
CREATE DATABASEday16 DEFAULT CHARACTER SET utf8;
-- 使用day16這個數據庫
USE day16;
-- 查詢day16這個庫中的所有的表
SHOW TABLES;
-- 需求:創建學生表(id,name,age)
CREATE TABLEstudent(
-- 字段名稱字段類型
id INT,
NAME VARCHAR(20),
age INT
);
 
-- 查詢表中的數據
SELECT * FROMstudent;
 
-- 查詢一個表結構
DESC student;
 
-- 刪除student表
DROP TABLEstudent;
 
-- 添加一個地址字段(gender varchar(2))
ALTER TABLEstudent ADD COLUMN gender VARCHAR(2);
 
-- 修改gender字段類型爲varchar(3)
ALTER TABLEstudent MODIFY COLUMN gender VARCHAR(3);
 
-- 將gender字段修改爲sex字段 varchar(2)
ALTER TABLEstudent CHANGE COLUMN gender sex VARCHAR(2);
 
-- 添加一個地址字段
ALTER TABLEstudent ADD COLUMN address VARCHAR(20);
 
-- 刪除sex和address字段
ALTER TABLEstudent DROP COLUMN sex,DROP COLUMN address;
 
-- 將student這個表的表名改爲stu
ALTER TABLE stuRENAME TO student;
 
-- 查看錶的數據
-- select 字段名稱(如果查詢所有字段*) from student;
 
-- 查看錶數據
SELECT * FROMstudent;
 
-- 給表中插入3條數據(插入所有字段)
INSERT INTOstudent VALUES(1,'劉德華',50,'中國香港');
INSERT INTOstudent VALUES(2,'陳奕迅',40,'中國香港');
INSERT INTOstudent VALUES(3,'韓紅',50,'河北');
 
-- 當需要插入所有字段的時候我們可以直插入部分字段嗎?插入不了
INSERT INTOstudent VALUES(1,'成龍',60,'中國香港');
 
-- 指向給表中只想插入id字段和name字段,請問怎麼辦?
INSERT INTOstudent(id,NAME) VALUES(4,'郭德綱');
 
-- 將所有學生的年齡改爲50歲,修改所有學生的年齡,用的非常少
UPDATE student SETage=50;
 
-- 將id爲3的學生姓名改爲房祖名
UPDATE student SETNAME='房祖名' WHERE id=3;
 
-- 修改多個字段,修改id爲2的學生姓名爲張學友,年齡改爲60
UPDATE student SETNAME='張學友',age=60 WHERE id=2;
 
-- 刪除全表數據,本質上是一條一條進行刪除的,效率比較慢
DELETE FROMstudent;
 
-- 刪除id爲3的數據
DELETE FROMstudent WHERE id=3;
 
-- 使用truncate table 表名,刪除全表數據,並不是一條條刪,而是直接將全表數據刪除,效率比較快
TRUNCATE TABLEstudent;
 
-- delete from和truncate table 這兩種刪除全表的方式有什麼區別呢?
-- 1.delete from一條條刪除,truncate table直接將全表數據幹掉
-- 2.delete from可以按條件刪除一條數據,truncate table只能刪除全表數據,不能按照條件刪除
-- 3.delete from無法重置自增長主鍵,truncate table可以重置自增長主鍵
 
-- 查詢數據
-- 查詢所有列
SELECT * FROMstudent;
 
-- 查詢指定字段,查詢id,name
SELECT id,NAMEFROM student;
 
-- 查詢時指定別名,name--姓名,address--住址
SELECT NAME AS '姓名',address AS '住址' FROM student;
 
-- 上面指定別名的as是可以省略的
SELECT NAME '姓名' FROM student;
 
-- 添加servlet,jsp字段
ALTER TABLEstudent ADD COLUMN servlet INT,ADD COLUMN jsp INT;
 
-- 給每條學生數據添加上servlet和jsp的成績
UPDATE student SETservlet=50,jsp=60 WHERE id=1;
UPDATE student SETservlet=60,jsp=70 WHERE id=2;
UPDATE student SETservlet=70,jsp=80 WHERE id=3;
 
-- 合併servlet和jsp這兩個列進行查詢,查詢每個學生的servlet和jsp的成績總和
-- 合併列查詢有一個特點:只能合併數值類型的字段
SELECT NAME '姓名',(servlet+jsp) '總成績' FROM student;
 
 
-- 查詢時添加常量列,給student表添加一個常量列  班級--java001
SELECT NAME '姓名',address '地址','java001' AS '班級' FROM student;
 
 
-- 查詢你們班的學生都來自於哪裏
SELECT NAME '姓名',address '地址' FROM student;
 
-- 去除重複值來查詢每一個學生來自於哪裏
SELECT DISTINCTaddress FROM student;
-- 去除重複值的另一種寫法
SELECTDISTINCT(address) FROM student;
 
 
-- 查詢id爲1並且,並且servlet成績等於50的學生(交集 and)
SELECT * FROMstudent WHERE id=1 AND servlet=50;
 
-- 查詢id爲1或者來自中國香港的學生(並集 or)
SELECT * FROMstudent WHERE id=1 OR address='中國香港';
 
 
-- 查詢servlet成績大於60分的學生
SELECT * FROMstudent WHERE servlet>60;
 
-- 查詢jsp成績小於等於70的學生
SELECT * FROMstudent WHERE jsp<=70;
-- 另一種寫法
SELECT * FROMstudent WHERE jsp<70 OR jsp=70;
 
-- 查詢jsp的成績大於等於70並且小於等於80的學生
SELECT * FROMstudent WHERE jsp<=80 AND jsp>=70;
-- 上面寫法的另一種語法,between...and...包前也包後
SELECT * FROMstudent WHERE jsp BETWEEN 70 AND 80;
 
 
-- 查詢學生年齡不等於30歲的學生
SELECT * FROMstudent WHERE age<>30;
 
-- 給student表中添加一個數據
INSERT INTOstudent VALUES(4,'郭德綱',NULL,'',80,90);
 
-- 查詢age字段爲null的學生(IS NULL)
SELECT * FROMstudent WHERE age IS NULL;
 
-- 查詢address字段爲空字符串的學生(='')
SELECT * FROMstudent WHERE address='';
 
-- 查詢age字段不爲null的學生(is not null)
SELECT  * FROM student WHERE age IS NOT NULL;
 
-- 查詢address字段不爲''的學生(<>'')
SELECT * FROMstudent WHERE address<>'';
 
 
-- 模糊查詢(like),like後面跟的是符號
-- %任意多個字符
-- _一個字符
 
-- 查詢姓劉的學生(like '劉%')
SELECT * FROMstudent WHERE NAME LIKE '劉%';
-- 查詢姓名中含有劉這個字的學生
SELECT * FROMstudent WHERE NAME LIKE '%劉%';
-- 查詢姓劉,且姓名有3個字的學生
SELECT * FROMstudent WHERE NAME LIKE '劉__';
 
 
-- 聚合函數
-- 查詢servlet的總成績(sum -- 求和函數)
SELECTSUM(servlet) FROM student;
 
-- 查詢每個學生的servlet平均分(avg,平均函數)
SELECTAVG(servlet) FROM student;
 
-- 查詢學生的servlet的最高成績(max ,最大值函數)
SELECTMAX(servlet) FROM student;
 
-- 查詢所有學生的servlet的最低成績(min,求取最小值函數)
SELECTMIN(servlet) FROM student;
 
-- 求取這張學生表中有多少條數據(count(*))
-- 效率比較低
SELECT COUNT(*)FROM student;
 
-- 根據某一個字段求取學生表中的數據條數,當一個字段數值爲null的時候,是不予計算的
-- 但是這種方式求取得統計值的時候效率會更高,但是有時候數據不夠準確
SELECT COUNT(age)FROM student;
 
 
-- 求取本班中香港和河北的學生分別有多少人
-- 1.給學生使用address這個字段進行分組(group by) 2.求取每一組中的學生人數
-- address  count
-- 香港      2
-- 河北      1
SELECTaddress,COUNT(*) FROM student GROUP BY address;
 
 
-- 查詢人數大於1的地域(group by 分組字段 having 篩選條件) 
SELECTaddress,COUNT(*) FROM student GROUP BY address HAVING COUNT(*)>1;
 
 
-- 分頁查詢 limit 起始行數,查詢的條數   注意:起始行數從0開始
-- 假設我的表中有20條數據,分爲4也顯示
-- 第一頁:limit 0,5
-- 第二頁:limit 5,5
-- 第三頁:limit 10,5
-- 第四頁:limit 15,5
-- 結論:查詢某一頁要現實的數據的時候可以利用如下公式 limit (當前頁數-1)*每頁顯示的條數,每頁現實的條數
 
-- student表中目前有4條數據,分爲2頁顯示,每頁顯示2條
-- 查詢第一頁的顯示數據:
SELECT * FROMstudent LIMIT 0,2;
-- 查詢第二頁現實的數據
SELECT * FROMstudent LIMIT 2,2;
 
-- 按照id字段的升序進行排序
-- asc,升序,數字從小到大,字母a-z
-- desc,降序,數字從大到小,字母z-a
SELECT * FROMstudent ORDER BY id DESC;
 
-- 按照servlet的成績的降序進行排序
SELECT * FROMstudent ORDER BY servlet DESC;
 
-- 當有多個排序條件的時候,先按照第一個條件排序,如果第一個條件相同則按照第二個條件進行排序
-- 先按照學生的年齡升序進行排序,年齡相同按照學生的servelt成績的升序進行排序
SELECT * FROMstudent ORDER BY age ASC,servlet ASC;
 
 
DESC student;
 
SELECT * FROMstudent;
--------------------------------------------------------------------
-- 數據約束:給表添加一些數據約束從而可以達到約束用戶操作數據的效果
-- 1:默認值約束(default)
-- :當給這個字段沒有添加值的時候,會給一個默認值,如果給默認值約束的字段添加的值爲null的時候,那麼他的字段值就爲null
-- 創建一個stu表
CREATE TABLE stu(
id INT,
NAME VARCHAR(20),
-- 給性別gender這個字段添加一個默認值約束
gender VARCHAR(2)DEFAULT '男'
);
-- 給stu表中添加幾個數據
INSERT INTO stuVALUES(1,'張三','男');
INSERT INTOstu(id,NAME) VALUES(2,'李四');
 
-- 給stu表中插入數據,性別爲null
INSERT INTO stuVALUES(3,'劉詩詩',NULL);
 
 
-- 2.非空約束(not null),插入的字段不爲null,而且必須插入數據
CREATE TABLE stu(
-- 給stu表中的id字段添加一個非空約束
id INT NOT NULL,
NAME VARCHAR(20),
gender VARCHAR(2)
);
-- 給這張表中添加一個元素,不插入id字段的值
INSERT INTOstu(NAME,gender) VALUES('郭德綱','男');
-- 給這張表添加一條數據,id字段的值直接給成null,這樣的話是插入不進去的。。
 
-- 唯一約束(unique)
-- 給stu表添加一個唯一約束
CREATE TABLE stu(
-- 給stu表中的id字段添加唯一約束
id INT UNIQUE,
NAME VARCHAR(20),
gender VARCHAR(2)
);
-- 給表中插入兩條id相同的數據
INSERT INTO stuVALUES(1,'劉德華','男');
INSERT INTO stuVALUES(1,'張學友','男');-- Duplicate entry '1' for key 'id',無法插入重複的id值
 
 
-- 給表中插入一條id爲null的數據,當給id添加了唯一約束之後,依然可以給他插入多條null值,不會出現重複
INSERT INTO stuVALUES(NULL,'吳奇隆','男');
INSERT INTO stuVALUES(NULL,'劉詩詩','女');
 
 
 
-- 經過我們的分析,我們認定我們的這個id字段(唯一+非空)--主鍵(primary key)
-- 注意:
-- 1.一般來說我們需要給每一張表都設定一個主鍵字段(非空+唯一),用來標示一條信息的唯一性
-- 2.我們一般不會將業務字段設定爲主鍵字段,比如name字段,一般我們會給每一張表添加一個id字段作爲主鍵字段
-- 3.建議給每張表添加一個主鍵字段,用來標示每一條數據的唯一性
CREATE TABLE stu(
-- 給stu表中的id字段設置爲主鍵(唯一+非空)
id INT PRIMARYKEY,
NAME VARCHAR(20),
gender VARCHAR(2)
);
-- 給表中插入兩條id爲1的學生信息
INSERT INTO stuVALUES(1,'華仔','男');
INSERT INTO stuVALUES(1,'華建','男');-- Duplicate entry '1' for key 'PRIMARY'
 
-- 給表中插入id爲null的元素
INSERT INTO stuVALUES(NULL,'杰倫','男');-- Column 'id' cannot be null
 
-- 上面的實驗我們可以得出結論,當我們給id字段設置了主鍵約束後,這個id字段就非空+唯一了
 
 
-- 自增長約束(auto_increment)
-- 給stu表中的id字段添加一個主鍵自增長約束
CREATE TABLE stu(
-- 給stu表中的id字段設置主鍵自增長約束,我們其實就將id這個字段交給了數據庫自己去維護,我們自己不需要去動他
id INT PRIMARY KEYAUTO_INCREMENT,
NAME VARCHAR(20),
gender VARCHAR(2)
);
-- 給stu表中添加兩條數據
INSERT INTOstu(NAME,gender) VALUES('華仔','男');
INSERT INTOstu(NAME,gender) VALUES('周杰倫','男');
INSERT INTOstu(NAME,gender) VALUES('周杰倫','男');
INSERT INTO stu(NAME,gender)VALUES('周杰倫','男');
 
-- 刪除id爲4的數據
DELETE FROM stuWHERE id=4;
-- 給表中添加一條數據
INSERT INTOstu(NAME,gender) VALUES('張學友','男');
-- delete from 這種刪除數據的方式,無法重置自增長的主鍵
 
-- 刪除stu的全表數據
DELETE FROM stu;
-- 添加一條數據
INSERT INTOstu(NAME,gender) VALUES('張學友','男');
 
-- 刪除全表數據的truncate table 表名,刪除全表數據,這種刪除全表數據的方式可以重置主鍵
TRUNCATE TABLEstu;
-- 給表中添加一條數據
INSERT INTOstu(NAME,gender) VALUES('華仔','男');


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章