MySQL数据库基础学习

MySQL基础知识

-----------

MySQL数据库简介

内存:一断电数据就没有了
---------
数据库:可以实现数据的持久化存储,有完整的管理系统管理,方便查询
---------

关系型数据库:将数据存储的数据库中同时维护数据之间的关系,用多张二维表的形式存储,同时又给多张表建立了一定的关系的关系型数据库,Oracle,myql,sqlserver,数据的存储是通过SQL结构化查询语言来实现的,
非关系数据库:nosql 通常用json格式进行存储数据的,mogodb,redies,不能执行sql命令

DB:数据库,保存一组有组织的数据的容器
DBMS:数据库管理系统,也叫数据库软件或产品,用于管理DB中的数据
SQL:结构化查询语言,用于和DBMS通信的语言


DB:database 数据库:存储数据的大仓库,保存的是有组织,有规范的数据,
DBMS:DatabseManagement System 数据库管理系统,简称数据库软件,MySQL数据库,Oracle数据库,SQLServer数据库 DB2数据库:SQLserver只能安装在windows操作系统上
SQL:Structure Query Language 结构化查询语言:用于跟数据库通信的编程语言

数据存储在DB中,
DBMS管理着或者说是维护着DB中的数据

DB:数据库,保存一组有组织的数据的容器
DBMS:数据库管理系统,也叫数据库软件或数据库产品,用来管理DB中的数据
SQL:结构化查询语言,用于跟DBMS通信的语言
----------------
数据库的特点:
数据库中的表具有唯一性,不能重复
数据表中的列叫字段,
=============

MySQL 数据库在数据库软件中的地位:

MySQL数据库的安装:

MySQL数据库的安装图解教程https://www.cnblogs.com/GaoNa/p/9580726.html#autoid-0-0-0

MySQL数据库安装的时候关闭防火墙,退出当前系统上不需要的其他软件比如:360,QQ之类的,保持安装的时候系统是最干净的
安装路径:非中文没有空格
命名的时候随便并不是真的很随便,我只是客套一下而已,还是要有所关联的
----------
学习的时候设置的密码尽量设置的简单一点,不然的话后期修改可麻烦,可麻烦了,
还就就是不要一说设置密码你就设置你女朋友的生日,不要回头修改的时候你忘记是你哪个女朋友的生日了
------------

MySQL数据库由MySQL AB公司创建的,总部在瑞典
Monty 说编程就像玩游戏,蹭一下时间就过去了

MySQL数据库的特点:
开放源代码,可以免费使用
安装简单,容易使用
----------
DBMS分为:
基于共享文件系统的DBMS: Access
基于客户机/服务器的(C/S架构的)DBMS:MySQL Oracle SQLServer 数据主要存储在服务端,客户端主要用来连接和使用服务端的数据
----------- 

 MySQL数据库的卸载

1.在控制面板中找到MySQL的安装程序,右键卸载即可

2.删除MySQL安装目录下的整个MySQL文件夹

3.在系统的隐藏文件目录ProgramData中,删除整个MySQL文件夹

4.删除系统注册表中的MySQL残留文件信息

----------------------

MySQL中重要的配置文件信息


my.ini 文件中的重要内容

 

 修改好配置文件my.ini 后需要重新启动一下MySQL的服务程序,否则的配置文件修改后是没有生效的

 ---------------------

MySQL自带的命令行客户端启动,用系统默认的root账户的密码登录即可,这种登录方式只适合于root用户

 在cmd中用普通的用户的方式登录MySQL数据库

或者

或者

在cmd命令行中退出MySQL

exit 或者 Ctrl+C

------------------

MySQL系统环境变量的配置

在Path值的最前面粘贴MySQL的安装路径,然后用英文的分号与后面的内容隔开

------------

 常用的MySQL命令

破解mysql登录密码
#远程登陆连接
mysql -utest -ptest123 -h 192.168.200.96
2、删除表
drop table 表名
3、清空表
# 表还存在,表内容清空

delete from 表名
truncate table 表名

# 添加列:
alter table 表名 add 列名 类型
# 删除列:
alter table 表名 drop column 列名
# 修改列:
alter table 表名 modify column 列名 类型; -- 类型
alter table 表名 change 原列名 新列名 类型; -- 列名,类型
# 添加主键:
alter table 表名 add primary key(列名);
# 删除主键:
alter table 表名 drop primary key;
alter table 表名 modify 列名 int, drop primary key;
# 添加外键:
alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
# 删除外键:
alter table 表名 drop foreign key 外键名称

查看表结构
desc 表名;

1.mysql命令的结尾用分号或是g 表示一条命令的结束,推荐使用分号表示一条命令的结束

在cmd命令行中启动和停止MySQL服务:
net stop MySQL服务名称
net start MySQL服务名称
--------------
use test;
show tables;
use mysql;
show tables;
在数据库中查看另一个数据库中的表信息
show tables from mysql;
查看当前所在的数据库是谁
select database();

database dA它贝斯
-----------
查看一个数据表的结构
desc stuinfo;
查看表中的数据
select * from stuinfo;
在数据表中插入数据
insert into stuinfo(id,name) values(1,'john');
insert into stuinfo(id,name) values(2,'rose');
修改数据表中的数据
update stuinfo set name='lilei' where id=1;
删除数据表中的数据
delete from stuinfo where id=1;
-----------
查看当前MySQL数据库的版本信息
select version();
mysql --version
--------------------

 简单的基本查询

MySQL不分区大小写:但是关键字用大写,表名小写,列名小写
MySQL中每条命令用分号结尾

MySQL中的注释:
>单行注释:#注释文字
>单行注释:--注释文字
>多行注释:/* 注释文字 */
>
----------------
SQL语言:
基础查询
条件查询
排序查询
常见函数
分组函数
分组查询
连接查询
子查询
分页查询
union联合查询
-------------------
DQL:Data Query Language 数据查询语言
DML:Data Manipulation Language数据操纵语言(SELECT、UPDATE、INSERT、DELETE,对数据库的数据进行的操作
DDL:Data definition language)数据库定义语言:CREATE、ALTER、DROP 改变表的结构,数据类型,表之间的链接和约束
DCL:Data Control Language)数据库控制语言,grant,deny,revoke,用来设置或更改数据库用户或角色权限的语句
TCL: Transaction Control Language事务控制语言
-------------
事务特性 ACID
原子性 atomicity 所有的数据修改 要么一起执行 要么不执行
一致性 congsistency 所有的数据修改同时得到反应
隔离性 isolation 另一个事务需要在此事务结束之后才能执行
持久性 durability 数据变动是永久的
--------------
firstname 名字
lastname 姓氏
-----------------
冗余:重复

-------------
SELECT 查询列表 FROM 表名;
其中:查询列表可以是:表中的字段,常量值,表达式,函数,
得到的一个查询结果是一个虚拟的临时表

-----------
11.查询表中的单个字段
SELECT name FROM employee;
11.查询表中的多个字段
SELECT name,salary,email FROM employee;
11.查询表中的所有字段
SELECT * FROM employee;
11.USE 命令
USE employee;
11.`` 反引号
将SQL中的类似关键字的字段变成一个普通的字符串

查询常量值
SELECT 'john';
查询表达式
SELECT 100*99; 2
查询函数
SELECT VERSION();
查询的时候给字段起别名,方便理解,如果查询的字段有重名的情况,使用别名可以区分开来,
SELECT 100%99 AS 结果;
SELECT last_name AS 姓,first_name AS 名 FROM employee;

