数据库

MySQL的常见命令

1查看当前数据库 show databases;

2打开指定的库  use 库名

3查看当前库的所有表  show tables;

4查看其他库的所有表 show tables from 库名;

5创建表 

create table 表明(

   列名 列类型,

   列名 列类型,

         。。。。。

);

6查看表结构

desc 表名;

7查看服务器的版本

方式一:登录到mysql服务端 select version();

方式二:没有登录到mysql服务端  mysql  --version   或   mysql -V

 

 

MySQL的语法规范:

1.不区分大小写,但建议关键字大写,表名,列名小写

2.每条命令最好用分号结尾

3每条命令根据需要,可以进行缩进或者换行

4注释

单行注释:#注释内容

单行注释:--注释内容

多行注释:/*注释内容*/

 

#进阶1:基础查询
/*
语法:
select 查询列表 from 表名;

1.查询列表可以是:表字段,常量值,表达式,函数
2.查询的结果是一个虚拟的表格
*/
USE myemployees;#使用该数据库

#1查询表中的单个字段
SELECT last_name FROM employees;
#2查询表中的多个字段
SELECT last_name,email FROM employees;
#3查询表中的所有字段
SELECT * FROM employees;
#4查询常量值
SELECT 100;
SELECT 'john';
#5查询表达式
SELECT 100%98;
#6查询函数
SELECT VERSION();
#7起别名
方式一:使用AS
SELECT 100%98 AS 结果;
方式二:使用空格
SELECT 100%98 结果;
特殊案列 SELECT salary AS 'out put' FROM employees;
#8去重 distinct
SELECT DISTINCT department_id FROM employees;
#9 +号的作用 mysql中的+号只有一个功能:运算符
/*
select '90'+90; 只要其中一方为字符型,试图将字符型转成数值型
select ‘john’+90; 成功:做加法运算 失败:则将字符型数值转换成0
select null+10; 只要一方为null,则结果肯定是null
*/

#案列:查询员工的名和姓链接成一个字段,并且最终显示
SELECT CONCAT('last_name','first_name') AS 姓名 fromemployees;

 


#进阶2:条件查询
/*
select
查询列表
from
表名
where
筛选条件 ;

分类:
一,按条件表达式筛选
条件运算符:> < = != <> >= <=
二,按逻辑表达式筛选
作用:用于连接条件表达式
逻辑运算符:
&& || !
and or not
三,模糊查询
like
between and
in
is null

*/
一,按条件表达式筛选
案列1:查询工资>12000的员工信息
SELECT * FROM employees WHERE salary>12000;
案列2:查询工资在10000到20000之间的员工信息
SELECT * FROM employees WHERE salary>=10000 AND salary<=20000;
三,模糊查询
LIKE
BETWEEN AND
IN
IS NULL
LIKE
特点:一般和通配符搭配使用
% 任意多个字符,包含0个字符
— 任意单个字符
案列1:查询员工名中包含字符‘a’的员工信息
SELECT * FROM employees WHERE last_name LIKE ‘%a%’;
案列2:查询员工名中第三个字符为e,第五个字符为a的员工信息
SELECT * FROM employees WHERE last_name LIKE '__e_a%'
案列3:查询员工名中第三个字符为_员工信息
SELECT * FROM employees WHERE last_name LIKE '__$_%' ESCAPE '$'; ESCAPE:说明$是一个转意符

BETWEEN AND
/*
1包含临界值
2两个临界值不要调换顺序
*/
案列1:查询工资在10000到20000之间的员工信息
SELECT * FROM employees WHERE salary>=10000 AND salary<=20000;
SELECT * FROM employees WHERE salary BETWEEN 10000 AND 20000;

IN
/*
含义判断某字段的值是否属于in列表中的某一项
特点:1使用in 提高简洁度
2.in列表的值类型必须一致或者兼容,不能使用通配符%
*/
案列1:查询员工的工钟编号是 1,2,3中的一个员工名和工中编号
SELECT last_name,job_id FROM employees WHERE job_id IN (1,2,3);

