JavaScript

JavaScript

JS的使用方式

script的type属性可以不写,如果要写的话使用type=“text/javascript”
①JS内部书写
	<script>
		//单行注释
		/*多行注释*/
		
		//在js常见的函数
		//向浏览器打印内容,类似于Java中的控制台输出语句
		document.write("hello,JavaScript我来了!") ;
		
		//还可以在浏览器中控制台中打印内容
		console.log("hello,JavaScript我来了") ;
		
		//在浏览中弹出一个提示框  
		//window对象是浏览器中顶级对象,可以省略不写!
		//window.alert("helloworld") ;
		//简写为:
		alert("helloworld") ;
	</script>
②外部方式 实际开发中(前端开发人员开发使用的!)
	需要在js文件夹中单独创建一个后缀为.js的文件
	书写js代码,在当前html页面中将js文件导入即可!
	导入js文件:<script src="js/01.js"></script>

javascript中的变量以及数据类型

①定义变量注意事项
注意:Js是弱类型,语法结构不严谨
			true,false在运算的时候都自己默认值 true是1,false是0
			实际开发中,不会这样去做的,boolean类型值都是直接进行逻辑判断!
	1)在js中定义变量,使用var来定义,var可以省略不写(刚开始,建议写上)
	2)javascript是弱类型语言,它的语法结构不严谨! 可以重复定义变量的,后面的变量的值将前面的变量值覆盖掉
	3)查看js的变量的数据类型,使用一个函数 typeof(变量名)
	4)var可以任意数据类型!
②js的基本数据类型
	1)无论是整数还是小数,都是number类型,js引擎会自动提升为 Number 对象类型
	2) 无论是字符串还是字符,都是string类型,js引擎会自动提升为 String 对象类型
	3)boolean类型,js引擎会自动提升为 Boolean 对象类型
	4)object类型(创建一个对象),js引擎会自动提升为Object对象类型在Js中,Object对象代表所有js对象的模板!
	5)undefined类型 :未定义类型 (这种没有意义),因为没有赋值!

Js的运算符

①算术运算符
	+
	-
	*
	/
		注意:/java中是默认取整,js是不会的
	%
	++
	--
②赋值运算符
	=:基本赋值
	+=
	-=
	*=
	/=
	%=
③比较(关系运算符)
	<
	<=
	>
	>=
	==
	!=
④逻辑运算符
	逻辑双与&&
	逻辑双或||
	逻辑双与&&:有false,则false
	逻辑双或||:有true,则true		
	逻辑双与&&和逻辑双或||和Java的&&和||一样
	&&:左边的表达式为false,则右边不执行了,具有短路效果
	||:左边的表达式为true,则右边不执行了,具有短路效果
	实际开发:这种&&,|| 效率非常高!
⑤三元(三目)运算符
	(表达式)?执行true的结果:false的结果

Js中的流程控制语句

①顺序结构:js代码从上而下依次加载
	js代码从上而下依次加载
②选择结构
	1)if结构
		if(表达式){
			语句
		}
					
		if(表达式){
							
        }else{
						
		}
					
		if(表达式1){
			语句1;	
        }else if(表达式2){
			语句2 ;
			...
			...
		}else{
			语句n;
		}
		if格式:针对两种情况进行判断
		实际开发中,if里面一个表达式---true或者false
		因为js是弱类型语言,
		1)如果if里面是一个非0的整数,条件是成立的;
		2)如果是非空字符串,条件成立;
		3)如果是非null的对象,条件成立的;
					
	2)switch结构
				
		switch(表达式){
			case 可以变量/也可以常量:
			语句1;
			break ;
			...
			...
			default:
			语句n;
			break ;
		}
	注意:
	switch语句的结束条件:
					1)遇见break结束
					2)程序默认执行到末尾
	case语句后面没有break,会造成"case穿透现象!"
	case后面跟Java语言的case语句不一样的地方就是这个case后面可以是变量!而Java中只能是常量!
③循环结构
	1)for(使用居多)
	语法:for(初始化语句;条件表达式;控制体语句){
				 循环体语句;
			 }
	2)while(其次while)
	语法:while(条件表达式){
				循环体语句;
				
				控制体语句;
			}
	3)do-while
	语法:do{
				循环体语句;
				控制体语句;
			}while(条件表达式) ;
	注意:和for,while区别,循环体至少执行一次!
④for-in语句
	for-in类似于增强for循环
		应用场景:
			1)遍历数组
			2)遍历对象的属性
		for-in语句的格式
			for(var 变量名 in 数组或者对象名称){
				使用变量名;
			}

数组