SELECT last_name 姓,first_name 名 FROM employee;
起别名的时候可以用空格也可以使用AS
------------
查询中有特殊符号,需要把特殊符号加上双引号,不然的话会引起歧义
-----------
去除重复的查询
SELECT department_id FROM employee;
查询所有的部门的编号
SELECT DISTINCT department_id FROM employee;
--------------------
+ 号的使用,将多个字段连接成一个字段
SELECT last_name+first_name AS 姓名 FROM employee;
两个操作数都是数值型,则做加法运算
SELECT 100+90;
SELECT '100'+90; 加号运算的一方为字符型,试图将字符型转换成数值型,如果转换成功,则继续做加法运算,如果转换失败,则将字符型数值转换成0
SELECT 'john'+90;

只要+操作数的一方为null,这执行的运算结果肯定为null
-------
拼接字符串的方法
SELECT CONCAT('a','b','c') AS 结果;

SELECT ONCAT(last_name,first_name) AS 姓名 FROM employee;
-----------
SELECT employee_id,last_name,salary*12 AS "ANNUAL SALARY" FROM employee;

显示一个表的结构:
DESC department;
显示表的全部内容:
SELECT * FROM department;
不重复的显示出job_id,不能重复
SELECT DISTINCT job_id FROM employee;
显示employee表的全部列,各个列之间用逗号连接,将列头显示成OUT_PUT
SELECT IFNULL(commission_pct,0) AS 奖金率,
commission_pct
FROM employee;
CONCAT(`first_name`,',',`last_name`','`job_id`,',',IFNULL(commision_pct,0)) AS OUT_PUT
FROM employee;
--------------------

 条件查询

条件查询
SELECT 查询列表 FROM 表名 WHERE 筛选条件;
11.按条件表达式的筛选
条件运算符:><= != <> >= <=
11.按逻辑表达式筛选
&& || ! 与 或 非
and or not
11.模糊查询
LIKE BETWEEN AND IN IS NULL
------------------
1.按条件表达式刷选
查询工资>12000的员工信息
SELECT * FROM employee WHERE salary>12000;
2.查询部门编号不等于90号的员工名和部门编号
SELECT last_name,department_id FROM employee WHERE department_id !=90;

SELECT last_name,department_id FROM employee WHERE department_id <>90;
---------------
逻辑运算符:用于连接条件表达式
&&和and :两个条件都为true,结果为true,反之为false

||或or :只要有一个条件为true,结果为true,反之为false

!或NOT:如果连接的条件本身为false,结果为true ,反之WIfalse
--------------
查询工资在10000到20000之间的员工的员工名,工资以及奖金
SELECT last_name,salary,commission_pct FROM employee WHERE salary >=10000 AND salary<=20000;
查询 部门编号不是在90到100之间,或者工资高于150000的员工的信息
SELECT * FROM employee WHERE department_id<90 department_id<=100 OR salary>15000;

SELECT * FROM employee WHERE NOT(department_id<90 AND department_id<=100)OR salary>15000;
SELECT * FROM employee WHERE NOT(department_id>=90 AND department_id<=100)OR salary>15000;
--------------
模糊查询:
LIKE
BETWEEN AND
IN
IS NULL
IS NOT NULL
查询员工名中包含字符a的员工信息

查询员工名字中包含字符a的员工的信息
SELECT * FROM employee WHERE last_name LIKE '%a%';
LIKE :一般和通配符搭配使用,
% 表示任意多个字符,包含了0个个字符
_ 表示任意单个字符,

查询员工名字中第三个字符为a,第五个字符为a的员工名和工资
SELECT last_name,salary FROM employee WHERE last_name LIKE '__e_a%';

查询员工姓名中第二个字符为_的员工名:使用了转义字符
SELECT last_name FROM employee WHERE last_name LIKE '_\_%' ;
随意写的转移字符,$
SELECT last_name FROM employee WHERE last_name LIKE '_$_%' ESCAPE '$';

查询员工编号在100到120之间的员工信息
SELECT * FROM employee WHERE employee_id >=100 AND employee_id<=120;
使用BETWEEN AND 改写
SELECT * FROM employee WHERE employee_id BETWEEN 100 AND 120;
SELECT * FROM employee WHERE employee_id BETWEEN 120 AND 100;
----------------------
IN关键字

查询员工工种编号是IT_PROG,AD_VP,AD_PRES中的一个员工名和工种编号
SELECT last_name,job_id FROM employee WHERE job_id='IT_PROT' OR job_id='AD_VP' OR JOB_ID='AD_PRES';
用IN改写:
SELECT last_name,job_id FROM employee WHERE job_id IN ('IT_PROT','AD_VP','AD_PRES') ;
用于去判断某字段的值是都属于IN列表中的某一项,提高了语句的简洁度,IN列表中的值类型必须一致或兼容
IN 中不支持查询的字段中写通配符
================
IS NULL 与IS NOT NULL 用来判断空值
查询没有奖金的员工名和奖金率
SELECT last_name,commission_pct FROM employee WHERE comminssion_pct IS NULL;
查询有奖金的员工名和奖金率
SELECT last_name,commission_pct FROM employee WHERE comminssion_pct IS NOT NULL;
----------- 

<=> 安全等于
查询没有奖金的员工名和奖金率
SELECT last_name,commission_pct FROM employee WHERE commissuin_pct <=>NULL;
查询工资为12000的员工信息
SELECT last_name,salary FROM employee WHERE salary <=>12000;
IS NULL 仅仅可以判断NULL值
<=> 既可以判断NULL值也可以判断普通的数值
-----------
查询员工号为176的员工的姓名和部门号和年薪
SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0) AS 年薪 FROM employee;
--------------
查询没有奖金,且工资小于18000的salary,last_name
SELECT salary,last_name FROM employee WHERE comminssion_pct IS NULL AND salary <18000;
查询employee表中,job_id不为‘IT’或者工资为12000的员工信息
SELECT * FROM employee WHERE job_id<>'IT' OR salary=12000;
查询department表的结构
DESC department;
查询department表中涉及到了那些位置编号
SELECT DISTINCT location_id FROM department;

SELECT * FROM employee;和
SELECT * FROM employee WHERE commission_pct LIKE '%%' AND last_name LIKE '%%'; 结果是否一样,并说明原因
不一样,如果判断字段有NULL值的时候
SELECT * FROM employee;和
SELECT * FROM employee WHERE commission_pct LIKE '%%' OR last_name LIKE '%%';结果是否一样,并说明原因
结果是一样的

===========================

 MySQL基础知识总结

数据库的好处:可以持久化数据到本地,可以实现结构化查询
DB:存储数据的大仓库
DBMS:数据库管理系统,数据库软件或是数据库产品,用来创建和管理DB的
SQL:结构化查询语言,用于和数据库通信的语言,

数据库存储数据的特点:
>数据存放在表中,数据表存放在数据库中
>一个数据库可以有多张数据表,每张表具有唯一的表名来标识自己
>表中有一个或多个列,数据表中的列叫字段,相当于java中的属性
>表中的每一行数据,相当于java中的对象

MySQL的来源:
瑞典的MySQLAB 08年被sun公司收购,09年sun被Oracle收购
MySQL的优点:
>开源,免费,体积小,方便安装
>
MySQL是C/S结构的软件,既有服务器端也有客户端 

启动服务
net start mysql服务名
net stop mysql服务名
MySQL的登录
mysql -h主机名 -P端口号 -u用户名 -p密码
MySQL的退出
exit 或 CTRL+C

SELECT 查询语句的特点
查询列表可以是字段,常量,表达式,函数,也可以是多个
查询后得到的结果是一个虚拟表
查询单个字段
SELECT 字段名 FROM 表名;
查询多个字段
SELECT 字段名,字段名,,FROM 表名;
查询所有字段
SELECT * FROM 表名;
查询常量
SELECT 常量值;
SELECT 常量值 FROM 表名;
查询函数
SELECT 函数名(实参列表);
查询表达式:加减乘除取模支持,自增和自减不支持
SELECT 100/1234;
取别名
AS 或 空格
去重,只能去重单个字段
SELECT DISTINCT 字段名 FROM 表名;