IS NULL
/*=或<>不能用于判断null值
is null 或 is not null 可以判断*/
案列1:查询没有奖金的员工名和奖金率
SELECT last_name conmmission_pct FROM employees WHERE conmmission_pct IS NULL;
案列2:查询有奖金的员工名和奖金率
SELECT last_name conmmission_pct FROM employees WHERE conmmission_pct IS NOT NULL;

安全等于: <=>
案列1:查询没有奖金的员工名和奖金率
SELECT last_name conmmission_pct FROM employees WHERE conmmission_pct <=> NULL;
案列2:查询工资为12000的员工信息
SELECT * FROM employees WHERE salary <=> 12000;

IS NULL PK <=>
IS NULL:仅仅可以判断null值,可读性高
<=>:既可以判断null,又可以判断普通的数值,可读性差;

 

进阶3:排序查询
/*语法:select 查询列表 from 表 【where 筛选条件】 order by 【asd|desc】
特点1 asc是升序 desc 降序 如果不写 默认是升序
2 order by 子句中可以支持单个字段,多个字段,表达式,函数,别名
3order by 子句 一般是放在查询语句的最后面,limit 子句除外
*/
案列2:查询部分编号>=90的员工信息,按入职时间的先后进行排序
SELECT * FROM employees WHERE department_id >=90 ORDER BY hirdate ASC;
案列3:按年薪的高低显示员工的信息和年薪(按表达式排序)
SELECT * ,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY alary*12*(1+IFNULL(commission_pct,0)) DESC;
案列4:按年薪的高低显示员工的信息和高低(按别名排序)
SELECT * ,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY 年薪 DESC;
案列5:按姓名的长度显示员工的姓名和工资(按函数排序)
SELECT LENGTH(last_name) AS 字节长度,last_name,salary FROM employees ORDER BY LENGTH(last_name) DESC;
案列6:查询员工信息,要求先按工资升序,再按员工编号降序(按多个字段排序)
SELECT * FROM employees ORDER BY salary ASC,employees_id DESC;

 

阶段4:常见函数
/*
概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:1隐藏了实现的细节 2,提高代码的通用性
调用:select 函数名(实参列表) 【from 表】;
特点:1叫什么
2干什么

分类:
1单行函数
如:concat,length,ifnull等
2分组函数

功能:做统计使用,又称为统计函数,聚合函数,组函数。


*/

一,字符函数

1.length() 获取参数值的字节的个数
SELECT LENGTH('john');#4
SELECT LENGTH('张三丰hahaha'); #15 目前是utf_8编码,一个中文字符等于3个字节 如果是jdK编码,一个中文字符等于2个字节
2.concat() 拼接字符串
SELECT CONCAT(last_name,'_',first_name) AS 姓名 FROM employees;
3.upper()大写,LOWER()小写
案列:将姓变大写,名变小写,然后拼接
SELECT CONCAT(UPPER(last_name),LOWER(first_name)) AS 姓名 FROM employees;
4. SUBSTR ,SUBSTRING
注意:索引从1开始
截取从指定索引处后面的所有字符
SELECT SUBSTR('李莫愁爱上了陆展元',7) AS out_put; #陆展元
截取从指定索引处指定长度的字符
SELECT SUBSTR('李莫愁爱上了陆展元',1,3) AS out_put;#李莫愁
案列:姓名中首字符大写,其他字符小写然后用_拼接,显示出来
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',lower(SUBSTR(last_name,2))) AS out_put FROM employees;
5.instr 返回子串第一次出现的索引,如果找不到返回0
SELECT INSTR('李莫愁爱上了陆展元','李莫愁') AS out_put; #1
6.trim
SELECT TRIM(' 张三 ') AS out_put; #张三
SELECT TRIM('a' FROM 'aaaaa张aaa三aaaa') AS out_put ;#张aaa三
7.lpad 用指定的字符串实现左填充指定长度
SELECT LPAD ('殷素素',10,'*') AS out_put;
8.rpad 用指定的字符串实现右填充指定长度
SELECT RPAD ('殷素素',10,'*') AS out_put;
9.replace 替换
SELECT REPLACE ('张无忌爱上了周芷若','周芷若','赵敏') AS out_put;