在js如何 创建一个数组
	方式1:  var 数组对象 = new Array() ;  //不指定长度
	方式2:  var 数组对象 = new Array(长度) ;//指定长度
	方式3:  arrayObj = new Array([element0[, element1[, ...[, elementN]]]])
	   	   简写格式:var 数组对象名称=  [元素1,元素2,元素3,.....] ;
	在js中,数组可以存储任何类型元素,实际开发中,还是遵循数据类型一致!

Js中的函数定义以及调用

①定义函数的格式
	格式1.形式参数列表
		function 函数名称(参数名称1,参数名称2....){
			函数的里面业务逻辑
			直接在这输出document.write("xxx") ;
		}
		格式1调用:
			单独调用
			函数名称(实际参数列表) ;
	格式2:(推荐)
		function 函数名称(参数名称1,参数名称2....){
							
							函数的里面的业务逻辑
							return 结果;
						}
		格式2调用:
			赋值调用
			var 最终结果变量 = 函数名称(实际参数列表) ;	

②定义函数的注意事项
	1)js是弱类型语言,定义函数的时候,参数名称不能携带var
	2)js定义时候,没有返回值类型,但是函数中可以携带return语句,代表方法结束!
	3)Js中没有函数重载的概念,如果方法名相同,后面定义的函数将前面定义的函数覆盖了	
	4)实际参数列表 < 形式参数列表,函数依然会被调用,不过值是"NaN",有一个形式参数没有赋值
	  实际参数列表 > 形式参数列表,将实际参数的值赋值给形式参数,多余的实际参数,直接省略不计!
	5)隐藏一个数组名称:arguments,作用:将实际参数绑定给形式参数

Js内置对象Date

①Js内置对象
	Date日期,String字符串,Array数组,正则表达式对象..
	浏览器在解析javascript的时候,能够识别这个对象,使用里面的方法!
②日期对象的基本使用
	日期对象的基本使用 :dateObj = new Date()
	创建一个日期对象
	var date = new Date() ;
	输出
	document.write(date) ;
	Mon May 09 2022 16:40:31 GMT+0800 (中国标准时间)  原生Date格式
	获取年份
		getYear() :当前的年份与 1900 年之间的差距
		改用getFullYear()
		var year = date.getYear() ;
		var year = date.getFullYear() ;
		document.write(year+"年") ;
	获取月份
		getMonth() :返回一个处于 0 到 11 之间的整数
		var month = date.getMonth()+1 ;
		document.write(month+"月") ;
	月中的日期
		getDate(): 1 到 31 之间的整数
		var monthWithDate = date.getDate() ;
		document.write(monthWithDate+"日&nbsp;&nbsp;") ;
	getHours() 获取小时值
		document.write(date.getHours()+":") ;
	getMinutes():获取分钟值
		document.write(date.getMinutes()+":") ;
	getSeconds() :获取秒值
		document.write(date.getSeconds()) ;

Js内置对象String

在Js中如何创建字符串对象
				var 对象名 = new String("字符串") ;
var s1 = new String("hello") ;
			var s2 = new String("hello") ;
				
			document.write((s1==s2)+"<br/>") ; //比较是两个对象的地址值是否相同,false
				
js中的valueof()比较的是两个js对象的原始值是否相同
			document.write((s1.valueOf() == s2.valueOf())+"<br/>") ;
			document.write("<hr/>") ;
Js中创建对象String,简写格式就直接 字符串常量赋值给变量
			var s3 = "helloworld" ;
			var s4 = "helloworld" ;
		    document.write((s3==s4)+"<br/>") ;
			document.write("<hr/>") ;
js中常用的方法
			charAt(index):获取指定索引处的字符
			concat(str) :字符串拼接功能
			substring(beginIndex,endIndex):截取,从指定位置开始截取到指定位置接收(不包含endIndex,而是endIndex-1)
			fontcolor 方法:给字符串颜色标记 ("参数英文单词或者#xxxxxx")
			substring(start, end):截取功能 跟Java中的String一样
			split 方法:拆分,分割,获取到的字符串数组
			遍历 for-in语句
			  for(var i in strArray){
				  document.write(strArray[i]+"&nbsp;");
			  }

Js的自定义对象