+ 号:做加法运算
SELECT 数值+数值; 直接作加法运算
SELECT 字符+数值,先试图将字符转换成数值,如果转换成功,则继续运算,否则转换成0,再做运算
SELECT null+值,结果为null

CONCAT() 函数:用来拼接字符串
IFNULL()函数 判断某字段或表达式是否为null,如果为null返回指定值,否则返回原本的值
SELECT IFNULL(字段,0) FROM 表名;

IS NULL() 函数,判断某字段或表达式是否为null,如果是返回1,否则返回0
0 FALSE
1 TRUE
--------------
条件查询
简单条件运算符:> < => =<= <=>
逻辑运算符:&&AND || OR ! NOT
模糊查询:LIKE

常用的通配符:%任意多个字符  _任意单个字符

-----------------------

排序查询 

排序查询:
SELECT 查询列表 FROM 表名 WHERE筛选条件 ORDER BY ASC或DESC

查询员工信息,要求按工资从高到低排序,最上面是最大的下面是最小的
SELECT * FROM employee ORDER BY salary DESC;
查询员工信息,要求按工资从低到高排序,最上面是最小的下面是最大的
SELECT * FROM employee ORDER BY salary ;
SELECT * FROM employee ORDER BY salary ASC;

查询部门编号>=90的员工信息,按入职时间的先后顺序进行排序
SELECT * FROM employee WHERE department_id >=90 ORDER BY hiredate ASC;

按表达式查询,按员工的年薪的高低显示员工的信息和年薪
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employee ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

按年薪高低显示员工信息和年薪 按别名排序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employee ORDER BY 年薪 DESC;

按姓名的长度显示员工的姓名和工资 ,按函数排序
SELECT LENGTH('last_name') 字节长度,last_name,salary FROM employee ORDER BY LENGTH('last_name') DESC;

查询员工信息,要求按工资升序,再按员工编号降序,按多个字段排序

SELECT * FROM employee ORDER BY salary ASC,emplpyee_id DESC; 

查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序
SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employee ORDER BY 年薪 DESC,last_name ASC;

选择工资不再8000到17000的员工的姓名好工资,按工资降序
SELECT last_name,salary FROM employee WHERE salary NOT BETWEEN 8000 AND 17000 ORDER BY salary DESC;

查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
SELECT * FROM employee WHERE email LIKE '%e%' ORDER BY LENGTH(email) DESC,department_id ASC;

SQL中的函数

类似于Java中的方法
方法:将一组逻辑语句封装在方法体中,对外暴露方法名:隐藏了实现细节,提高了代码的重用性
函数的调用:SELECT 函数名(实参列表) FROM 表名;

函数的特点:叫什么-函数名 干什么-函数功能
函数分为:
单行行数:CONCAT LENGTH IFNULL
分组函数:统计函数,聚合函数
字符函数
数学函数
日期函数
流程控制函数,可以实现流程结构
--------------------
字符函数Length():获取参数值的字节个数
SELECT LENGTH('john');
SELECT LENGTH('张三丰');
SHOW VARIABLES LIKE '%char%';

拼接字符串函数Concat():
SELECT CONCAT(last_name,'-',first_name) FROM employee;

upper、lower
SELECT UPPER('john');
SELECT LOWER('joHn');
将姓变大写,名变小写,然后拼接
SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM employee;

substr、substring
截取从指定索引处后面所有的字符
SELECT SUBSTR('李莫愁爱上了陆展元',7) out_put;
mysql中的索引是从1开始的
显示李莫愁
截取从索引处指定字符长度的字符
SELECT SUBSTR('李莫愁爱上了陆展元',1,3) out_put;

姓名中首字符大写,其他字符小写,然后用_拼接,显示出来
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) out_put FROM employee;

instr 返回字符串第一次出现的索引,如果找不到返回0
SELECT INSTR('杨不悔爱上了殷六侠','殷六侠') AS out_put FROM employee;
SELECT INSTR('杨不悔爱上了殷六侠','殷八侠') AS out_put FROM employee;

trim
SELECT LENGTH(TRIM(' 张翠山 ')) AS out_put;
SELECT TRIM('a' FROM 'aaaa张aaaaaaaaaaa翠山aaaaaaaaaaaaaaaaaaaaaaaa') AS out_put;

lpad 用指定的字符实现左填充指定长度
SELECT LPAD('测试测试',10,'*') AS out_put;
SELECT LPAD('测试测试',2,'*') AS out_put;

rpad 用指定的字符实现右填充指定长度
SELECT RPAD('测试测试',12,'ab') AS out_put;

replace 替换
SELECT REPLACE('测试测试测试','测','试') AS out_put;

数学函数
round 四舍五入
SELECT ROUND(-1.55);
SELECT ROUND(1.567,2);

ceil 向上取整,返回>=该参数的最小整数
SELECT CEIL(1.002);
SELECT CEIL(-1.002);

floor 向下取整,返回小于等于<=该参数的最大整数
SELECT FLOOR(-9.99);

truncate 截断
SELECT TRUNCATE(1.69999,1);

mod 取余
MOD(a,b); a-a/a*b
MOD(-10.3); -10/-3 * -3 = -1

SELECT MOD(10,-3);
SELECT 10%3;

日期函数
now 返回当前系统日期+时间
SELECT NOW();

curdate 返回当前系统日期,不包含时间
SELECT CURDATE();

curtime 返回当前时间,不包含日期
SELECT CURTIME();

获取指定的部分,年,月,日,小时,分钟,秒
SELECT YEAR(NOW()) 年;
SELECT YEAR('1998-1-1') 年;
SELECT YEAR(hiredate) 年 FROM employee;
SELECT MONTH(NOW()) 月;
SELECT MONTHNAME(NOW()) 月;

str_to_date将日期格式的字符转换成指定格式的日期
STR_TO_DATE('9-13-1999','%m-%d-%Y')
date_format 将日期转换成字符串
DATE_FORMAT('2018/6/6','%Y年%m月%/d日');

%Y 四位的年份
%y 2位的年份
%m 月份(0102...11,12 )
%c 月份( 12...11,12 )
%d 日( 01,02...)
%H 小时( 24小时制)
%h 小时( 12小时制)
%i 分钟( 001...59 )
%s 秒( 00,01...59 )

------------------
将字符通过指定的格式转换成日期
SELECT STR_DATE('1998-3-2','%y-%c-%d') AS out_put;

查询入职日期为19982-4-3的员工信息
SELECT * FROM employee WHERE hiredate ='1992-4-3';

SELECT * FROM employee WHERE hiredate =STR_DATE('4-3-1992','%c-%d %y');
--------------------
将日期转换成字符
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;
查询有奖金的员工名和入职日期
SELECT last_name,DATE_FORMAT(hiredate,'%m月/%d日 %y年') 入职日期 FROM employee WHERE commission_pct IS NOT NULL;
------------
SELECT VERSION(); 查询当前的数据库的版本信息
SELECT DATABASE();查看当前的数据库
SELECT USER(); 查看当前的登录的用户
---------------------
流程控制函数
IF函数:用来实现 if else 的效果
SELECT IF(10>5,'大于','小于');
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金,呵呵','有奖金,嘻嘻') 备注 FROM employee;
-------------
CASE函数
case 要判断的字段/表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
;;;......
else 要显示的值n或语句n;
end
-----------------
查询员工的工资:
如果部门号为30,显示工资为1.1倍
如果部门号为40,显示工资为1.2倍
如果部门号为50,显示工资为1.3倍
如果部门号为其他,显示工资为原工资
SELECT salary 原始工资,department_id,
CASE department_id
WHEN 30 salary*1.1
WHEN 40 salary*1.2
WHEN 50 salary*1.3
ELSE salary END AS 新工资 FROM employee;
----------------------
case
when 条件1 then 要显示的值1或语句1;
when 条件2 then 要显示的值2或语句2;
...
else 要显示的值n或语句n;
end
--------------
查询员工的工资信息:
如果工资>20000 ,显示A级别
如果工资>15000 ,显示B级别
如果工资>10000 ,显示C级别
否则,显示D级别
SELECT salary
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资级别 FROM employee;
---------------------
单行函数:
字符函数:
length
doncat
substr
instr
trim
upper
lower
lpad
rpad
replace
数学函数:
round
ceil
floor
truncate
mod
日期函数:
fow
curdate
curtime
year
month
monthname
day
hour
minute
second
str_ to date
date_ format
其他函数:
version
database
user
控制函数
if
case
-----------------------
#1.显示系统时间(注:日期+时间)
SELECT NOW();