二,数学函数
1ROUND 四舍五入 先绝对值,在四舍五入,再加正负号
SELECT ROUND(-1.55) #2
SELECT ROUND(1.567,2) #1.57
2CEIL 向上取整,返回》=该参数的最小整数
SELECT CEIL(1.1);
3FLOOR 向下取整,返回<=该参数的最小整数
SELECT FLOOR(-9.9) #-10
4TRUNCATE 截断
SELECT TRUNCATE(1.996,1); #1.9
5MOD 取余
SELECT MOD(-10,-3); #-1

三,日期函数

1.now() 返回当前系统日期+时间
SELECT NOW();
2CURDATE() 返回当前系统日期,不包含时间
SELECT CURDATE();
3CURTIME() 返回当前系统时间,不包含日期
SELECT CURTIME();
4可以获取指定的部分,年,月,日,小时,分钟,秒
SELECT YEAR(NOW()) AS 年;
SELECT YEAR('1998-1-1') AS 年;
SELECT YEAR(hiredate) AS 年 FROM employees;

SELECT MONTH(NOW()) AS 月;
SELECT MONTHNAME(NOW()) AS 月; #英文

2.str_to_date 将字符串通过指定的格式转换成日期
SELECT STR_TO_DATE ('1998-3-2','%Y-%c-%d') AS out_put;
案列:查询入职日期为1992-04-03的员工信息
SELECT * FROM employees WHERE hiredate = 1998-4-3 ;
SELECT * FROM employees WHERE hiredate = STR_TO_DATE ('4-3 1992','%c-%d %Y') ; #出来的日期类型为:1992-04-03
3.date_format 将日期转换成字符
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;
案列:查询有奖金的员工名和入职日期(xx月/xx日 xx年);
SELECT last_name ,date_format(hiredate,'%m月/%d日 %y年') AS 入职日期
FROM employees WHERE commission_pct IS NOT NULL;

四 其他函数
SELECT VERSION();
SELECT DATABASE();
SELECT USE();

五,流程控制函数
。。。空着了            p52

 

二:分组函数
/*功能:做统计使用,又称为统计函数,聚合函数,组函数。
分类:sum,avg,max.min.count计算非空的个数(不为null的个数)
特点:
1,sum,avg一般用于处理数值型
max,min,count可以处理任何类型
2.以上分组函数都忽略null值
3,可以和distinct搭配实现去重的运算
4.count函数的单独介绍
一般使用count(*)用作统计行数
5.和分组函数一同查询的字段要求是group by后的字段
*/

数据库

 1.简单的使用

SELECT sun(salaary) FROM employees;
SELECT sun(salaary) 和,avg(salary) 平均值,count(salary) 计数 FROM employees;
2参数支持哪些类型
SELECT sunm(last_name) FROM employees;
4和distinct 搭配
SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;
5.count函数的单独介绍
SELECT COUNT(salary) FROM employees;
SELECT COUNT(*) FROM employees; # 107 所有列的的全部非空的行数

SELECT COUNT(1) FROM employees; # 107
6.和分组函数一同查询的字段有限制
SELECT AVG(salary), employee_id FROM employees; #查询有误

 

进阶5:分组查询
/*
语法:
select 分组函数,列(要求出现在group by的后面)
from 表
【where 筛选条件】
group by
【order by 子句】
注意:
查询列表必须特殊,要求是分组函数和group by后出现的字段
特点:
1.分组查询中的筛选条件分为两类
数据源 位置
分组前筛选: 原始表(库里面真实存在的表) group by前面 where
分组后筛选: 分组后的结果集 group by后面 having

1分组函数做条件肯定是放在having子句中;
2能用分组前筛选的,就优先使用分组前筛选

2,group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开,没有顺序要求),表达式或函数。
3也可以添加排序
*/
案例1:查询每个工种的最高工资
SELECT MAX(salary) ,job_id FROM employees
GROUP BY job_id;
案例2: 查询每个位置上的部门个数
SELECT COUNT(*) ,location_id FROM employeess
GROUP BY location_id;
添加筛选条件
案列1:查询邮箱中包含A字符的每个部门的平均工资
SELECT AVG(salary) department_id
FROM employees
WHERE email LIKE '%A%'
GROUP BY department_id;
案例2:查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
复杂的筛选条件
案例1:查询哪个部门的员工个数>2
SELECT COUNT(*) department_id
FROM employees
GROUP BY deparment_id
HAVING COUNT(*)>2;
按表达式或函数分组
案例:按员工的姓名长度,查询每一组的员工个数,筛选员工个数>5的有哪些?
SELECT COUNT(*),LENGTH(last_name)
FROM employees
GROUP BY LENGTH(last_name)
HAVING COUNT(*) >5;
按多个字段进行分组
案例:查询每个部门每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY job_id,department_id;
添加排序
案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示出来
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY job_id,department_id
ORDER BY AVG(salary) DESC;

 