使用js这种方式如何定义Person对象 ,还需要使用Js创建Person对象;
四种方式
	1)类似于Java中有参构造
			定义对象的格式 跟定义函数格式一样
			function 对象(属性名称1,属性名称2,属性名称3....){
				追加它的成员属性
				this.成员属性1 = 属性名称1 ;
				this.成员属性2 = 属性名称2 ;
				this.成员属性3 = 属性名称3 ; 
				追加功能
				this.方法名 = function(空参/带参){
				....
				}
			}
			创建对象
			var  对象名 =  new 对象(实际参数列表); 
			如://创建一个人对象
		   function Person(name,age,gender){
			   //追加它的成员属性
			   this.name  = name ;
			   this.age = age ;
			   this.gender = gender ;
			   
			   //追加功能
			   this.speakEnglish = function(name){
				   alert("会说"+name) ;
			   }
		   }
		   
		   //创建Person对象
		   var p = new Person("高圆圆",42,"女") ;
		   document.write("姓名是:"+p.name+",年龄是:"+p.age+",性别是:"+p.gender+"<br/>") ;
		   //调用功能
		   p.speakEnglish("英语") ;
		   
		   document.write("<hr/>") ;
	2)类似于Java中的无参构造
			1_定义对象的格式:function 对象(){}
		    2_创建对象 var 对象名 = new 对象() ;
		    3_追加属性和追加功能
		    对象名.属性名称 = "值"
		    对象名.方法名 = function(){}...
			ru:
			//定义对象
		   function Person2(){}
		   //创建Person2对象
		   var p2 = new Person2() ;
		   //追加属性和追加功能
		   p2.name = "文章" ;
		   p2.age = 35 ;
		   p2.gender = "男" ;
		   p2.playGame = function(gameName){
			   alert("会玩"+gameName) ;
			   
		   }
		   
		    document.write("姓名是:"+p2.name+",年龄是:"+p2.age+",性别是:"+p2.gender+"<br/>") ;
			p2.playGame("csgo") ;
		   document.write("<hr/>") ;
	3)使用Object对象(代表所有js对象)
			直接new 对象
		    追加属性和追加功能
	如:
 	//直接new 对象
		   var p3 = new Object() ;
		   //追加属性和追加功能
		   p3.name = "张佳宁" ;
		   p3.age = 31 ;
		   p3.gender = "女" ;
		   p3.speakEnglish = function(name){
		   			alert(p3.name+"会说"+name) ;
		   			   
		   }
		   document.write("姓名是:"+p3.name+",年龄是:"+p3.age+",性别是:"+p3.gender+"<br/>") ;
		   p3.speakEnglish("英语") ;
		   
		   document.write("<hr/>") ;
		   
	4)字面值的方式: "Json数据格式"
		    基本格式:{"key":value} 这种键值对
		如:
			var student = {
							"name":"高圆圆",
							"age" : 42,
							"gender":"女",
							"address":"鄠邑区",
							"playGame":function(gameName){
								document.write("会玩"+gameName+"<br/>") ;
					
		   };
		    复杂格式  
		    var 对象名 =   [{},{},{}...]  描述类似数组或者集合
		如:
			  //使用json对象.key获取value
		   document.write(student.name+"<br/>") ;
		   student.playGame("lol") ;

Js中DOM操作 (重点)

什么是DOM,核心思想 :获取元素对象(标签对象),改变标签对象属性
			举例:
					img src属性
					input type="text" value属性
					div/span常见的标签都有 innerHTML或者innerText属性
					....
					
					推荐的方式: (原生Js)
						使用document的方法来获取标签对象
								document.getElementById("id属性值") ;  推荐
								document.getElementsByClassName("所有的同名的class属性值") 



JavaEE中有一种技术:dom4j ---- dom for java
就是后期处理xml文件读取使用dom4j(基于面向对象编程思想)
			方式1:在标签中给定id属性值,必须唯一 (推荐)
				document.getElementById("id属性值") 获取标签对象
				var username = document.getElementById("username") ;
				
			方式2:docuement.getElementsByClassName("class属性值") ; 获取的标签对象列表
				var username = document.getElementsByClassName("cl_username")[0] ;
				
			方式3:docuement.getElementsByName("name属性值") ;//获取的标签对象列表
				var username = document.getElementsByName("name")[0] ;
				
			方式4:通过标签名称获取标签对象
				docuement.getElementsByTagName("同名的标签名称") ; //返回的标签对象列表
				var username = document.getElementsByTagName("input")[0] ;
				
				标签对象获取value属性:内容可以获取到
				alert(username.value) ;

Js的常见的事件

点击相关的 
单击事件 (重点)  onclick
补充:
跳转新的页面
	使用window窗口对象下面地址栏对象location (使用最多)
	location的href属性:重新载入一个新的地址
	location.href = "adv.html" ;
			
	使用window对象的open方法
	 window.open( 新的地址,打开方式) ;
	window.open("adv.html","_blank") ;//新建窗口打开页面
			
	展示确认对话框 confirm()方法
双击事件         ondbclick
焦点事件 (重点)
获取焦点      onfocus
失去焦点      onblur
选项卡发生变化的事件 (重点)        
select标签 下拉菜单      onchange     
				 option 下拉选项
鼠标经过事件 :onmouseover
鼠标移出事件:onmouseout
				 
页面载入事件 (重点)
Js事件编程三要素
	1)事件源 ----就是html标签  的单击,双击....
						
	
	2)编写事件监听器-- 就是编写一个函数	 function 函数名称(){}
			
	3)绑定事件监听器-- 就在事件源上加上onxxx属性="函数名称()"
 