#2.查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)
SELECT employee_ id,last_ name,salary,salary*1.2 "new. salary" FROM employee;

#3.将员工的姓名按首字母排序,并写出姓名的长度(length)
SELECT LENGTH(last_ name) 长度,SUBSTR(last_ name,1,1) 首字符,last_ name FROM employee ORDER BY首字符;

#4.做一个查询,产生下面的结果
<1ast_ name> earns <salary> monthly but wants <salary*3> Dream Salary King earns 24000 monthly but wants 72000

SELECT CONCAT(last_ name,' earns ',salary,' monthly but wants ',salary*3) AS "Dream salary" FROM employees WHERE salary=24000;
---------------
#5.使用case when ,按照下面条件
job grade
AD_PRES A
ST_MAN B
IT_PROG C
SA_REP D
ST_CLERK E
产生下面的结果
last_name job_id Grade
king AD_PRES A
---------------
SELECT last_name,job_id AS job,
CASE job_id
WHEN 'AD_PRES' THEN 'A'
WHEN 'ST_MAN' THEN 'B'
WHEN 'IT_PROG' THEN 'C'
WHEN 'SA_PRE' THEN 'D'
WHEN 'ST_CLERK' THEN 'E'
END AS Grade FROM employee WHERE job_id ='AD_PRES';
--------------------

分组函数:用于统计,也叫聚合函数,统计函数或组函数
sum 求和、avg 平均值、max 最大值、min 最小值、count统计个数

求工资之和
SELECT SUM(salary) FROM employee;
SELECT AVG(salary) FROM employee;
SELECT MIN(salary) FROM employee;
SELECT MAX(salary) FROM employee;
SELECT COUNT(salary) FROM employee;

SELECT SUM(salary) 和,AVG(salary) 平均,MAX(salary) 最高, MIN(salary) 最低, COUNT(salary) 个数 FROM employee;

SELECT SUM(salary) 和,ROUND(AVG(salary),2) 平均,MAX(salary) 最高, MIN(salary) 最低, COUNT(salary) 个数 FROM employee;

分组函数的参数的类型
SELECT SUM(last_name) ,AVG(last_name) FROM employee;
SELECT SUM(hiredate) ,AVG(hiredate) FROM employee;

SELECT MAX(last_name),MIN(last_name) FROM employee;
SELECT MAX(hiredate) ,MIN(hiredate) FROM employee;

COUNT 计算的是不为NULL的行数
SELECT COUNT(last_name) FROM employee;
SELECT COUNT(commission_pct) FROM employee;

SUM,AVG 用于处理数值型
MAX MIN COUNT 可以用于处理任意类型

是否忽略null值,null值是否参与了运算
SELECT SUM(commission_pct),AVG(commission_pct) FROM employee;
SELECT commission_pct FROM empliyee;
SELECT SUM(commission_pct),AVG(commission_pct),SUM(commission_pct)/35, SUM(commission_pct)/107 FROM employee;
SELECT MAX(commission_pct),MIN(commission_pct) FROM employee;
SELECT COUNT(commission_pct) FROM employee;
分组函数是忽略null值的
------------------------------
分组函数与DISTINCT的组合
SELECT SUM(DISTINCT salary),SUM(salary) FROM employee;

SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employee;
--------------
COUNT函数
SELECT COUNT(salary) FROM employee;
SELECT COUNT(*) FROM employee;

-----------------

SELECT COUNT(salary) FROM employee;
SELECT COUNT(*) FROM employee;
SELECT COUNT(1) FROM employee;
-----------------
SELECT AVG(salary),employee_id FROM employee; 没有意义的查询
跟分组函数一同查询的字段必须是GROUP BY后的字段才有意义
---------------

#1. 查询公司员工工资的最大值,最小值,平均值,总和
SELECT MAX(salary) mx_sal,MIN(salary) mi_sal, ROUND(AVG(salary),2) ag_sal,SUM(salary) sm_sal
FROM employee;
#2.查询员工表中的最大入职时间和最小入职时间的相差天数(DIFRENCE)
SELECT DATEDIFF (MAX (hiredate) ,MIN(hiredate)) DIFFRENCE
FROM employee;
#3.查询部门编号为90的员工个数
SELECT COUNT(*)个数
FROM employee
WHERE department id = 90;
-----------------------------------

分组查询

分组查询
查询每个部门的平均工资
SELECT AVG(salary) FROM employee;

GROUP BY :可以将表中的数据分成若干组
WHERE 子句一定放在FROM后面

GROUP BY 子句的语法:
SELECT 分组函数,列(要出现在GROUP BY后面)
FROM 表
WHERE 筛选条件
GROUP BY 分组列表
ORDER BY 子句
----------------------

简单的分组查询:
查询每个工种的最高工资
SELECT MAX(salary) ,job_id FROM employee GROUP BY job_id;

查询部门的个数
SELECT COUNT(*),location_id FROM department GROUP BY location_id;

查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id FROM employee WHERE email LIKE '%a%' GROUP BY department_id;

查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id FROM employee WHERE commission_pct IS NOT NULL GROUP BY manager_id;

查询每个部门的员工个数
SELECT COUNT(*),department_id FROM employee GROUP BY department_id HAVING COUNT(*)>2;


查询部门的员工个数>2
先查询每个部门的员工个数,再对查询的结果进行筛选,查出那个部门的员工个数>2
SELECT COUNT(*),department_id FROM employee GROUP BY department_id;
完整的语句
SELECT COUNT(*),department_id FROM employee GROUP BY department_id HAVING COUNT(*)>2;
----------------------
查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
查询每个工种有奖金的员工的最高工资
SELECT MAX(salary),job_id FROM employee WHERE commission_pct IS NOT NULL GROUP BY job_id;
对查询的结果再次筛选找到工资>12000的工种编号和最高工资
SELECT MAX(salary),job_id FROM employee WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary)>12000;
---------------------
查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
先查询每个领导手下的员工固定最低工资
SELECT MIN(salary),manager_id FROM employee GROUP BY manager_id
对查询的结果添加筛选条件
SELECT MIN(salary),manager_id FROM employee WHERE manager_id >102 GROUP BY manager_id
再添加刷选条件 最低工资>5000
SELECT MIN(salary),manager_id FROM employee WHERE manager_id >102 GROUP BY manager_id HAVING MIN(salary)>5000;
------------------------
分组查询中的筛选条件分为两类
分组前的帅选,(针对数据源中的原始表中的数据进行的筛选) 放在group by 的前面 使用的是关键字where
分组后的筛选,(针对分组后的结果集的筛选) 放在group by 的后面 使用的关键字是having
分组函数做条件肯定放在having子句中
------------------
按表达式或者按函数分组
按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
查询每个长度的员工数
SELECT COUNT(*),LENGTH(last_name) len_name FROM employee GROUP BY LENGTH(last_name);
添加筛选条件
SELECT COUNT(*) c,LENGTH(last_name) len_name FROM employee GROUP BY LENGTH(last_name) HAVING COUNT(*) >5;
变成别名的查询
SELECT COUNT(*),LENGTH(last_name) len_name FROM employee GROUP BY len_name HAVING c >5;
------------------
按多个字段分组
查询每个部门每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id FROM employee GROUP BY job_id,department_id;
-------------------
查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
SELECT AVG(salary),department_id,job_id FROM employee WHERE department_id IS NOT NULL GROUP BY job_id,department_id HAVING AVG(salary)>10000 ORDER BY AVG(salary) DESC;
用别名简化一下
SELECT AVG(salary) a,department_id,job_id FROM employee WHERE department_id IS NOT NULL GROUP BY job_id,department_id HAVING a>10000 ORDER BY a DESC;
---------------------------
group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数
排序放在整个分组查询的后面