p69开始

数据库

 


进阶6:连接查询
/*
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
分类:

按年代分类:
sal192标准:仅仅支持内连接
sal199标准【推荐】:支持内连接+外连接(左外+右外)+交叉连接:


按功能分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接:

*/

一:sal192标准:仅仅支持内连接
1.等值连接
/*
1多表等值连接的结果为多表的交集部分
2n表连接,至少需要n-1个连接条件
3多表的顺序没有要求
4一般需要为表起别名
5可以搭配前面介绍的所有子句使用,比如排序,分组,筛选
*/
案列1:查询女神名对应的男神名
SELECT NAME,boyName FROM boys,beauty WHERE beauty.boyfriend_id=boys.id; #女神表里面有男神id
案列2,查询员工名和对应的部门名
SELECT last_name,department_name FROM enployees,departments WHERE enployees.'department_id' = departments.'department_id';
2.为表起别名
/*
1提高语言的简介度
2区分多个重名的字段

注意:如果为表起了别名,则查询的字段就不能用原来的表名去限定了
*/
案列1:查询员工名,工种号,工种名
SELECT e.last_name,e.job_id,j.job_title
FROM employees e,jobs j
WHERE e.'job_id' = j.'job_id';
3,两个表的顺序是否可以调换
案列1:查询员工名,工种号,工种名
SELECT e.last_name,e.job_id,j.job_title
FROM jobs j ,employees e
WHERE e.'job_id' = j.'job_id';
4.加筛选
案列1:查询有奖金得员工名,部门名
SELECT last_name,department_name
FROM employees e,departments d
WHERE e.'department_id'=d.'department_id'
AND e.'commission_pct' IS NOT NULL;
5.加分组
案列1: 查询每个城市得部门个数
SELECT COUNT(*) 个数 ,city
FROM deparments d,locations l
WHERE d.'location_id'=l.'location_id'
GROUP BY city;
案列2:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
SELECT department_name,d.manager_id,MIN(salary)
FROM departments d,employees e
WHERE d.'department_id'=e.'department_id'
AND comission_pct IS NOT NULL
GROUP BY department_name,d.manager_id;
6.可以加排序
案例:查询每个工种的工种名和员工的个数,并且按员工个数降序
SELECT job_title,COUNT(*)
FROM employees e,jobs j
WHERE e.'job_id'=j.'job_id'
GROUP BY job_title
ORDER BY COUNT(*) DESC;

7可以实现三表连接
案列:查询员工名,部门名和所在的城市
SELECT last_nam,department_name,city
FROM employees e,departments d,locations l
WHERE e.'department_id'=d.'department_id'
AND d.'location_id'=l.'location_id';

2,非等值连接
案例1:查询员工的工资和工资级别
SELECT salary,grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN a.'lowest_sal' AND g.'hight_sal';

3.自连接
案例:查询 员工名 和上级的名称 (一个表里面有员工和上级的全部信息)
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.'manager_id'= m.'manager_id';