Js正则表达式以及原生 Js的表单校验!(重点)

常用的语法---正则表达式是Js的内置对象---内置一个方法  var flag= test(用户输入的表单中的字符串内容)
			//正则表达式:js引擎是能够识别这些语法
			
			//1)数量词相关的语法
			//x:代表任意字符
			//x+: 表示X字符串出现一次或者多次
			//x*:表示X字符出现0次或者多次
			//x?:表示X字符出现0次或者1次
			
			//2)范围相关的语法
			//X{n}: 表示X字符恰好出现n次
			//X{n,}:表示X字符至少出现n次
			//X{n,m}:表示X字符至少出现n次,但是不超过m次
			
			//3)匹配字符相关的
			//X[a-z] :X字符可以是a-z中任何的一个小写字母字符
			//X[0-9] :x字符是一个数字字符
			//X[A-Za-z0-9_]:X字符可以是任意的大小字母均可或者数字或者_
			
			
			//正则表达式:有一个函数  test("接收用户输入的文本框的内容字符串")匹配是否成功
			
			//创建一个正则规则:var 正则对象名 = /书写正则语法/ ;    不完全匹配 (会出现安全漏洞!)
			//正则对象名.test(字符串),true,匹配成功,false,失败!
			
			/*
				在Java语言中和在javascript中,如果要完全匹配,必须加入边界匹配器
				
				^:以....开头
				$:以...结尾
				
				var 正则表达式对象 = /^ 正则语法 $/ ;
			*/
表单校验
	见如下代码:
	<html>
	<head>
		<meta charset="utf-8">
		<title>08_js的表单校验</title>
		<!-- 
			正则规则:
				用户名:4-14位的数字或者字母(不区分大小写)组成
				密码:6-10位的数字或者英文大小字母组成
				确认密码和密码一致
				邮箱:满足邮箱的格式
					数字或者字母@数字或者字母.com/.cm/.com.cn
						919081924@qq.com
								 @163.com
								 @Istone.com.cn
								 
								 
								 本身字符就是.  需要\. 转义
		 
		 -->
		
	</head>
	<body>
		<!-- 
			form表单一个事件:onsubmit:表单是否你能够提交成功!
			携带的值如果true,能够提交成功
			false,提交失败!
			
			
		 -->
		<form action="server.html" method="get" onsubmit=" return checkAll()"> 
			用户名:<input type="text" id="username"  placeholder="请输入用户名" onblur="checkUserName()" /><span id="userTip"></span><br/>&ensp;&ensp;码:<input type="password" id="pwd" placeholder="请输入密码" onblur="checkPwd()" /><span id="pwdTip"></span><br/>
			确认密码:<input type="password" id="repwd" placeholder="两次密码一致" onblur="checkRepwd()" /><span id="repwdTip"></span><br/>&ensp;&ensp;箱:<input type="text" id="email" placeholder="请输入邮箱" onblur="checkEmail()" /><span id="emailTip"></span><br/>
			<input type="submit" value="注册" />
		</form>
	</body>
	<script>
		//校验用户名
		function checkUserName(){
			//1)获取 用户名的内容  (id="username"的input标签对象同时获取内容)
			var username = document.getElementById("username").value ;
			//2)定义用户名的正则规则:用户名:4-14位的数字或者字母(不区分大小写)组成
			var reg = /^[A-Za-z0-9]{4,14}$/ ;
			//3)获取 id="userTip"的span标签对象
			var span = document.getElementById("userTip") ;
			//4)正则表达式校验用户名的内容 username
			if(reg.test(username)){
				//成立
				span.innerHTML = "√".fontcolor("green") ;
				return true ;
			}else{
				//不成立
				span.innerHTML = "×".fontcolor("red") ;
				return false ;
			}
			
		}
		
		//校验密码
		function checkPwd(){
			//1)获取密码输入框的内容 dom操作
			var pwd = document.getElementById("pwd").value;
			//2)密码正则:6-10位的数字或者英文大小字母组成
			var reg = /^[A-Za-z0-9]{6,10}$/
			//3)获取id="pwdTip"所在的span标签对象
			var span = document.getElementById("pwdTip") ;
			
			//4)正则校验
			if(reg.test(pwd)){
				//成立
				span.innerHTML = "密码格式满足".fontcolor("green") ;
				return true ;
			}else{
				//不成立
				span.innerHTML = "不符合格式".fontcolor("red") ;
				return false ;
			}
		}
		
		//校验确认密码
		function checkRepwd(){
			//1)获取密码框的内容
			var pwd = document.getElementById("pwd").value;
			//2)获取当前确认密码框的内容
			var repwd = document.getElementById("repwd").value ;
			//3)获取id="repwdTip" 所在的span标签对象
			var span = document.getElementById("repwdTip") ;
			//4)判断
			if(pwd == repwd){
				//成立
				span.innerHTML = "两次密码一致".fontcolor("green") ;
				return true ;
			}else{
				//不成立
				span.innerHTML = "两次密码不一致".fontcolor("red") ;
				return false ;
			}
		}
		
		//校验邮箱
		function checkEmail(){
			//1)获取邮箱的内容
			var email = document.getElementById("email").value ;
			//2) 邮箱的正则:数字或者字母@数字或者字母.com/.cn/.com.cn
			var reg  = /^[A-Za-z0-9]+@[A-Za-z0-9]+(\.[a-z]{2,3}){1,2}$/
			//3)获取id="emailTip"的span标签对象
			var span = document.getElementById("emailTip") ;
			//4)校验
			if(reg.test(email)){
				//成立
				span.innerHTML="邮箱格式正确".fontcolor("green") ;
				return true ;
			}else{
				//不成立
				span.innerHTML="不满足格式,重新输入".fontcolor("red") ;
				return false ;
			}
		}
		
		
		
		//将所有的表单项的都满足条件,才能提交
		
		function checkAll(){
			if(checkUserName() && checkPwd() && checkRepwd() && checkEmail()){
				return true ;
			}else{
				return false ;
			}
		}
	</script>