---------------------------
分组查询测试题
1.查询个job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序
SELECT MAX(salary) ,MIN(salary) ,AVG(salary) ,SUM(salary),job_ id
FROM employees
GROUP BY job_ id
ORDER BY job_ id;
2.查询员工最高工资和最低工资的差距
SELECT MAX(salary)-MIN(salary) DUFFERENCE FROM employee;
3.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,每有管理者的员工不计算在内
SELECT
MTN(salary) ,manager_ id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY
manager_id
HAVING MIN(salary) >=6000;
4.查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
SELECT department_id, COUNT(*) ,AVG(salary) a
FROM employees
GROUP BY department_ id
ORDER BY a DESC;
5.选择具有各个job_id的员工人数
SELECT COUNT(*) 个数,job_id FROM employee GROUP BY job_id;

连接查询

----------------

连接查询,也叫多表查询
SELECT * FROM beauty;
SELECT * FROM boys;
--------------------------
笛卡尔乘积:表1有m行,表2有n行 ,结果=m*n行
查询出有男女朋友的
SELECT NAME,boyName FROM boys,beauty WHERE beauty.boyfriend_id=boys_id;
------------------
连接查询按功能分类
内连接:
  等值连接
  非等着连接
  自连接
外连接
  左外连接
  右外连接
  全连接
交叉连接:
--------------------------------

等值连接
查询男神对应的女朋友
SELECT NAME,boyName FROM boys,beauty WHERE beauty.boyfriend_id=boys.id;
----------------
查询员工名对应的部门名
SELECT last_name,department_name FROM employee,departmentWHERE employee.'department_id'=department.'department_id';
-------------------
查询员工名,工种号,工种名
SELECT last_name,employee.job_id,job_title
FROM employee,jobs
WHERE employee.'job_id'=jobs.'job_id';
-----------------
为多表查询的表起别名
查询员工名,工种号,工种名
SELECT last_name,e.job_id,job_title
FROM employee e,jobs j
WHERE e.'job_id'=j.'job_id';
------------------
为表起别名,区分多个重名的字段,精简sql查询语句
为表起别名后,查询的字段就不能再使用原表名字来限定字段,可以用别名来限定字段,或者不限定字段
-----------------
等值连接查询出来的是两个表的交集部分
---------------
查询城市名中第二个字符为o的部门名和城市名
SELECT department_name,rity
FROM department d,location l
WHERE d.'location_id'=l.'location_id'
AND city LIKE '_0%';
----------------------------
查询每个城市的部门的个数
SELECT COUNT(*) 个数,city
FROM department d,location l
WHERE d.lacation_id=l.location_id
GROUP BY city;
-----------------------------
查询出有奖金的每个部门名和部门的领导编号和该部门的最低工资
SELECT department_name,manager_id,MIN(salary)
FROM department d,employee e
WHERE d.department_id=e.department_id
AND commission_pct IS NOT NULL GROUP BY department_name,manager_id;
----------------------------
查询每个工种的工种名和员工的个数并且按员工的个数降序排序
SELECT job_title,COUNT(*)
FROM employee e,jobs j
WHERE e.job_id=j.job_id
GROUP BY job_title
ORDER BY COUNT(*) DESC;
----------------------------
查询员工名,部门名和所在的城市
SELECT last_name,department_name,city
FROM employee e,department d,location l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id
AND city LIKE 's%'
ORDER BY department_name DESC;
----------------------
多表的等值连接:查询的结果是多个表的交集部门,n个表需要n-1个连接条件
查询表的时候给表起一个别名

-----------------------------------------

非等值连接

-

查询员工的工资和工资级别
SELECT salary ,grade_level
FROM employee e,job_grade g
WHERE salary BETWEEN g.lowest_sal AND g.highest_sal ;
--------------
添加排序
SELECT salary ,grade_level
FROM employee e,job_grade g
WHERE salary BETWEEN g.lowest_sal AND g.highest_sal
AND g.grade_level='A';
-----------------------------

自连接查询

查询员工名和上级的名称
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employee e,employee m
WHERE e.manager_id=m.employee_id;

练习题:

1.显示员工表的最大工资,工资平均值
select max(salary),avg(salary) from employee;
2.查询员工表的employee_id,job_id,last_name,按department_id降序,salary升序
select employee_id,job_id,last_name from employee order by department_id desc,salary asc;
3.查询员工表的job_id中包含的a和e的,并且a在e的前面
select job_id from employee where job_id like '%a%e%';
4.已知表student里面有id学号,name.greadeid年级编号
已知表grade里面有id年级号,name年级名
已知表result里面有id,score,studentNo学号
select s.name,g.name,r.score
from student s ,grade g,result r
where s.id=r.r.studentNo
and g.id=s.gradeid;
5.显示当前日期,以及去前后空格,截取字符串的函数
select now();
select trim(字符 from '')
select substr(str,startIndex);
select substr(str,startIndex,length);
-------------------
条件查询 where
排序查询 asc默认的升序排序 desc降序排序
分组查询
连接查询(多个表之间的数据查询)
子查询
分页查询
联合查询

函数,类似于java中的方法,用来提高重用性,隐藏了实现细节保证了安全和去除了工作的难度提高了使用效率
常见的函数:字符函数concat连接 ,substr截取字符串,upper变大写lower表小写,replace替换length获取字节长度,trim去前后空格,lpad左填充,rpad7右填充,instr获取字符串第一次出现的索引
数学函数:ceil 向上取整,round四舍五入,mod取模,floor向下取整,truncate截断,rand0-1之间的随机小数
日期函数:now 返回当前日期和时间,year 返回年,month 返回月,day 返回日,date_format 将日期转换成字符 curdate 返回当前日期,str_to_date将字符串转换成日期,curtime返回当前时间,hour小时,minute分钟,second秒 datediff 返回两个日期相差的天数 monthname 以英文的形式返回月
-------
version 数据库的版本
database 当前打开的数据库
user 当前用户
password
SELECT PASSWORD('名字');
md5 ('需要加密的字符串');
分组函数;max min sum avg count
https://www.bilibili.com/video/av22912367/?p=77

-----------------------------------------

数据类型

常见的数据类型
数值型:整型,小数(定点数,浮点数)
字符型:短文本char,长文本varchar
日期型:
-------------
整型:tinyint:1字节 smallint:2字节 mediumint:3字节 int/integer:4字节 bigint:8字节
--------------------
数据类型约束保证插入数据的正确性
---------------
char 固定长度的字符
varchar 可变长度的字符
set 保存集合
enum 保存枚举
binary和varbinary 用于保存短的二进制
blob 保存长的二进制
text保存长文本
-----------------------
联合查询:
union 将多次查询的结果合并为一个结果
union all 包含了重复项
------------------------------
select 查询列表
from 表名
where 筛选条件
group by 分组列表
having 筛选
order by 排序列表
limit 分页的起始条目的索引,条目数
-------------------------------
DML:数据操纵语言(Data Manipulation Language, DML)插入,修改,删除
插入数据:
insert into 表名(字段名,) values(值,);
insert into 表名(字段名,) values(值,),(值,); 一次插入多行
insert into 表 set 字段=值,字段=值;