二:sal199标准【推荐】:支持内连接+外连接(左外+右外)+交叉连接:
/*
语法:select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
。。。;



内连接:inner
等值连接
非等值连接
自连接
外连接:
左外连接:left 【outer】
右外连接:right 【outer】
全外连接:full【outer】
交叉连接:cross
*/
一):内连接
/*
语法:
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件
where 筛选条件

分类:
等值连接
非等值连接
自连接

特点:
1可以添加排序,分组,筛选
2inner可以省略
3筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
4inner join 连接和sql192语法中的等值连接的效果是一样的,都是查询多表的交集部分

*/
1.等值连接
案例1.查询员工名,部门名
SELECT last_name,department_name
FROM employees e
INNER JOIN department d
ON e.'department_id'=d.'department_id';
案例3:查询部门个数>3的城市个数和部门个数
SELECT city,COUNT(*) 部门个数
FROM department d
INNER JOIN locations l
ON d.'location_id'=l.'location_id'
GROUP BY city
HAVING COUNT(*)>3;
案例5:查询员工名,部门名,工种名,并按部门名降序排列(三表连接)
SELECT last_name,department_name,job_title
FROM employees e
INNER JOIN department d ON e.'department_id'=d.'department_id'
INNER JOIN jobs j ON e.'job_id'=j.'job_id'
ORDER BY department_name DESC;

二)非等值连接
案例1:查询员工的工资和工资级别
SELECT salary,grade_level
FROM employees e
INNER JOIN job_grades g
ON e.salary BETWEEN a.'lowest_sal' AND g.'hight_sal';
三)自连接
案例:查询 员工名 和上级的名称 (一个表里面有员工和上级的全部信息)
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e
INNER JOIN employees m
ON e.'manager_id'= m.'manager_id';

二:外连接
/*
应用场景:用于查询一个表中有,另一个表中没有的记录
特点:
1,外连接的查询结果为主表中的所有记录
如果从表中和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示为null
外连接查询的结果=内连接+主表中有而从表中没有的记录
2.左外连接,left join左边的是主表 查询的是哪个表中的数据,哪个就是主表
右外连接,right join右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果
4.全外连接=内连接的结果+表1中有但表2没有的 +表2中有但表1没有的
*/
案例1:查询男朋友,不在男神表的女神名
左外
SELECT b.name,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.'boyfriend_id'=bo.'id'
WHERE bo.'id' IS NULL;
右外
SELECT b.name,bo.*
FROM boys bo
RIGHT OUTER JOIN beauty b
ON b.'boyfriend_id'=bo.'id'
WHERE bo.'id' IS NULL;
案例1:查询哪个部门没有员工
左外:
SELECT d.*,e.employees_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.'department_id'=e.'department_id'
WHERE e.'employees_id' IS NULL;

全外:
SELECT b*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.'boyfriend_id'=bo.id;

进阶7:子查询
/*
含义:
出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询

分类:
按子查询出现的位置:
select后面:仅仅支持标量子查询

from后面:支持表子查询

*where或having后面:
标量子查询(单行)
列子查询(多行)

行子查询

exists后面(相关子查询)
表子查询
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)

*/
一,where或having后面:
1标量子查询(单行)
2列子查询(多行)

3行子查询
特点:
1子查询放在小括号内
2子查询一般放在条件的右侧
3标量子查询,一般搭配着单行操作符使用
> < = >= <= <>
列子查询,一般搭配着多行操作符使用
in,any/SOME ,ALL
4.子查询的执行优先于主查询执行

四,exists后面(相关子查询)
/*
语法:exists(完整的查询语句)
结果:1或0
*/
案例1:查询有员工的部门名 先外查询再内查询
SELECT department_name
FROM department d
WHERE EXISTS(
SELECT *
FROM employees e
WHERE d.'department_id'=e.'department_id'
);

#in
SELECT department_name
FROM department d
WHERE d.'department_id' IN(
SELECT *
FROM employees e
);


测试案例:
1.查询和zlo相同部门的员工姓名和工资
SELECT last_name salary
FROM employees
WHERE department_id=(
SELECT department_id
FROM employees
WHERE last_name ='zlo'
);
2.查询工资比公司平均工资高的员工的员工号,姓名和工资。
SELECT employees_id,last_name,salary
FROM employees e
WHERE e.salary>(
SELECT AVG(salary) FROM employees
);
3.查询各部门中工资比本部门平均工资高的员工号,姓名和工资
SELECT employees_id,last_name,salary
FROM employees e
INNER OUTER JOIN(
SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id;
)ag_dep
ON e.department_id=ag_dep.'department_id'
WHERE salary>ag_dep.ag;