</html>

数据库

就是存储数据库的仓库


之前怎么存储数据?
	1)定义变量,类似局部变量,随着方法调用而结束;
	2)容器存储:
			数组--->查询快,增删慢
			集合--->单列集合Collection/双列集合Map
					长度可变,
							List<Student>
			字符串缓冲区:StringBuffer/StringBuilder  
						最终可能需要将字符串缓冲区类型---String
						
   3)IO流
   		Input
   		Output  
   			可以将内容存储磁盘上 文件中 (读写复制---很耗时)
	
   4)数据库来存储数据
   		  执行效率高
   		  底层有树结构在里面
   		  数据库支持 "事务",来解决 业务中存在问题  "转账操作"!
   		  即使关机了,数据永久保存!
   		  		

数据库的分类

关系型数据库:
		书写sql语句  (Structure Query Language:结构化查询语言)
		oracle  :收费  大型公司企业居多(西安银行,汇丰,神州数码...)
					买数据库,买oracle第三方服务...
		
mysql   :免费  中小型公司使用居多
		sqlserver:跟.net平台兼容性比较好一些
		sqllite: 轻量级的关系数据库,嵌入式里面居多
		mariaDB:跟mysql同级别的
		
非关系型数据库:NoSQL数据库

		键值(Key-Value)存储数据库 : redis 做数据缓存------ 分布式系统架构 使用redis 分布式缓存
		文档类型数据库:
					MongoDb

mysql的基本语法

安装mysql之后
 1)方式登录 dos窗口登录
 2)方式登录 mysql自带的客户端登录
 
 
 C:\Users\Administrator>mysql -uroot -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.5.40 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

数据库的DDL语句(数据库的定义语句)之库的操作

-- :普通注释 当行注释
/* mysql的多行注释*/
#特殊注释
-- 查询当前mysql中自带的所有库有哪些
库在我们电脑磁盘上----> 文件夹
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |   mysql的默认配置库
| mysql              |user(管理员用户表) :root用户就在这个库中
| performance_schema |   mysql其他库(性能相关)
| test               |   测试库,但是不用它,自己创建新的库
+--------------------+
4 rows in set (0.00 sec)

-- 创建库
-- create database 库名;
mysql> create database myEE_2203 ;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myee_2203          |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)


-- create database if not exists 库名;
mysql> create database if not exists  ee2203;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ee2203             |
| myee_2203          |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)


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

-- 修改库的字符集
-- alter database 库名 default character set 字符集名称;
mysql> alter database myee_2203 default character set gbk;
Query OK, 1 row affected (0.00 sec)
mysql> show create database myee_2203;
+-----------+-------------------------------------------------------------------+
| Database  | Create Database                                                   |
+-----------+-------------------------------------------------------------------+
| myee_2203 | CREATE DATABASE `myee_2203` /*!40100 DEFAULT CHARACTER SET gbk */ |
+-----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

-- 删除库
-- drop database 库名 ;
mysql> drop database ee2203;
Query OK, 0 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myee_2203          |
| mysql              |
| performance_schema |
| test               |
+--------------------+

-- drop database if exists 库名 ; 如果存在这个库删除
mysql> drop database if exists myee_2203;
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

数据库DDL语句(数据库定义语句)之建表,修改表,查询表,删除表…