修改数据:
updat 表名 set 字段=值,字段=值 where 筛选条件;修改单张表的数据
update 表1 别名 left-right-join 表2 别名
on 连接条件
set 字段=值,字段=值 where 筛选条件; 修过多张表的数据

删除数据:
delete from 表名 where 筛选条件; 删除单张表的数据
级联删除:删除多张表
delete 别名1,别名2 from 表1 别名 inner-left-right-join 表2 别名 on 连接条件 where 筛选条件

truncate table 表名

区别:delete删除后,在插入数据,标识列从断点开始
truncate删除后,在插入数据,标识列从1开始
delete删除可以添加筛选条件
truncate不能添加筛选条件
truncate 没有返回值
delete 可以返回受影响的行数,也就是返回删除了几行
truncate 不能回滚
delete 可以回滚

--------------------------
DDL :数据定义语言DDL :Data Definition Languages
创建数据库:create database if not exists 数据库名 character set 编码类型;
修改数据库:alter database 数据库名 character set 编码类型;
删除数据库:drop database if exists 数据库名;

数据表的管理:
创建数据表:create table if not exists 表名(字段名 字段类型 约束条件 )
修改数据表:alter table 表名 add column 列名 类型 first/after 字段名;
修改列的类型或约束
alter table 表名 modify column 列名 新类型 新约束
修改表列名
alter table 表名 change column 旧的列名 新列名 类型
删除表中的列
alter table 表名 drop column 列名
修改表的名字
alter table 表名 rename to 新表名

删除数据表
drop table if exists 表名
复制表结构
create table 表名 like 旧表
复制表结构及表中的数据
create table 表名 select 查询的列表 from 旧表 where 筛选条件

数据类型:
数值型:整型1 tinyint 2 smallint 3 mediumint 4 int/integer 8 bigint,浮点型(定点型decimal(m,d) 浮点数float(m,d) ,double(m,d) m默认10 d 默认0)
字符型:char固定长度字符 varchar可变长度字符 binary varbinary enum set text blob,
日期型:year 年 date日期 time时间 datetime日期+时间 timestamp 时区日期时间 日期:年月日 时间:时分秒
-----------------------

TCL:事务控制语言

TCL:事务控制语言 Transaction Control Language
事务:一个或一组sql语句组成的执行单元,这个执行单元要么全部执行要么全部不执行,
存储引擎:
事务的ACID属性:
原子性Atomicity 原子性是事务不可分割的工作单位,要么全部执行,要么都不执行
一致性Consistency 从数据库中的一个状态变为另一种状态
隔离性Isolation 事务的执行不受其他事务的干扰,
持久性Durability 事务一旦提交了,对数据库中的数据的改变是永久性的,

原子性:一个事务不可在拆分,要么都执行要么都不执行
一致性:一个事务的执行可使数据从一个一致性状态切换到另一种一致性的状态
隔离性:一个事务的执行不受其他事务的干扰
持久性:一个事务一旦提交,则会永久的改变数据库的数据,不能撤销

事务的创建
隐式事务:事务没有明显的开启和结束的标记,自动的开启和自动的关闭的:insert,update delete语句都是隐式的事务
----------------
显示事务:事务有明显的开启和结束的标记,需要设置事务的自动提交功能为禁用的,set autocommit=0;
------------
开启事务
set autocommit =0;
start transaction;
编写事务中的sql语句
结束事务
提交事务
commit
有意外就回滚事务
rollback
------------------------
开启事务
set autocommit=0;
编写事务的SQL语句
UPDATE account SET balance=500 WHERE username='张无忌';
回滚事务
ROLLBACK;
结束事务
COMMIT;
----------------
脏读:读取到的数据是临时的无效的,
不可重复读:
幻读:针对的是插入和删除

 数据事务的隔离性

事务的隔离级别

 事务的ACID属性

设置隔离级别
set session transaction isolation level read uncommitted;

set session transaction isolation level repeatable read;

set session transaction isolation level serializable;

use 数据库名;
select * from 表名;

rollback; 回滚

事务:一条或多条sql语句组成一个执行单位,这组sql语句要么都执行要么都不执行
事务的特性:acid
A:原子性,一个事务是不可分割的的整体,要么都执行要么都不执行
C:一致性,数据是准确,完整可靠的,事务可以让数据从一个状态切换到另一个状态
I:隔离性,一个事务不受其他事务干扰,多个事务之间相互隔离
D:持久性,一个事务一旦提交了,就永久性的修改了数据库中的数据

隐式的事务:没有明显的开启和结束标志,本身就是一条事务可以自动提交,insert,update,delete语句就是隐式的事务

显示事务:有明显的开启和结束标志
开启事务 set autocommit=0; start transaction;
编写sql语句:增删改查
设置回滚点:savepoint 回滚点名;
结束事务:提交commit,回滚rollback,回滚到指定的地方rollback to 回滚点名;


并发事务:
多个事务同时操作同一个数据库的相同数据时,
脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务更新的数据
不可重复读:一个事务多次读取,结果不一样
幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是其他事务插入的数据

解决事务并发问题:通过设置事务的隔离级别来解决并发问题

事务隔离级别:
read uncommitted 读已提交
read committed 读已提交
repeatable read 可重复读
rerializable 串行化

-----------------------------------------

连接查询

----------------

多行子查询:
in/not in 在列表中的任意一个
any |some 任意的某一个值
all 所有的值
-----------------
子查询:出现在其他语句内部的select语句叫子查询或内查询
子查询的特点:子查询放在括号内,子查询放在条件的右侧
------------------
分页查询:
select 查询列表
from 表
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段
limit offset,size.

解释:offset是要显示条目的起始索引(起始索引从0开始)
size 是要显示的条目数
---------------------
内连接,查询结果是多表的交集
select 查询列表 from 表1 别名
inner join 表2 别名 on 连接条件 where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 分组
---------------------
外连接,查询的结果是主表中所有的行,从表没有匹配的就显示null,长用来查询交集部分的剩余的不匹
配的行
select from 表1 别名
left |right |full join 表2 别名 on 连接条件 where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 分组

左连接 left join 左边的就是主表
右连接 right join 右边的就是主表
全外连接 full join 两边都是主表

-----------------------
子查询:嵌套在其他语句内部的select语句称为子查询或内查询
分页查询:当要查询的数据显示很多,在一页中显示不全的时候用到
select 查询列表 from 表
limit offset ,size;
offset 表示的是显示的起始位置的索引,默认从0开始,size表示的是显示的条数
------------------
联合查询
union 将多条查询语句的结果合并成一个结果
------------------
DML 数据操作语言
插入 insert
修改 update
删除 delete

insert into 表名(列名,) values(值1,)

DDL:数据定义语言