进阶8:分页查询
/*
应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法:
select 查询列表
from 表
【join type join 表2
on 连接条件
where....

limit offset,size;

offset 要显示条目的其实索引(起始索引从0开始)
size 要显示的条目个数

特点:
1.limit语句放在查询语句的最后
2公式:
要显示的页数page,每页的条目数size

select 查询列表 from 表
limit (page-1)*size,size;
找规律:
size=10
page
1 0
2 10
3 20

*/
案例1:查询前5条
SELECT * FROM employees LIMIT 0,5; #0可以省略
案例2:查询11条到25条
SELECT * FROM employees LIMIT 10,15;


进阶9:联合查询
/*
union 联合 合并:将多条查询语句的结果合并成一个结果
语法:
查询语句1
union
查询语句2
union
...

应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时

特点:
1要求多条查询语句的查询列数时一样的
2要求多条查询语句的查询的每一列的类型和顺序是一致的
3使用union关键字默认是去重的,如果使用union all可以包含重复项
*/
引入案例:
查询部门编号》90或邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90;

SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id>90;

案例2:查询中国用户中男性的信息以及外国用户中男性的用户信息
SELECT id,cname,csex FROM t_ca WHERE csex='男'
UNION
SELECT t_id,tName,tGender FROM t_ua WHERE tGender='male';

 

一,插入语句
方式一:
/*
语法:
insert into 表名(列名,。。。。)values(值1,。。。);

*/
1.插入的值的类型要与列的类型一直或兼容
2可以为null的列插入值
3列的顺序可以调换
4.列数和值的个数必须一致
5可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致
方式二:
/*
语法:
insert into 表名
set 列名=值,。。。;
*/
方式一PK方式二
1.方式一支持插入多行,方式二不支持
INSERT INTO beauty
values(23,'zhang','nv','1994-08-07',NULL,NULL,2)
,(24,'zhang1','nv','1994-08-07',NULL,NULL,2)
,(25,'zhang2','nv','1994-08-07',NULL,NULL,2);
2方式一支持子查询,方式二不支持
INSERT INTO beauty(id,NAME,phone)
SELECT 26,,'wang','115';

INSERT INTO beauty(id,NAME,phone)
SELECT id,boyname,'458'
FROM boys;

二:修改语句
/*
1.修改单表的记录
语法:
update 表名
set 列=新值,列=新值。。。
where 筛选条件 ;

2.修改多表的记录[补充]
语法:
sql192语法:(只支持内连接)
update 表1 别名,表2 别名
set 列=值,。。。
where 连接条件
and 筛选条件;

sql199语法:
update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 列=值,。。。
where 连接条件;
*/

三:删除语句
/*
方式一:delete
语法:
1.单表的删除
delete from 表名 where 筛选条件
2.多表的删除【补充】
sql192语法:
delete 表1的别名,表2的别名
from 表1 别名,表2 别名
where 连接条件
and 筛选条件;

sql199语法:
delete 表1的别名,表2的别名
from 表1 别名
inner|left|right join 表2
on 连接条件
where 筛选条件


方式二:truncate
语法:truncate table 表名;

*/

DELETE PK TRUNCATE
1DELETE可以加where 条件,truncate不能加
2truncate删除,效率高一点点
3假如要删除的表中有自增长列,
如果用delete删除后,再插入数据,自增长列的值从断电开始,
而truncate删除后,再插入数据,自增长列的值从1开始。
4truncate删除没有返回值,delete有
5TRUNCATE 删除不能回滚事务,delete删除可以回滚;


DDL
/*
数据定义语言
库和表的管理
一。库的管理
创建,修改,删除
二,表的管理
创建,修改,删除

创建:creat
修改:alter
删除:drop
*/
一。库的管理
1.库的创建
/*
语法:
create database 【IF NOT EXISTS】库名; 【不存在就创建,存在了就不创建】
*/
案例1:创建库books;
CREATE DATABASE IF NOT EXISTS books;
2.库的修改
RENAME DATABASE boooks TO 新库名;
更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;
3,库的删除
DROP DATABASE 【if exists】books;