mysql常见的数据类型
     int :整数类型 默认最大长度11位字符,给int类型的数据的时候,当前存储的是值的真实长度
     	举例
     			年龄字段age  int类型
     			
     int(字符数):  整数类型, 	给int(3)这个值的时候,实际存储3位,但是赋值的时候不够3位  (使用很少)
     				id字段 1-----int(3) -------------------001
     				
     varchar(最大支持255个长度): 	字符串类型 
     		指定varchar(指定长度)
     date:仅仅是日期类型
     datetime:日期+时间类型 
     timestap:时间戳 (举例:管理员添加一个商品,商品上架的时间:当前系统瞬时时间 :2021-5-11 16:50分)
     double:小数类型 
     	double(几位数,小数点后保留的位数)
     	
     	举例:
     			double(4,2): 4位,小数点后保留2位
     clob:大字符类型  
     		支持 "大文本"
     blob:大字节类型
     		 最大支持4G
     					
-- 建表之前,必须使用哪个库
-- use 库名;
mysql> use ee_2203;
Database changed
mysql>
/*
  create table 表名(
  		字段名称1 字段类型1,
  		字段名称2 字段类型2,
  		...
  		...
  		字段名称n 字段类型n
  ) ;

*/
mysql> create table student(
    -> id int,
    -> name varchar(10),
    -> age int,
    -> gender varchar(2),
    -> address varchar(50),
    -> socre double(3,1)
    -> );
    Query OK, 0 rows affected (0.02 sec)
    
-- 查询当前库中有哪些表
-- show tables ;
mysql> show tables ;
+-------------------+
| Tables_in_ee_2203 |
+-------------------+
| student           |
+-------------------+
1 row in set (0.00 sec)

mysql>

-- 查看表的结构 
-- desc 表名;
mysql> desc student;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| name    | varchar(10) | YES  |     | NULL    |       |
| age     | int(11)     | YES  |     | NULL    |       |
| gender  | varchar(2)  | YES  |     | NULL    |       |
| address | varchar(50) | YES  |     | NULL    |       |
| socre   | double(3,1) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

-- 修改表的字段名称 
-- alter table 表名 change  旧字段名称 新的字段名称 以前的字段数据类型;

mysql> alter table student change gender sex varchar(2) ;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc student;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| name    | varchar(10) | YES  |     | NULL    |       |
| age     | int(11)     | YES  |     | NULL    |       |
| sex     | varchar(2)  | YES  |     | NULL    |       |
| address | varchar(50) | YES  |     | NULL    |       |
| socre   | double(3,1) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

-- 修改表的字段类型 modify
-- alter table 表名 modify 字段名称 新的字段类型 ;
mysql> alter table student modify address varchar(100) ;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | YES  |     | NULL    |       |
| name    | varchar(10)  | YES  |     | NULL    |       |
| age     | int(11)      | YES  |     | NULL    |       |
| sex     | varchar(2)   | YES  |     | NULL    |       |
| address | varchar(100) | YES  |     | NULL    |       |
| socre   | double(3,1)  | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

-- 修改表:给表中添加一个新的字段
-- alter table 表名 add 字段名称 字段类型;
mysql> alter table student add description varchar(200) ;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

-- 复制一张表
-- create table  新表名  like 旧表名;
mysql> create table teachear like student ;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+-------------------+
| Tables_in_ee_2203 |
+-------------------+
| student           |
| teachear          |
+-------------------+
2 rows in set (0.00 sec)

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

mysql> show tables;
+-------------------+
| Tables_in_ee_2203 |
+-------------------+
| student           |
+-------------------+
1 row in set (0.00 sec)

-- 删除列
-- ALTER TABLE 表明 DROP COLUMN 列名;

MySQL语法

DML数据:数据库操作语句 :操作表的记录

①插入数据
插入数据的语法1:
insert into 表名 values(值1,值2,值3,值4...值n); 插入全部数据
插入表的数据支持 :一次插入多条数据
insert into 表名 values(值1,值2,值3,值4...值n),(值1,值2,值3,值4...值n),(值1,值2,值3,值4...值n);
语法2:
插入部分字段,没有插入的字段,默认值就是null, 也支持一次性插入多条数据
insert into 表名(字段名称1,字段名称2....) values(值1,值2...) ;
注意事项:
1)插入的这些值必须要和表中的字段对应上; 先后顺序保证一致!
2)目前没有加入"数据库约束",可以插入非法数据,举例:id重复 ,
后期需要使用数据库约束来限定用户的操作表的行为!
②修改数据
一般实际开发中修改:都是带条件修改  (推荐)
语法1:update 表名 set 字段名称 = 值 where 条件 ;
例:需求:将name为张佳宁的学生id改为8
UPDATE student SET id = 8 WHERE NAME = '张佳宁' ;
语法2:一次性修改多个字段
update 表名 set 字段名称1 = 值 ,字段名称2 =值2.... where 条件;
例2:需求:将id为6的学生 的年龄改为25,性别改为女,地址改为上海
UPDATE student SET age = 25,gender ='女',address='上海市' WHERE id = 6 ;
语法3:不带条件 属于批量修改 (部分场景可以用的)
update 表名 set 字段名称= 值,字段名称2 =值2....
③删除数据
语法1:delete  from 表名 where 条件 ; 带条件删除记录 (使用的非业务字段id删除)
语法2:delete from 表名 :删除全表数据
语法3:truncate table 表名; 删除全表数据
--注意:
	delete from 表名 和 truncate table 表名 :两个区别?
    共同点:都是可以删除全表的记录的;
    不同点:
		delete from 表名 ; 仅仅只是将表的全部记录删除了,表还在!
		它针对id(非业务字段:设置主键并且自增长),它不影响自增长主键的这个值; (数据库约束后面讲)
		truncat table 表名; 将表所有数据删除,而且还会把删除之后,
		自动创建一个张一模一样的表,影响自增主键的值!
