首页 > 代码库 > 十八、十九天笔记总结
十八、十九天笔记总结
一:网络编程三要素+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(‘华仔‘,‘男‘);
十八、十九天笔记总结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。