day01-------------------------------------------------------------------------------------
<!--js的使用方式 -->
<!-- script的type属性可以不写,如果要写的话使用
type="text/javascript" -->
<!--
方式1:js的内部方式
-->
<!-- <script>
//单行注释
/*多行注释*/
//在js常见的函数
//向浏览器打印内容,类似于Java中的控制台输出语句
document.write("hello,JavaScript我来了!") ;
//还可以在浏览器中控制台中打印内容
console.log("hello,JavaScript我来了") ;
//在浏览中弹出一个提示框
//window对象是浏览器中顶级对象,可以省略不写!
//window.alert("helloworld") ;
//简写为:
alert("helloworld") ;
</script> -->
<!-- 方式2:外部方式 实际开发中(前端开发人员开发使用的!)
需要在js文件夹中单独创建一个后缀为.js的文件
书写js代码,在当前html页面中将js文件导入即可!
-->
<!-- 导入外部js文件
-->
---------------------------------------------------------------------------------------------------------------------------
<!-- 内部方式 -->
<script>
/**
* 定义变量的注意事项
* 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是弱类型,语法结构不严谨
true,false在运算的时候都自己默认值 true是1,false是0
实际开发中,不会这样去做的,boolean类型值都是直接进行逻辑判断!
算术运算符
+,-,*,/,%
++,--
赋值运算符
=:基本赋值
+=,-=,*=,/=,%=
比较(关系运算符)
<,<=,>,>=,==,!=
逻辑运算符
实际开发中:逻辑双与&&,逻辑双或||
三元(三目)运算符
(表达式)?执行true的结果:false的结果
-->
---------------------------------------------------------------------------------------------------------------------------
<!--
三大类
1)顺序结构:js代码从上而下依次加载
2)选择结构
if结构
if(表达式){
语句
}
if(表达式){
}else{
}
if(表达式1){
语句1;
}else if(表达式2){
语句2 ;
...
...
}else{
语句n;
}
switch结构
switch(表达式){
case 可以变量/也可以常量:
语句1;
break ;
...
...
default:
语句n;
break ;
}
3)循环结构
for(使用居多),while(其次while),do-while
-->
---------------------------------------------------------------------------------------------------------------------------
/*
定义函数的 格式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,作用:将实际参数绑定给形式参数
*/
//定义函数,两个数据求和
//格式1的写法
//function sum(var a, var b ){//不能带var
/* function sum( a, b ){
var c = a+b ;
document.write("c:"+c);
}
//调用
sum(10,20) ; */
//格式2的写法
/* function sum(a,b){
var c =a+b ;
return c;
} */
---------------------------------------------------------------------------------------------------------------------------
<!--
Js内置对象:Date日期,String字符串,Array数组,正则表达式对象..
浏览器在解析javascript的时候,能够识别这个对象,使用里面的方法!
-->
<script>
//日期对象的基本使用 :dateObj = new Date()
//创建一个日期对象
var date = new Date() ;
//输出
//document.write(date) ;//Mon May 09 2022 16:40:31 GMT+0800 (中国标准时间) 原生Date格式
//获取年份
//getYear() :当前的年份与 1900 年之间的差距
//改用getFullYear()
//获取月份
//getMonth() :返回一个处于 0 到 11 之间的整数
//月中的日期 getDate( ): 1 到 31 之间的整数
//getHours() 获取小时值
//getMinutes():获取分钟值
//getSeconds() :getSeconds()
---------------------------------------------------------------------------------------------------------------------------
<!-- span:行内标签,
任何标签都有这俩个innerText和innerHTML
这两个属性代表设置标签的文本内容
innerHTML可以加入html标签,可以被解析 (推荐)
innerText只是普通的文本内容,不能够解析html标签,如果加入html标签
就会原封不动的解析成普通文本!
-->
day02-------------------------------------------------------------------------------------
01_JS内置对象
在Js中如何创建字符串对象
// var 对象名 = new String("字符串") ;
var s1 = new String("hello") ;
// js中的valueof()比较的是两个js对象的原始值是否相同
document.write((s1.valueOf() == s2.valueOf())+"<br/>") ;
// Js中创建对象String,简写格式就直接 字符串常量赋值给变量
var s3 = "helloworld" ;
var s4 = "helloworld" ;
//常用的方法在js中
var str = "helloworldJavaEE" ;
//charAt(index):获取指定索引处的字符
document.write("charAt():"+str.charAt(4)+"<br/>") ;
//concat 方法(String):字符串拼接功能
document.write("concat():"+str.concat("高圆圆")+"<br/>") ;
//fontcolor 方法:给字符串颜色标记 ("参数英文单词或者#xxxxxx")
document.write("fontcolor():"+str.fontcolor("greenyellow")+"<br/>") ;
//substring(start, end):截取功能 跟Java中的String一样
document.write("substring():"+str.substring(5,10)+"<br/>") ;
//split 方法:拆分,分割,获取到的字符串数组
var str2 = "JavaEE-PhP-Go-R-C-C++" ;
var strArray = str2.split("-") ;
//遍历 for-in语句
for(var i in strArray){
document.write(strArray[i]+" ");
}
------------------------------------------------------------------------------------------------------------------------
02_JS自定义对象
//方式1:类似于Java中有参构造
/*
定义对象的格式 跟定义函数格式一样
function 对象(属性名称1,属性名称2,属性名称3....){
//追加它的成员属性
this.成员属性1 = 属性名称1 ;
this.成员属性2 = 属性名称2 ;
this.成员属性3 = 属性名称3 ;
//追加功能
this.方法名 = function(空参/带参){
....
}
}
创建对象
var 对象名 = new 对象(实际参数列表);
*/
//方式2:类似于Java中的无参构造
//1_定义对象的格式:function 对象(){}
//2_创建对象 var 对象名 = new 对象() ;
//3_追加属性和追加功能
//对象名.属性名称 = "值"
//对象名.方法名 = function(){}...
//方式3:使用Object对象(代表所有js对象)
//直接new 对象
var p3 = new Object() ;
//字面值的方式: "Json数据格式" (后期的重点)
//基本格式:{"key":value} 这种键值对
//需要描述一个学生---->姓名,年龄,性别,住址
// 复杂格式 :var 对象名 = [{},{},{}...]
//使用json对象.key获取value
------------------------------------------------------------------------------------------------------------------------
05_通过docuement方法获取标签对象
//方式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] ;
------------------------------------------------------------------------------------------------------------------------
06_Js中常见事件分类
分类:
点击相关的
单击事件 (重点) onclick
双击事件 ondbclick
焦点事件 (重点)
获取焦点 onfocus
失去焦点 onblur
选项卡发生变化的事件 (重点)
select标签 下拉菜单 onchange
option 下拉选项
鼠标经过事件 :onmouseover
鼠标移出事件:onmouseout
页面载入事件 (重点)
------------------------------------------------------------------------------------------------------------------------
07_js正则表达式语法
//正则表达式: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 正则表达式对象 = /^ 正则语法 $/ ;
*/
day03-------------------------------------------------------------------------------------
语法:
安装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常见的数据类型 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)
day04-------------------------------------------------------------------------------------
-- 查询这个库中有哪些表
SHOW TABLES ;
-- 创建一张新的表学生表,id,姓名,年龄,性别,住址
CREATE TABLE student(
id INT , -- 学号
NAME VARCHAR(10), -- 姓名
age INT, -- 年龄
gender VARCHAR(5), -- 性别
address VARCHAR(50) -- 住址
) ;
-- 查询学生的表的结构
DESC student ;
-- DML语句:数据库操作语句
-- 给学生表中插入数据
-- 插入数据的语法1:insert into 表名 values(值1,值2,值3,值4...值n); 插入全部数据
INSERT INTO student VALUES(1,'高圆圆',42,'女','西安市') ;
-- 插入表的数据支持 :一次插入多条数据
-- insert into 表名 values(值1,值2,值3,值4...值n),(值1,值2,值3,值4...值n),(值1,值2,值3,值4...值n);
INSERT INTO student VALUES(2,'文章',35,'男','咸阳市'),
(3,'马伊琍',40,'女','上海市'),(4,'马保国',56,'男','宝鸡市') ;
-- 语法2:插入部分字段,没有插入的字段,默认值就是null, 也支持一次性插入多条数据
-- insert into 表名(字段名称1,字段名称2....) values(值1,值2...) ;
INSERT INTO student(id,NAME,age,gender) VALUES(5,'王宝强',35,'男') ;
INSERT INTO student(id,NAME,age,gender) VALUES(6,'张三丰',60,'男'),(7,'令狐冲',38,'男') ;
/*
注意事项:
1)插入的这些值必须要和表中的字段对应上; 先后顺序保证一致!
2)目前没有加入"数据库约束",可以插入非法数据,举例:id重复 ,
后期需要使用数据库约束来限定用户的操作表的行为!
*/
-- 插入一个学生id为7的
INSERT INTO student VALUES(7,'张佳宁',32,'女','西安市') ;
-- DML语句之修改表记录
-- 一般实际开发中修改:都是带条件修改 (推荐)
-- update 表名 set 字段名称 = 值 where 条件 ;
-- 需求:将name为张佳宁的学生id改为8
UPDATE student SET id = 8 WHERE NAME = '张佳宁' ;
-- 需求: 修改id为6的学生的姓名为 '姚笛' (id字段在实际开发中:都是非业务字段,以后唯一的)
UPDATE student SET NAME = '姚笛' WHERE id = 6 ;
-- 语法2:一次性修改多个字段
-- update 表名 set 字段名称1 = 值 ,字段名称2 =值2.... where 条件;
-- 需求:将id为6的学生 的年龄改为25,性别改为女,地址改为上海
UPDATE student SET age = 25,gender ='女',address='上海市' WHERE id = 6 ;
-- 语法3:不带条件 属于批量修改 (部分场景可以用的)
-- update 表名 set 字段名称= 值,字段名称2 =值2....
UPDATE student SET address = '鄠邑区' ;
-- DML语句之删除表的记录
-- delete from 表名 where 条件 ; 带条件删除记录 (使用的非业务字段id删除)
-- 需求:删除id为7的学生信息
DELETE FROM student WHERE id = 7 ;
-- delete from 表名 :删除全表数据
DELETE FROM student ;
-- truncate table 表名; 删除全表数据
TRUNCATE TABLE student;
/*
面试题:
delete from 表名 和 truncate table 表名 :两个区别?
共同点:都是可以删除全表的记录的;
不同点:
delete from 表名 ; 仅仅只是将表的全部记录删除了,表还在!
它针对id(非业务字段:设置主键并且自增长),它不影响自增长主键的这个值; (数据库约束后面讲)
truncat table 表名; 将表所有数据删除,而且还会把删除之后,
自动创建一个张一模一样的表,影响自增主键的值!
*/
DROP TABLE student ;
SHOW TABLES ;
-- 创建一个学生表,id 加入主键(非空且唯一)和自增长(不断的自增1)约束
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT , -- id主键并且自增长
NAME VARCHAR(20),-- 姓名
age INT
);
-- 一次插入4条
INSERT INTO student(NAME,age) VALUES('高圆圆',42),('张佳宁',32),('文章',35),('王宝强',38) ;
-- 自增长的id可以自己给个值
INSERT INTO student VALUES(15,'高圆圆2',42);
INSERT INTO student(NAME,age) VALUES('姚笛',35) ;
-- DQL语句最通用的语法:查询表的全部数据
-- -- * 代表所有字段,仅仅是自己玩的时候可以用,实际开发中不能用*,需要写上全部的字段名称
SELECT * FROM student ;
CREATE TABLE student3 (
id INT, -- 编号
NAME VARCHAR(20), -- 姓名
age INT, -- 年龄
sex VARCHAR(5), -- 性别
address VARCHAR(100), -- 地址
math INT, -- 数学
english INT -- 英语
);
INSERT INTO student3(id,NAME,age,sex,address,math,english)
VALUES (1,'马云',55,'男',' 杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩 ',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港 ',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);
-- DQL语句 :数据库的查询语句 里面语法是最多的
-- 1)最基本的查询语句 select
-- 查询全表数据:select * from 表名;
SELECT * FROM student3 ;
-- 实际开发中查询全部字段,把字段名称全部写上
SELECT
id,
NAME,
age,
sex,
address,
math,
english
FROM
student3;
-- 查询全部字段的时候,给字段起一个别名 as '别名名称' ,as省略
SELECT
id AS '编号',
NAME AS '姓名',
age AS '年龄',
sex AS '性别',
address AS '地址',
math AS '数学成绩',
english AS '英语成绩'
FROM
student3 ;
-- as 可以省略的
SELECT
id '编号',
NAME '姓名',
age '年龄',
sex '性别',
address '地址',
math '数学成绩',
english '英语成绩'
FROM
student3 ;
-- 当表的名称比较长的时候,可以给表名起一个别名;
SELECT
s.`id` '学生编号',
s.`name` '学生姓名',
s.`age` '学生年龄',
s.`sex` '学生性别',
s.`address` '学生地址',
s.`math` '数学成绩',
s.`english` '英语成绩'
FROM
student3 s ;-- 起了一个别名s
-- 可以查询部分字段
-- 需求:查询学生的姓名以及数学和英语成绩
SELECT
NAME '姓名',
math '数学成绩',
english '英语成绩'
FROM
student3 ;
-- 需求:查询学生的地址信息
SELECT
address
FROM
student3;
-- 发现:字段冗余(重复度大) 字段去重 DISTINCT 后面跟上字段名称
SELECT DISTINCT address FROM student3;
-- 2)DQL语句之条件查询 where 关键字
-- 2.1)使用 赋值运算符=,比较运算符 <,<=,>=,>,!=, mysql中的不等于 <>
-- 2.2)Java中逻辑运算符:&&,|| mysql推荐使用 and , or
-- 2.2)针对两个范围查询: 可以使用&&,可以使用and, 也可以 "字段名称 between 值1 and 值2"
-- 需求:查询年龄大于20岁的学生所有信息
SELECT
*
FROM
student3
WHERE
age > 20 ;
-- 需求:查询年龄在20到30之间的学生的姓名,年龄,住址 ,数学和英语成绩信息
SELECT
NAME '姓名',
age '年龄',
address '住址',
math '数学成绩',
english '英语成绩'
FROM
student3
WHERE age >= 20 && age <= 30 ; -- && 逻辑双与
-- mysql中使用and 并列关系
SELECT
NAME '姓名',
age '年龄',
address '住址',
math '数学成绩',
english '英语成绩'
FROM
student3
WHERE age >= 20 AND age <= 30 ; -- and 连接
-- 使用的between 值1 and 值2
SELECT
NAME '姓名',
age '年龄',
address '住址',
math '数学成绩',
english '英语成绩'
FROM
student3
WHERE
age BETWEEN 20 AND 30 ;
-- 需求:查询年龄是20岁学生的所有信息
SELECT * FROM student3 WHERE age = 20 ;
-- 需求:查询年龄不是20岁的学生的所有信息
SELECT * FROM student3 WHERE age != 20 ; -- != Java中 的用法
SELECT * FROM student3 WHERE age <> 20 ;-- mysql中的不等于 <>
-- 需求:查询年龄是18岁或者是20或者是45岁的学生的所有信息
SELECT
*
FROM
student3
WHERE
age = 18 || age =20 || age = 45 ;-- Java中逻辑双或||
SELECT
*
FROM
student3
WHERE
age = 18 OR age =20 OR age = 45 ; -- Mysql中的or这个表示 或(并集)
-- 上面这个格式优化为 in(值1,值2,值3..值n) ;in集合语句
SELECT
*
FROM
student3
WHERE
age IN(18,20,45) ;
-- Java语言中:去判断某个条件的内容为null ,mysql语言不支持这个格式 ==null
-- 需求:查询学生的英语成绩为null的学生所有信息
-- select * from student3 where english == null ;
-- mysql中判断某个字段为null,使用的语法是 is null
-- 判断某个字段不为null,使用的语法是 is not null
SELECT * FROM student3 WHERE english IS NULL ;
-- 需求:查询学生的英语成绩不为null的学生的所有信息
SELECT * FROM student3 WHERE english IS NOT NULL ;
-- 关于int类型字段求和的时候,注意: int类型的值 + null 值 = null;
-- 查询学生的姓名以及英语和数学总分
SELECT
NAME '姓名',
(math+english) '总分'
FROM
student3 ;
-- 上面这种情况:不太友好,数学成绩有值,但是结果求和是null
-- mysql提供函数 ifnull(字段名称,值); 如果字段名称是null,给一个默认值
SELECT
NAME '姓名',
(math+IFNULL(english,0)) '总分'
FROM
student3 ;
SHOW VARIABLES LIKE '%character%' ;
-- 3)DQL语句之 where条件后面加入模糊查询 ---关键字 like
-- select 字段列表 from 表名 where 字段名称 like '%xxx%' ;
-- %:代表任何多个字符或者某个字符 (使用居多):网站门户系统---"搜索商品" ,模糊搜索
-- _:代表某个单个字符
-- 需求:查询所有姓马的学生信息
SELECT
*
FROM
student3
WHERE
NAME LIKE '%马%'
-- 查询学生姓名三个字符并且第二个字符是化的人
SELECT
*
FROM
student3
WHERE
NAME LIKE '_化_' ;
-- 查询姓名为三个字符的学生信息
SELECT
*
FROM
student3
WHERE
NAME LIKE '___' ;
-- 聚合函数查询 :针对int类型 :单行单列数据
-- select 聚合函数 from 表名 where 还可以指定条件;
-- count(字段名称):查询表中记录 ,字段名称使用都是id,非业务字段
-- avg(字段名称): 查询这个字段中平均值
-- sum(字段列表):求和函数
-- max(字段名称):最大值
-- min(字段名称):最小值
-- 需求:查询表的总记录数
-- select count(english) '总记录数' from student3; -- 前提条件使用业务字段查询,不能有null值
-- select count(ifnull(english,0)) '总记录数' from student3;
SELECT COUNT(id) '总条数' FROM student3 ;
-- 查询数学平均分 avg(字段名称)
SELECT AVG(math) '数学平均分' FROM student3;
-- 数学和英语成绩求和的学生信息(姓名,和总分)
SELECT
SUM(math+IFNULL(english,0)) '总分'
FROM
student3;
-- max()和min()
SELECT MAX(math) '数学最高分' FROM student3 ;
-- select语句嵌套select语句 --- 子查询
-- 需求:查询出学生数学成绩大于 数学平均分的学生所有信息;
-- 使用where 条件 后面带上 比较运算符...
-- Java中
-- int x =10,y ;
-- y = y+x ; 将10代入
-- 1)查询数学平均分是多少
SELECT AVG(math) FROM student3; -- 79.5000
-- 2)查询大于数学平均分的学生信息
SELECT
*
FROM
student3
WHERE
math > 79.5000;
-- 一步走
SELECT
*
FROM
student3
WHERE
math > (SELECT AVG(math) FROM student3) ;
-- 查询数学成绩最高分的学生的姓名,年龄,地址以及数学成绩;
-- 1)查询最高分是多少
SELECT MAX(math) FROM student3; -- 99
-- 2)查询最高分是这个成绩的学生信息
SELECT
NAME '姓名',
age '年龄',
address '地址',
math '数学成绩'
FROM
student3
WHERE
math = 99 ;
-- 一步走
SELECT
NAME '姓名',
age '年龄',
address '地址',
math '数学成绩'
FROM
student3
WHERE
math =
(SELECT MAX(math) FROM student3) ;
-- DQL之排序查询 order by
-- select 字段列表 from 表名 order by 字段名称 排序规则(asc(默认值就是升序)或者desc 降序)
UPDATE student3 SET english = 88 WHERE id = 5 ;
UPDATE student3 SET english = 94 WHERE id = 6 ;
-- 需求:按照数学成绩升序排序 单个字段
SELECT
*
FROM
student3
ORDER BY
math ASC ; -- 默认不写排序规则,就是asc 升序
-- 同时条件和order by,order by在where的后面
-- 需求:数学成绩大于56分的学生进行数学的降序排序
SELECT
NAME ,
math
FROM
student3
WHERE math > 56 -- 先满足条件,才能排序!where 必须order by之前
ORDER BY math DESC ;
-- 多个字段要同时排序,首先第一个字段排序规则,然后才是第二个字段
-- 需求:数学成绩降序,英语成绩升序排序
SELECT
*
FROM
student3
ORDER BY
math DESC , english ASC ;
SELECT * FROM student3 ;
day05-------------------------------------------------------------------------------------
-- 插入一条数据
INSERT INTO student3 VALUES(9,'高圆圆',42,'女','西安',87,90) ;
-- DQL语句之分组查询:group by
-- select 字段列表 from 表名 group by 分组字段名称;
-- 注意事项: 1)查询的字段列表中可以使用 分组字段
-- 2)group by之后不能使用聚合函数
-- 需求:按照性别分组,查询出他们的数学成绩的平均分
SELECT
sex '性别', -- 查询的分组字段
AVG(math) '数学平均分' -- 查询每一个组的数学平均分
FROM
student3
GROUP BY
sex ;
-- 带条件分组查询的语法: where 条件 必须放在group by 之前,否则语法错误!
-- select 字段列表包含分组字段,聚合函数.. from 表名 where 条件 group by 分组字段;
-- 需求:按照性别分组,查询出他们的数学成绩的平均分,数学成绩大于70分的参与分组
SELECT
sex '性别',
AVG(math) '数学平局分'
FROM
student3
WHERE
math > 70 -- 先满足条件,然后才能分组;
GROUP BY
sex ;
-- 筛选查询 having
-- where条件,group by,having 必须先有条件,分组,然后才筛选!
-- 注意:筛选的后面可以使用聚合函数,group by的后面是不能使用聚合函数的
-- 需求:按照性别分组,查询数学平局分,条件:数学成绩大于70的人参与分组, 筛选出人数大于2的这一组
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)*每页显示的条数
-- 前提条件:每页显示2条,
-- 第一页数据
SELECT * FROM student3 LIMIT 0,2;
-- 第二页数据
SELECT * FROM student3 LIMIT 2,2 ;
-- 第三页数据
SELECT * FROM student3 LIMIT 4,2 ;
-- 第四页数据
SELECT * FROM student3 LIMIT 6,2 ;
-- 第五页数据
SELECT * FROM student3 LIMIT 8,2;
-- 第六页数据
SELECT * FROM student3 LIMIT 10,2;
-- 第七页数据
SELECT * FROM student3 LIMIT 12,2;
-- 插入4条数据
INSERT INTO student3 VALUES
(10,'张佳宁',32,'女','咸阳市',97,100),
(11,'文章',22,'男','渭南市',90,88),
(12,'盲僧',20,'男','宝鸡市',87,96),
(13,'ez',18,'男','艾欧尼亚',67,77);
-- 数据库的备份和还原
-- 方式1:图形界面化工具
/*
备份:选中库名,右键----->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)
*/
CREATE DATABASE myee_2203;
SHOW TABLES ;
-- 查询所有的学生
SELECT * FROM student3;
-- 数据库的约束
-- 概念:限制用户操作数据库的一种行为(非法行为)
-- 直接插入null值或者某个非业务字段id一直在重复
-- 创建一张表stu表
CREATE TABLE stu(
id INT,
NAME VARCHAR(20),
gender VARCHAR(3) DEFAULT '男' -- 加入默认约束
);
INSERT INTO stu VALUES(1,'高圆圆','女'),(2,'文章','男') ;
INSERT INTO stu(id,NAME) VALUES(3,'王宝强') ;
-- 上面gender字段没有插入数据,默认就是null,空值(没有意义)
-- 1)默认约束 default :如果某个字段没有插入数据,那么默认约束起作用了
DROP TABLE stu ;
-- 通过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;
-- 2)非空约束 not null,当前这个字段值不能为null
CREATE TABLE stu(
id INT, -- 编号
NAME VARCHAR(20), -- 姓名
age INT, -- 年龄
address VARCHAR(50) NOT NULL-- 地址 ,加入非空约束
) ;
INSERT INTO stu VALUES(1,'高圆圆',42,'西安市'),(2,'赵又廷',45,'北京市') ;
-- 地址插入一个null值
INSERT INTO stu VALUES(3,'张佳宁',32,NULL) ; -- 这种直接插入null也属于非法行为
-- 当address字段设置not null约束,直接限定用户不能插入null值
-- Column 'address' cannot be null
-- insert into stu(id,name,age) values(3,'张佳宁',32) ; 'address' doesn't have a default value:地址没有默认值
-- 通过sql语句将非空约束去掉--修改表的类型
ALTER TABLE stu MODIFY address VARCHAR(50) ;
DELETE FROM stu WHERE id = 3;
-- 通过sql语句将非空约束加上
ALTER TABLE stu MODIFY address VARCHAR(50) NOT NULL ;
DROP TABLE stu ;
-- 3)唯一约束unique (属于一种index :索引)
CREATE TABLE stu(
id INT , -- 编号
NAME VARCHAR(20), -- 姓名
phone_number VARCHAR(11) UNIQUE -- 电话号码 必须设置唯一的
) ;
INSERT INTO stu VALUES(1,'高圆圆','13388886666'),(2,'张三','13255559999') ;
INSERT INTO stu VALUES(3,'张佳宁','13388886666') ;-- 重复值 Duplicate entry '13388886666' for key 'phone_number'
-- 通过sql语句将唯一约束删除
-- alter table stu modify phone_number varchar(11) ; -- 修改表的字段类型
-- 删除唯一约束的语法:atler table 表名 drop index 索引的字段名称(就当前类的字段名称一致的) ;
ALTER TABLE stu DROP INDEX phone_number ;
-- 删除id为3的数据
DELETE FROM stu WHERE id = 3 ;
-- 通过sql语句添加唯一约束,此时语法就和修改表的字段类型的语法一致了
ALTER TABLE stu MODIFY phone_number VARCHAR(11) UNIQUE ;
DROP TABLE stu ;
-- 4)主键约束 primary key(非空且唯一的) 一般和auto_increment(自增长约束)使用多一些
-- 设置在id非业务字段上
CREATE TABLE stu(
id INT PRIMARY KEY AUTO_INCREMENT , -- 编号 加入主键约束,加入自增长
NAME VARCHAR(20) -- 姓名
);
DROP TABLE stu ;
INSERT INTO stu VALUES(1,'高圆圆'),(2,'文章') ;
INSERT INTO stu VALUES(1,'赵又廷') ;-- Duplicate entry '1' for key 'PRIMARY' id是一个主键,值不能重复
INSERT INTO stu VALUES(NULL,'王宝强') ;-- Column 'id' cannot be null
-- 通过sql将主键约束删除
-- alter table 表名 drop PRIMARY KEY ;
ALTER TABLE stu DROP PRIMARY KEY;
DELETE FROM stu WHERE NAME = '赵又廷' ;
-- 通过sql语句将主键约束加入(唯一起作用)
ALTER TABLE stu MODIFY id INT PRIMARY KEY ;
-- 加入自增长约束之后,不需要给id赋值了,自己自增
INSERT INTO stu(NAME) VALUES('高圆圆'),('文章') ;
-- 自增长约束可以自己插入新的id,然后在之前id上继续自增
INSERT INTO stu VALUES(17,'赵又廷') ;
INSERT INTO stu(NAME) VALUES('张三') ;
-- mysql有一个函数:获取最后一次自增长主键的id值
SELECT LAST_INSERT_ID() ;
SELECT * FROM stu ;
-- 5)外键约束 foreign key
SHOW TABLES ;
DROP TABLE employee ;
-- 描述员工信息,创建一个表,员工编号,员工姓名,员工性别,员工所在部门
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
emp_name VARCHAR(10) , -- 员工姓名
emp_gender VARCHAR(5), -- 员工性别
emp_dept_name VARCHAR(10) -- 员工所在的部门名称
) ;
-- 插入员工表数据
INSERT INTO emp(emp_name,emp_gender,emp_dept_name)
VALUES('文章','男','开发部'),
('高圆圆','女','测试部'),
('王宝强','男','运维部'),
('姚笛','女','测试部'),
('赵又廷','男','开发部') ,
('马保国','男','运维部') ;
DROP TABLE emp;
-- 上面存在的问题:员工表中包含员工信息以及部门信息,这种情况不能在数据库中出现
-- 查询出来的数据部门信息存在冗余,重复性大,优化改进:一张表始终描述一件事情
-- 将员工表拆分出来:将部门信息放在部门表中
-- 创建一张部门表 dept表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增长约束 部门编号
dept_name VARCHAR(20) -- 部门名称
) ;
-- 插入三个部门
INSERT INTO dept(dept_name) VALUES('开发部'),('测试部'),('运维部') ;
-- 创建员工表
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
emp_name VARCHAR(10) , -- 员工姓名
emp_gender VARCHAR(5), -- 员工性别
dept_id INT -- 员工的部门id
) ;
INSERT INTO emp(emp_name,emp_gender,dept_id)
VALUES('文章','男',1),
('高圆圆','女',2),
('王宝强','男',3),
('姚笛','女',2),
('赵又廷','男',1) ,
('马保国','男',3) ;
-- 插入了一条员工数据
INSERT INTO emp(emp_name,emp_gender,dept_id) VALUES('张三丰','男',4) ;
-- 问题2:员工表中插入一条不存在的部门,两种表没有建立关系
-- 解决:外键约束 foreign key ,员工表dept_id 和部门表主键id进行关联
-- 外键所在的表----从表 (员工表)
-- 部门表: 主表
-- 员工表:从表
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
emp_name VARCHAR(10) , -- 员工姓名
emp_gender VARCHAR(5), -- 员工性别
dept_id INT, -- 员工的部门id
CONSTRAINT -- 声明
dept_emp_fk -- 外键名称 命名规则:主表名称_从表名称_fk
FOREIGN KEY (dept_id) -- 作用在这个dept_id字段上
REFERENCES dept(id) -- 关联主表的主键id
) ;
DROP TABLE emp ;
-- 删除3号部门
-- 加入外键约束:修改和删除是很麻烦,需要先修改或者删除从表数据,然后修改/删除主表数据
-- 将id为3的和id为的3清除
DELETE FROM emp WHERE id= 3 OR id = 6 ;
DELETE FROM dept WHERE id = 3;
SELECT * FROM dept ;
SELECT * FROM emp ;