DDL:数据定义语言,针对库和表的管理
对数据库的管理:创建,修改,删除数据库
对数据表的管理:创建create,修改alter,删除数据表drop
-----------
创建数据库:create database 数据库名;
CREATE DATABASE books;
CREATE DATABASE IF NOT EXISTS books;
修改数据库的名字
RENAME DATABASE books TO 新数据库名;
更改数据库的字符集
ALTER DATABASE book CHARACTER SET gbk;
ALTER DATABASE book CHARACTER SET UTF-8;
删除数据库
DROP DATABASE IF EXISTS books;
-----------------
数据库表的管理
数据表的创建
create table 表名( 列名 数据类型)
CREATE TABLE book (id INT,bnameVARCHAR(20),price DOUBLE,auther VARCHAR(20),publishDate DATETIME);
创建作者表
CREATE TABLE author (id INT,au_name VARCHAR(20),nation VARCHAR(10));
查看一下创建的表
DESC author;
---------------------
表的修改
修改列名,修改数据类型或约束,添加新的列,删除列,修改表名,
ALTER TABLE book CHANGE COLUMN publisdate publishDate DATETIME;
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
ALTER TABLE author ADD COLUMN annual DOUBLE;
ALTER TABLE author DROP COLUMN annual ;
ALTER TABLE author RENAME TO books;
alter table 表名 add-drop-modify-change column 列名 数据类型;
-----------------
表的删除)IF EXISTS 不能用在字段中(
DROP TABLE IF EXISTS book;
SHOW TABLES; 查询数据库中的所有表
删除数据库
DROP DATABASE IF EXISTS 旧数据库名;
CREATE DATABASE 新数据库名;

DROP DATABASE IF EXISTS 旧数据表名;
CREATE TABLE 新数据表名;
----------------------------
数据表的复制
只能复制表的结构
CREATE TABLE copy_author LIKE author;
复制表的结构,并复制表的数据
CREATE TABLE copy_author SELECT * FROM author;
复制表结构的时候,复制部分数据
CREATE TABLE copy_author SELECT id,name FROM author WHERE nation='中国';
只要复制表中的某些字段的结构
CREATE TABLE copy_author SELECT id,name FROM author WHERE 1=2;
CREATE TABLE copy_author SELECT id,name FROM author WHERE 0;
-----------------
测试题:
跨数据库复制表的结构
将表department表中的数据插入到新表中、
CREATE TABLE dept SELECT department_id,department_name
FROM 原来数据库名.原来数据库表名(department);
复制表结构(跨数据库复制)
CREATE TABLE emplpyee_newname LIKE 原来数据库名.原来数据库表名;
删除数据库表emp5
DROP TABLE IF EXISTS emp5;
将表employee重命名为emp5
ALTER TABLE employee RENAME TO emp5;
将表中的列last_name的长度增加到50
ALTER TABLE emp5 MODIFY COLUMN last_name VARCHAR(50);
在表emep5中新加一列test_column
ALTER TABLE emp5 ADD COLUMN test_column ;
删除表emp5中的列dept_id
ALTER TABLE emp5 DROP COLUMN dept_id ;

 ----------------------------------------- 

约束

字段的约束:用于限制表中的数据,为了保证表中的数据的一致性(准确性和可靠性)
NOT NULL 非空约束,字段的值不能为空,姓名,学号这些字段不能为空
DEFAULT 默认约束,保证该字段有默认的值,性别
PRIMARY KEY 主键约束,保证该字段的值,具有唯一性,并且非空值,学号和员工编号
UNIQUE 唯一约束,保证该字段的值具有唯一性,但值可以为空,座位号,要么不写,写的话就不要重复
CHECK约束,检查约束,比如性别只能是男或是女,年龄
FOREIGN KEY 外键约束,用于限制两个表的关系,保证该字段的值必须来自于主表关联列的值,在从表中添加外键约束,用于引用主表中某列的值

什么时候添加约束:
创建表的时候、修改表的时候(表中没有任何数据的时候)
列的约束,针对某个字段的约束
表的约束(没有非空和默认) 

-------------

创建表的时候添加约束

USE students;
CREATE TABLE stuinfo(id INT PRIMARY KEY ,主键
stuName VARCHAR(20) NOT NULL,非空
gender CHAR(1) CHECK(gender='男' OR gender='女'),检查约束
seat INT UNIQUE,唯一约束 每个学生只有一个座位
age INT DEFAULT 18 ,默认约束,年龄不指定的话默认是18、
majorId INT foreign major(id) 外键
)

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

主键肯定是非空的
查看表的结构:DESC 表名
查看表中的索引:SHOW INDEX FROM 表名
------------------
添加表级约束,设置键约束的时候可以给键约束起个别名
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 ch CHECK(gender='男' OR gender='女'),检查约束
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) 外键
)

查看一下约束都是否已经添加进去
SHOW INDEX FROM 表名
------------------------
通用的写法:
CREATE TABLE IF NOT EXISTS sutinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20) NOT NULL,
sex CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE,
majorid INT,
CONSTRAINT fk_stuinfo_major FORGIGN KEY(majorid) REFERENCES major(id)
)

唯一约束在一个表中可以有多个
主键约束在一个表中最多可以有1个
主键一定不能为空值
唯一键可以为空值

表中的两个字段可以组合成为主键
PRIMARY KEY(id,stuname)组合主键
表中的两个字段可以组合成为唯一键
UNIQUE(seat,seat2) 组合唯一键

主表中的关联列是主键或是唯一键
插入数据时,应先插入主表在插入从表中
删除数据时,应先删除从表再删除主表中的
一个字段可以有多个约束:
----------------------------- 

修改表的时候添加约束

添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL ;
添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
添加主键
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
添加唯一约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
ALTER TABLE stuinfo ADD UNIQUE(seat);
添加外键
ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);
ALTER TABLE stuinfo ADD fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
-------------------

修改表时删除约束

删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
删除主键约束
ALTER TABLE stuinfo DROP PRIMARY KEY;
删除唯一键
ALTER TABLE stuinfo DROP INDEX seat;
删除外键约束
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

练习题
1.向表emp2中的id列添加PRIMARY KEY约束(my_emp_id_pk)
ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY;
ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pl PRIMARY KEY(id);
2.向表中emp2的id列中添加列dept_id ,并在其中定义FOREIGN KEY 约束 与之关联的是dept2中的id列
ALTER TABLE emp2 ADD COLUMN dept_id INT;
ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_dept2 FOREIGN KEY(dept_id) REFERENCES dept2(id);

 标识自动增长的列

标识列,也叫自动增长列,可以不用手动插入值,系统会提供默认的序列值
创建表时设置标识列
DROP TABLE IF EXISTS tab;
CREATE TABLE tab(
id INT PRIMARY KEY AUTO_INCREMENT, 自动增长
name VARCHAR(20)
)
向id中插入数据
INSERT INTO tab VALUES(NULL,'john')

向表中插入数据一次增加3
SET auto_increment_increment=3;
defined 有明确定义的
一张表最多可以有一个自动增长的标识列
标识列的类型必须是数值型
标识列可以通过:SET auto_increment_increment=3; 来设置步长
标识列可以通过向表中手动插入列的某个值来设置标识列的起始值

---------------
修改表时设置自动增长列
ALTER TABLE tab MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
修改表时删除自动增长
ALTER TABLE tab MODIFY COLUMN id INT PRIMARY KEY;

常见的约束:
not null 非空,该字段的值必填
unique 唯一,表示该字段的值不能重复
default 默认
check 检查约束
primary key 主键,不可重复,非空
foreign key 外键,引用了另外表的字段

主键与唯一的区别:一个表只能有一个主键,但可以有多个唯一,主键不能为空,唯一键可为空,
主键与唯一的相同:都具有唯一性
delete与truncate 删除的区别

外键:用于限制两个表的关系,引用列类型一样,名称无要求,删除数据的时候,先删除从表
删除外键:alter table 表名 drop foreign key 主键名
查看一下表结构中的外键
show index from 表名

添加外键:
alter table 表名 add constraint 外键的索引名字 foreign key(外键的字段列名) references 表(字段列名);
级联删除
alter table 表名 add constraint 外键的索引名字 foreign key(外键的字段列名) references 表(字段列名) on delete cascade;
或者:
alter table 表名 add constraint 外键的索引名字 foreign key(外键的字段列名) references 表(字段列名) on delete set null;