④自增
创建一个学生表,id 加入主键(非空且唯一)和自增长(不断的自增1)约束
CREATE TABLE student(
	id INT PRIMARY KEY AUTO_INCREMENT  -- id主键并且自增长
	);

DQL语句:(数据库查询语句)

①DQL语句最通用的语法:查询表的全部数据,基本条件查询 select 关键字
语法1:SELECT * FROM student ; (查询student表中所有数据)
语法2:SELECT 
	id,
	NAME,
	age,
	sex,
	address,
	math,
	english
FROM 
	student3;
* 代表所有字段,仅仅是自己玩的时候可以用,实际开发中不能用*,需要写上全部的字段名称
②as别名
-- 查询全部字段的时候,给字段起一个别名  as '别名名称' ,as省略
SELECT 
	id AS '编号',
	NAME AS '姓名',
	english AS '英语成绩' 
FROM
	student3 ;
-- as 可以省略,如下:
	SELECT 
  		id  '编号',
 		NAME  '姓名',
		english  '英语成绩' 
	FROM
 		student3 ;
③字段冗余(重复度大) 字段去重
DISTINCT 后面跟上字段名称  
SELECT  DISTINCT address FROM student3;
④where条件
比较运算符 <,<=,>,>=,!=,mysql中的不等于是<> 
逻辑运算符&& || mysql推荐使用 and , or
针对两个范围查询: 可以使用&&,可以使用and, 也可以 "字段名称 between 值1 and 值2"
or查询年龄是18岁或者是20或者是45岁的学生的所有信息语句可以简化为 in(值1,值2,值3..值n) ;in集合语句,如:
SELECT  
	*
FROM
	student3
WHERE 
	age IN(18,20,45) ;
-- Java语言中:去判断某个条件的内容为null ,mysql语言不支持这个格式 ==null
	需求:查询学生的英语成绩为null的学生所有信息
	mysql中判断某个字段为null,使用的语法是 is null 
	判断某个字段不为null,使用的语法是 is not null
-- 关于int类型字段求和的时候,注意: int类型的值 + null 的值 = null;
	mysql提供函数 ifnull(字段名称,值);  如果字段名称是null,给一个默认值,如:
	SELECT  
    	NAME '姓名',
    	(math+IFNULL(english,0)) '总分'
	FROM
    	student3 ;
⑤模糊查询 like
DQL语句之 where条件后面加入模糊查询 ---关键字 like
select 字段列表 from 表名 where 字段名称 like '%xxx%' ;
%:代表任何多个字符或者某个字符   (使用居多):网站门户系统---"搜索商品" ,模糊搜索
_:代表某个单个字符
⑥聚合函数查询:针对int类型:单行单列数据
select  聚合函数 from 表名 where 还可以指定条件;
count(字段名称):查询表中记录 ,字段名称使用都是id,非业务字段
avg(字段名称): 查询这个字段中平均值 
sum(字段列表):求和函数
max(字段名称):最大值
min(字段名称):最小值
-- select语句嵌套select语句 --- 子查询
	需求:查询出学生数学成绩大于 数学平均分的学生所有信息;
	使用where 条件 后面带上 比较运算符...,如下:
	SELECT 
		*
	FROM 
		student3
	WHERE 
		math >  (SELECT AVG(math) FROM student3) ;
⑦排序查询 oder by
select 字段列表 from 表名 order by 字段名称 排序规则(asc(默认值就是升序)或者desc 降序)
注意:
同时使用where条件和order by,order by在where的后面
多个字段要同时排序,首先第一个字段排序规则,然后才是第二个字段
⑧分组查询 group by
select 字段列表 from 表名  group by 分组字段名称;
注意事项:1)查询的字段列表中可以使用 分组字段
	    2)group by之后不能使用聚合函数