二,表的管理
1.表的创建
/*
create table 表名(
列名 列的类型【(长度),约束】,
列名 列的类型【(长度),约束】,
列名 列的类型【(长度),约束】,
列名 列的类型【(长度),约束】

*/
2.表的修改
a.修改列名
ALTER TABLE book[表名] CHANGE COLUMN 旧列名 新列名 新列名的数据类型;
b。修改列的类型或约束
ALTER TABLE 表名 MODIFY COLUMN 旧数据类型 新数据类型;
c,添加新列
ALTER TABLE 表名 ADD COLUMN 列名 数据类型;
d删除列
ALTER TABLE 表名 DROP COLUMN 列名;
e修改表名
ALTER TABLE 表名 RENAME TO 新表名;
3表的删除
DROP TABLE 表名;
4.表的复制
a.仅仅复制表的结构
CREATE TABLE 新表 LIKE 旧表;
b复制表的结构+数据
CREATE TABLE 新表
SELECT* FROM 旧表;
c只复制部分数据
CREATE TABLE 新表
SELECT id,au_name
FROM author
WHERE nation='中国';
d仅仅复制某些字段(不要数据)
CREATE TABLE 新表
SELECT id,au_name
FROM author
WHERE 1=2; 或者where=0; p118
p125
常见约束
/*
含义:一种限制,用于限制表中的数据,保证表中的数据的准确和可靠

分类:六大约束
not null:非空,用于保证该字段的值不能为空
比如:姓名,学号
default:默认,用于保证该字段有默认值
比如:性别
primary key :主键,用于保证该字段的值具有唯一性,且非空
比如学号,员工编号等
unique:唯一,用于保证该字段的值具有唯一性,可以为空
比如座位号
check:检查约束【mysql中不支持】
比如年纪,性别
foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
在从表添加外键约束,用于引用主表中某列的值
比如:学生表的专业编号,员工表的部门编号,员工表的工种编号

添加约束的时机:
1.创建表时
2修改表时

约束的添加的分类:
列级约束:
六大约束语法上都支持,但外键约束没有效果
表级约束
除了非空,默认,其他的都支持
*/
CREATE TABLE 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
);
一,创建表时添加约束
1.添加列级约束
/*
语法:
直接在字段名和类型后面追加 约束类型即可

只支持:默认 非空 主键 唯一
*/
USE students;
CREATE TABLE stuinfo(
id INT PRIMARY KEY,
stuName VARCHAR(20) NOT NULL,
gender CHAR(1) CHECK(gender='男' Orgender='女'),
seat INT UNIQUE,#唯一
age INT DEFAULT 18,
majorId INT FOREIGN KEY REFERENCES major(id)#外键
);

CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);

2.添加表级约束
/*
语法:在各个字段的最下面
【constraint 约束名】 约束类型(字段名)
*/
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT ,
stuName VARCHAR(20) ,
gender CHAR(1) ,
seat INT ,
age INT ,
majorId INT ,

CONSTRAINT pk PRIMARY KEY(id),
CONSTRAINT uq UNIQUE(seat),
CONSTRAINT ck CHECK(gender='男' Orgender='女'),
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);

通用的写法:
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuName VARCHAR(20) NOT NULL,
gender CHAR(1) CHECK(gender='男' Orgender='女'),
seat INT UNIQUE,#唯一
age INT DEFAULT 18,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)

)

主键和唯一的对比
保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
主键 可以 不可以 最多有1个 可以,但是不推荐
唯一 可以 可以 可以有多个 可以,但是不推荐

外键:
1.要求在从表设置外键关系
2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无所谓
3主表的关联列必须时一个key(一啊不能时主键或者唯一键)
4插入数据时,先插入主表,再插入主表
删除数据时,先删除从表,再删除主表。

二.修改表时约束
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT ,
stuName VARCHAR(20) ,
gender CHAR(1) ,
seat INT ,
age INT ,
majorId INT ,
)
1.添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL;

 

上一篇:Spring5 -- 学习笔记 - 3.IoC容器-操作Bean管理(xml自动装配)


下一篇:springboot整合mybatis