自动增长的列默认从1开始,每次增长1
设置自动增长的值:set auto_increment_increment=值;
一张表只能有一个自动增长的列,自增长列只支持数值类型

字段名 字段类型 约束 auto_increment

修改表时:alter table 表名 modify column 字段名 字段类型 约束 auto_increment
删除自动增长列
alter table 表名 modify column 字段名 字段类型 约束

视图

视图占用较小的内存
表 保存的是实际的数据占用较多物理空间

视图是虚拟的表,是从真实表中组成的虚拟表,临时表
创建视图:
create view 视图名 as 查询的sql语句;

视图:实现了SQL语句的重用,保护数据提高了安全性,

修改视图:
create or replace view 视图名 as 查询语句;

方式二:
alter view 视图名 as 查询语句;

删除视图:
drop view 视图名,视图名 ;

查看视图:
SHOW TABLE STATUS Like '视图名' G;

show create view 视图名;

查看表
desc 表名;

在视图表中插入数据
insert into 视图名 values('值1','值2');
在视图中修改数据
update 视图名 set 字段=值 where 条件;
删除数据
delete from 视图名 where 条件;

视图一般不能做增删改,视图通常用来做查询的

创建一个book表
bid 整型,主键
bname 字符型,唯一键,非空
price 浮点型,默认是10
btypeId 类型编号,引用的是bookType表的id字段

bookType表,有字段id,name


create table Book(
bid int primary key,
bname varchar(20) unique not null,
price float default 10,
btypeId int,
foreign key(btypeid) references bookType(id)
);

开启事务,并插入一条数据后,结束
set autocommit=0;
insert into book(bid,bname,price,btypeId) values(1,'值1',100,1);
rollback;

创建视图,查询价格大于100的书名和类型名
create view 视图名 as
select bname,name from book b join bookType t on b.btypeid=t.id where price>100;

删除创建的视图
derop view 视图名

视图:一张逻辑存在的虚拟表,它的数据来自于数据库中真实的表,通过执行的sql语句动态生成的一张临时虚拟表
提高了sql的重用性,保护了原始表的数据,提高了安全,简化了sql语句的编写

创建视图
create view 视图名 as 查询语句;

视图的修改:
create or replace view 视图名 as 查询语句;
或者:
alter view 视图名 as 查询语句

删除视图
drop view 视图名;

查看视图
desc 视图名;
show create view 视图名;

-----------------------------------

MySQL中的变量:

系统变量:变量由系统提供的,不用自定义
1.全局变量 :服务器层面上的,针对整个服务器的,必须拥有super权限才能为系统变量赋值,作用域为整个服务器,针对于所有的连接和会话有效,
2.会话变量 :服务器为每一个连接的客户端提供了系统变量,作用域为当前的连接和会话

查看系统变量:
show global|session variables like ''; 如果没有声明global还是session,则默认是session
查看指定的系统变量的值:
select @@global|session.变量名; 如果没有显示声明global还是session,则默认是session
为系统变量赋值:
set global|session 变量名=值;
set @@global.变量名=值; 为全局变量赋值
set @@变量名=值; 为局部变量赋值


=================>>
自定义变量:
1.用户变量 :作用域针对于当前的连接和会话有效,可以放在任何位置,
声明的时候赋值:
set @变量名=值;
set @变量名:=值;
select @变量名:=值;

更新变量的赋值
set @变量名=值;
set @变量名:=值;
select @变量名:=值;

select xx into @变量名 from 表;

变量的使用:
select @变量名;

2.局部变量:作用域:仅仅在定义它的代码块中有效或是begin end 中有效,且只能放在第一句
使用:
1.声明:declare 变量名 类型 默认值;
2.赋值或更新值
set 变量名=值;
set 变量名:=值;
select @变量名:=值;
select xxx into 变量名 from 表;
3.使用
select 变量名;

变量的使用:赋值和查看
================================

MySQL存储过程:

类似与java中的方法,将一组完成特定功能的逻辑语句包装起来,对外暴露名字
1.提高了重用性
2.sql语句简单
3.减少了与服务器的连接次数,提高了效率

存储过程的创建
create procedure 存储过程名(参数模式 参数名 参数类型)
begin
存储过程体
end

解释:
参数模式:in输入, out输出, inout 既作输入又作输出,in可以省略不写
存储过程体:存储过程体中的每一条sql语句都需要用分号结尾


存储过程的调用:
call 存储过程名(实参列表)

查看存储过程:
show create procedure 存储过程名;

删除存储过程:
drop procedure 存储过程名;

===================

MySQL函数

函数的创建:
create function 函数名(参数名 参数类型) returns 返回类型
begin
函数体
end


其中函数体中必须要有return语句

函数的调用:
select 函数名(实参列表);

函数的查看:
show create function 函数名;

函数的删除:
drop function 函数名;
-------------

流程控制结构:

顺序结果:程序从上往下依次执行

分支结构:程序按条件进行执行,从两条或多条路径中选择一条执行

循环结果:程序在满足一定条件下,重复执行一组语句
==============
if 函数:用来实现简单的双分支

if(条件,值1,值2)
----------
case结构:用来实现多分支

case 表达式或字段
when 值1 then 语句1;
when 值2 then 语句2;

else
end;


case
when 条件1 then 语句1;
when 条件2 then 语句2;

else
end;

-----------------
if 结构:实现多分支

if 条件1 then 语句1;
elseif 条件2 then 语句2;

else 语句;
end if;
--------------------------
循环结构:只能放在begin end中
1.while
名称 while 循环条件 do
循环体
and while ;

2.loop
loop
循环体
end loop ;

3.repeat
repeat
循环体
until 结束条件
end repeat ;

连接查询

内连接:inner
外连接:
左外链接:left outer
右外连接:right outer
全外连接:full outer

内连接:
select 查询列表 from 表 表名,inner join 表 别名 on 连接条件
内连接分为:等值连接,非等值连接,自连接

-----------------------------
两张表的连接查询
三张表的连接查询
---------------------
内连接 inner
外连接:左外连接left,右外连接 right,全外连接 full

交叉连接 cross join

where 筛选条件
group by 分组
having 筛选条件
order by 排序列表
-------------------------
外连接一般应用于:查询一个表中有,另一个表没有的记录
外连接的查询结果是主表中的所有记录,如果从表中有和它匹配的,则
显示匹配的值,如果从表中没有和它匹配的,则显示null
外连接查询的结果=内连接结果+主表中有而从表中没有的记录

左外连接:left 左边的是主表
右外连接:right join 右边的是主表
左外和右外交换两个表的顺序,可以实现同样的效果
---------------

显示表的结构:
desc 需要显示的表名

删除表中的数据:
delete from 表名 where 删除条件

--------------
多表的删除:
delete 表1的别名,表2的别名 from 表1 别名,表2 别名
where 多表的连接条件
and 筛选条件
-------------------
非等值连接:
自连接:
外连接:
===========
外连接:用于查询一个表中有,而另一个表中没有记录
1.外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表中没有记录
2.左外连接:left join 左边的是主表
右外连接:right join 右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果

需要查询的信息主要来自哪个表,就是主表
--------------
全外连接=内连接的结果+表1中有但表2中没有的+表2中有但表1中没有的
----------
交叉连接:cross join

 内连接

 左外连接                

右外连接

其他连接

老师好可爱,我好喜欢她呀,学完好爽

别扭,老实

看到别人看不到的东西,找到自己的灵感

学霸就是那种嘴上说空余时间不学习,其实背地里学的比谁都认真的人,学习和读书这件事情是需要刻苦认真努力的

----------------------------------------

原文地址:https://www.cnblogs.com/GaoNa/p/9855307.html