带条件分组查询的语法:  where 条件 必须放在group by 之前,否则语法错误!
select 字段列表包含分组字段,聚合函数.. from 表名 where 条件  group by 分组字段;如:
 SELECT
     sex '性别',
     AVG(math) '数学平局分'
 FROM
 
	student3
WHERE 
	math > 70    -- 先满足条件,然后才能分组;

GROUP BY 	
	sex   ;
⑨筛选查询 having
SELECT 字段列表 FROM 表名	WHERE 条件 GROUP BY 分组字段名称 HAVING 聚合函数;
where条件,group by,having  必须先有条件,分组,然后才筛选!
注意:筛选的后面可以使用聚合函数,group by的后面是不能使用聚合函数的
SELECT 
     sex  '性别',
     COUNT(id) '总人数',
     AVG(math) '数学平均分'
     
FROM
    student3	
WHERE 
	math > 70
GROUP BY 
	sex 
HAVING      -- 后面可以使用聚合函数
	COUNT(id) > 2 ;
	
-- 优化为
SELECT 
     sex  '性别',
     COUNT(id) 人数,
     AVG(math) '数学平均分'
     
FROM
    student3	
WHERE 
	math > 70
GROUP BY 
	sex 
HAVING      -- 后面可以使用聚合函数
	人数 > 2 ;
⑩分页查询 limit
select 字段列表 from 表名   limit 起始行数,每页显示的条数;
起始行数:从0开始算的,    
起始行数 = (当前页码-1)*每页显示的条数

3.数据库的备份和还原

①图形界面化
备份:
选中库名,右键----->BACKUP/Export 备份导出---->选中Sql脚本,存储到本地某个磁盘上----->StructureAndData:表的结构和数据都需要备份
还原:
先在SqlYog将myee_2203删除了,新建库右键---->Import 导入---->选中执行execute sql 脚本
②命令行
-- 数据库的备份和还原命令行的方式2
备份:
	以管理员身份进入dos,不需要登录mysql
			  保存到指定路径上
	mysqldump -uroot -p你的密码  库名 >  磁盘上的路径xx\xx\xx.sql
还原: 
	进入dos控制台,登录mysql
 	先将库删除,新建一个库
 	使用这个库 use库名;
  	加载指定路径的sql脚本
  	source 备份的sql脚本路径(D:\EE_2203\day9\code\mysql_01.sql)

4.数据库的约束

概念
限制用户操作数据库的一种行为(非法行为)
①默认约束 default
DEFAULT '默认值'    -- 加入默认约束
设置一个默认值,如果某个字段没有插入数据,那么默认约束会让它插入默认值
-- 通过sql语句将默认约束去掉
ALTER TABLE stu MODIFY gender VARCHAR(3) ;
INSERT INTO stu(id,NAME) VALUES(4,'赵又廷') ;

-- 通过sql语句给gender字段加上默认约束
ALTER TABLE stu MODIFY gender VARCHAR(3) DEFAULT '男' ;
DELETE FROM stu WHERE id = 4;
②非空约束 not null
当前这个字段值不能为null
-- 通过sql语句将非空约束去掉--修改表的类型
ALTER TABLE stu MODIFY address VARCHAR(50) ;
-- 通过sql语句将非空约束加上
ALTER TABLE stu MODIFY address VARCHAR(50) NOT NULL  ;
③唯一约束unique (属于一种index :索引)
设置字段必须是唯一的
-- 删除唯一约束的语法:atler table 表名 drop index  索引的字段名称(就当前类的字段名称一致的) ;
ALTER TABLE stu DROP INDEX phone_number ;
-- 通过sql语句添加唯一约束,此时语法就和修改表的字段类型的语法一致了
ALTER TABLE stu MODIFY phone_number VARCHAR(11) UNIQUE ;
④主键约束 primary key
primary key(非空且唯一的) 一般和auto_increment(自增长约束)使用多一些
-- 设置在id非业务字段上
如: id INT PRIMARY KEY AUTO_INCREMENT , 
通过sql将主键约束删除
-- alter table 表名 drop PRIMARY  KEY ;
通过sql语句将主键约束加入(唯一起作用)
--ALTER TABLE stu MODIFY id INT PRIMARY KEY  ;
⑤外键约束 foreign key
外键约束 foreign key ,主表和从表建立关联
	dept_id INT,  --主表id 
	CONSTRAINT  -- 声明 
	dept_emp_fk -- 外键名称  命名规则:主表名称_从表名称_fk
	FOREIGN KEY (dept_id)   -- 作用在这个dept_id字段上 
	REFERENCES dept(id)  -- 关联主表的主键id
加入外键约束:修改和删除是很麻烦,需要先修改或者删除从表数据,然后修改/删除主表数据
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值