MySQL基础学习1(重在语法理解)

MySQL基本学习1

学习地点:Bilibili(BV12b411K7Zu)

!!基础重在理解语法,反正面试基本也不会考

MySQL数据库的一个实例可以同时包含多个数据库(每条命令结束后加分号),不区分大小写

MySQL语句注释:使用“#”或者“–”,多行注释使用“/* */”

如果使用cmd登MySQL:
1.启动,停止,登录,退出MySQL

net start 服务名 #启动mysql
net stop 服务名 #停止mysql
mysql[-h 主机号 -P 端口号] -u 用户名 -p 密码 #登录
exit #退出

2.查询数据库:

show databases;
show CREATE DATABASE 数据库名; #查看创建库的信息

3.用户需要创建新的数据库:

create database [IF NOT EXISTS]数据库名;
create database 数据库名 character set GBK/UTF-8/…; #指定编码
show variables like ‘character%’; #查看编码

4.删除指定数据库:

drop database 数据库名;

5.进入数据库:

use 数据库名;
select database(); #查看当前选择的数据库
select version(); #查看版本

6.查询数据库下数据表:

show tables;
show tables from 数据库名 #在当前数据库下查询指定数据库名数据表
select database(); #查看当前库

7.查看指定数据表的表结构(查看该表有多少列,每列的数据类型等信息):

desc 表名;

MySQL语法规范:
1.不区分大小写,建议关键字大写,表名、列名小写。
2.每条命令最好用分号结尾。
3.每天命令根据需要,可以进行缩进或换行。

安装SQLyog。。。。

mysql的语言类型:
1.DQL(data query language):数据查询语言
2.DML(data manipulation language):数据操作语言
3.DDL(data defination language):数据库定义语言
4.DCL(data control language):数据库控制语言
5.TCL:事务

DQL

1.基础查询

Tips:查询时建议先进入表所在的库中。(use myemployees;)

1.1查表中单个字符

SELECT 字符名 FROM 表名

1.2查表中的多个字符

SELECT 字符名,字符名 FROM 表名

1.3查表中全部字符

SELECT * FROM 表名(*表所有,同JAVA)

1.4查询常量值(100)

SELECT 100;

1.5查询字符、字符串(MySQL不区分字符和字符串,统一用单引号括起来)

SELECT ‘John’;

1.6查询表达式

SELECT 98*100;

1.7查询函数

SELECT version();

1.8起别名

SELECT 98*100 AS 结果;
SELECT 字符名 AS 别名,字符名 AS 别名 FROM 表名;

Tips1:其实AS可以省略
Tips2:别名如果容易混淆,建议加个双引号把别名括起来

1.9去重

SELECT DISTINCT 字符名 FROM 表名

1.10+号的作用
在JAVA中,+号有两个作用(1.运算符 2.拼接符)
而MySQL中的+号只有一个作用就是起到一个运算的作用

当两边都是数值型,则做加法运算

SELECT 100+90; #190;

当一边为字符型数值是,会试图将字符型数值转换成数值型
当转换成功后,就直接做加法运算

SELECT ‘123’+90; #213

当转化失败时,字符型数值直接置为0,然后做加法运算

SELECT ‘a’+90; #90

当有一边为null时,结果必为null

SELECT null+90; #null

1.11拼接字符串(CONCAT(str1,str2))

SELECT CONCAT(‘a’,‘b’); #ab

1.12【补充】isnull函数

SELECT ISNULL(VERSION()); #0

功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0

2.条件查询

基本语法:

select
		查询列表
from 	
		表名
where	
		筛选条件

执行顺序是:312,先看库中有没有表,在通过筛选条件,最后查询

分类:
1.按条件表达式筛选

条件运算符:> < = <> 	#<>表示不等的意思。。

2.按逻辑表达式筛选

逻辑运算法:&&  ||  !
	      and or not

3.模糊查询

like
between and
in
is null

#-------------------------------------------------------------------------------------------------------------------

2.1按条件表达式筛选

案例一:查询工资>15K的员工有哪些

SELECT 
		*
FROM
		employees
WHERE
		salary>15000;

案例二:查询部门编号不等于90号的员工名和部门编号

SELECT
		CONCAT(`first_name`,`last_name`),
		department_id
FROM
		employees
WHERE
		department_id<>90;

案例三:查询部门编号为100号的员工名和年薪

SELECT 
		last_name,
		salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
		employees
WHERE
		employee_id = 100;

Tips:IFNULL(str,int); #当str中的值为null时,将他替换成int。

2.2按逻辑表达式筛选

#案例1:查询工资在10k到20k之间的员工名、工资、奖金

SELECT
		CONCAT(`first_name`,`last_name`),
		salary,
		commission_pct
FROM
		employees
WHERE	
		salary>=10000
AND	
		salary<=20000;

案例2:查询部门编号不是在90-110之间,或者工资高于15000的员工信息

SELECT
		*
FROM
		employees
WHERE
		NOT(department_id>=90 AND department_id<=110) OR salary>15000;

2.3模糊查询
2.3.1 LIKE(配合通配符使用,检索字符)
案例一:查询员工名中包含字符a的员工信息

SELECT
		*
FROM
		employees
WHERE
		last_name LIKE '%a%'; 

%表示任意多个字符(包括0个,比如abc它也能查出来)

案例二:查询员工名中第三个字符为n的,第五个字符为l的员工名和工资

SELECT
		last_name,
		salary
FROM
		employees
WHERE
		last_name LIKE '__n_l%';

_表示任意单个字符

案例三:查询员工名中第二个字符为_的员工名

SELECT
		last_name
FROM
		employees
WHERE
		last_name LIKE '_a_%' ESCAPE 'a';

escape 'a’表示声明a字符为转义字符,起转义功能

Tips:‘%%’会不会检索出null值呢?
‘%%’会直接排除掉null值

经典面试题:
SELECT * FROM employees;
SELECT * FROM employees WHERE commission_pct LIKE ‘%%’ AND last_name LIKE ‘%%’;
这两个输出的表一样吗?

奖金中可能有null值,commission_pct LIKE '%%'会直接将null值剔除,故不同

#-------------------------------------------------------------------------------------------------------------------

2.3.2.BETWEEN AND(类似于>=&&<=)
案例一:查询员工编号在100-120之间的所有的员工信息

SELECT
		*
FROM
		employees
WHERE 
		employee_id BETWEEN 100 AND 120;

Tips:
1.使用between and可以提高语句的简洁度
2.包含临界值
3.值不能颠倒顺序(>=100&&<=120的缩写)

#-------------------------------------------------------------------------------------------------------------------

2.3.3 IN (用于判断某字段的值是否属于in列表中的某一项)
案例三:查询员工的工种编号是AD_VP,IT_PROG,AD_PRES中的一个员工名和工种编号

SELECT
		last_name,
		job_id
FROM
		employees
WHERE
		job_id IN('AD_VP','IT_PROG','AD_PRES');

Tips:
1.提高语句简洁度
2.in列表中的值类型必须一致或兼容
3.in列表不支持通配符

#-------------------------------------------------------------------------------------------------------------------
2.3.4 IS NULL/IS NOT NULL(专门用来判断null值的)
#Tips:=和<>不能判断null值

案例一:查询没有奖金的员工名和奖金率

SELECT
		last_name,
		commission_pct
FROM
		employees
WHERE
		commission_pct IS NULL;

安全等于 <=>,可以查询null值,也可以用于普通值的判断
最大的缺点:可读性差。。

SELECT
		last_name,
		commission_pct
FROM
		employees
WHERE
		commission_pct <=> NULL;

is null 和 <=>的区别:
IS NULL:仅仅可以判断NULL值,可读性高,建议用这个。
<=>:既可以判断NULL值,又可以判断普通的数值,可读性较低。

Tips:这个可读性我着实有点不太理解,,等什么时候理解了回来解释。

3.排序查询

语法:

select
	查询列表
from
	表
[where	
	筛选条件]
order by
	排序列表[asc|desc]

Tips:order by的位置一般放在查询语句的最后(除limit语句之外)

案例1:查询员工信息,要求工资从高到低排序(降序)

Tips:不写的话默认升序(asc)

SELECT	
		*
FROM
		employees
ORDER BY 
		salary DESC;

案例2:查询部门编号>=90的员工信息,按入职时间的先后顺序进行排序

SELECT
		*
FROM
		employees
WHERE
		department_id >=90
ORDER BY 
		hiredate;

案例3:查询员工的信息和年薪按年薪的高低【按表达式排序】【按别名排序】

Tips:order by支持别名

SELECT
		*,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
		employees
ORDER BY 
		年薪 DESC;

案例4:按姓名的长度显示员工的姓名和工资【按函数排序】

SELECT
		LENGTH(last_name) 字节长度,last_name,salary
FROM
		employees
ORDER BY 
		字节长度 DESC;

案例5:查询员工信息,要求先按工资排序,再按员工编号排序

SELECT
		*
FROM
		employees
ORDER BY
		salary ASC,employee_id DESC;

4.常用函数

• 字符函数
• 数学函数
• 日期函数
• 其他函数【补充】
• 流程控制函数【补充】

4.1 字符函数

4.1.1 upper()、lower(); 大小写控制函数:

SELECT UPPER('john');			#JOHN
SELECT LOWER('JOHN');			#john

4.1.2 length(); 获取参数值的字节长度
UTF8:一个汉字占3个字节
GBK:一个汉字两字节

SELECT LENGTH('张三丰哈哈哈');		#18

4.1.3 concat(); 拼接字符串

SELECT CONCAT(‘acd’,'_',‘bbc’) ;		#acd_bbc

4.1.4substr();截取字符
Tips:注意MySQL索引是从1开始的

截取从这个索引开始的字符

SELECT SUBSTR('我想去吃麻辣火锅',5) AS out_put;		#麻辣火锅

截取两个指定索引之间的长度

SELECT SUBSTR('我想去吃麻辣火锅',1,4) AS out_put;		#我想去吃

4.1.5 instr();返回字符串最开始的出现的索引,找不到返回0

SELECT INSTR('杨不悔爱上了殷六侠','殷六侠') AS out_put;		#7

4.1.6 trim(); 去除空格

SELECT LENGTH(TRIM('    杨不悔    '));		#9(说明只剩杨不悔了)

去除字符串中的指定字符
Tips:不能去除中间的,只能去除两边的

SELECT TRIM('a' FROM 'aaa杨aaa不悔aaa')		;#杨aaa不悔

4.1.7 lpad()、rpad();左右填充函数
用指定字符实现左填充

SELECT LPAD('殷素素',6,'*');		#***殷素素

用指定字符实现右填充

SELECT RPAD('殷素素',6,'*');		#殷素素***

4.1.8 replace(); 替换

SELECT REPLACE('张无忌爱上了周芷若','周芷若','赵敏');		#张无忌爱上了赵敏

#-----------------------------------------------------------------------------------------------------

4.2 数学函数

4.2.1 round(); 四舍五入

SELECT ROUND(11.5);	#12
SELECT ROUND(-11.5);	#-12
SELECT ROUND(1.467,2);	#1.47(小数点后两位)

4.2.2 ceil(); 向上取整(返回>=该参数的最小整数)

SELECT CEIL(11.5);	#12
SELECT CEIL(-11.5);	#-11

4.2.3 floor(); 向下取整(返回<=该参数的最大整数)

SELECT FLOOR(-9.99);		#-10

4.2.4 truncate() 截断

SELECT TRUNCATE(1.609009,2);		#1.60

4.2.5 mod 取余
MOD(a,b) : a-a/b*b

SELECT MOD(10,3);		#1	
SELECT MOD(-10,3);		#-1
SELECT MDO(-10,-3);	#-1

Tips:看被除数,被除数为正结果就为正,为负结果就为负

#-----------------------------------------------------------------------------------------------------

4.3 日期函数

4.3.1 now 返回当前系统日期+时间

SELECT NOW();		#2020-07-25 20:42:32

4.3.2 curdate 返回当前系统日期,不包含时间

SELECT CURDATE();		#2020-07-25

4.3.3 可以获取指定的部分,年月日时分秒

SELECT YEAR(NOW()) AS 年;		#2020
SELECT MONTHNAME(NOW()) 月;		#July (英文版月份)

4.3.4 str_to_date 将日期格式的字符转换成指定格式的日期

SELECT STR_TO_DATE('17-5-1997','%d-%m-%Y');	#1997-5-17

案例: 查询入职日期为1992-4-3的员工信息

SELECT * FROM employees WHERE hiredate = '1992-4-3';
SELECT * 	FROM employees WHERE hiredate = STR_TO_DATE('4-3-1992','%m-%d-%Y');

在这里插入图片描述

4.3.4 date_format: 将日期转换成字符

SELECT DATE_FORMAT(NOW(),’%m月-%d日-%Y年’); #07月-25日-2020年

案例:查询有奖金的员工名和入职日期(xx月/xx日/xx年)

SELECT 
		last_name,
		DATE_FORMAT(hiredate,'%m月/%d日/%Y年')	入职日期
FROM
		employees
WHERE
		commission_pct IS NOT NULL;

#-----------------------------------------------------------------------------------------------------

4.4 其他函数(较少使用)

4.4.1 version(); 查看版本号

SELECT VERSION();

4.4.2 database(); 查看当前数据库

SELECT DATABASE();	

4.4.3 user(); 查看当前用户

SELECT USER();

#-----------------------------------------------------------------------------------------------------

4.5 流程控制函数

4.5.1 if函数:起着类似if else 的效果

形式类似于三元运算符

SELECT IF(10>5,'大','小');		#大

案例:查询有没有奖金

SELECT 
		last_name,
		commission_pct,
		IF(commission_pct IS NULL,'没奖金好惨','有奖金嘻嘻')
FROM
		employees;

4.5.2 case函数的使用

一、switch case的效果

JAVA中的switch_case常用于等值判断

switch(变量或者表达式){
case 常量1: 语句1; break;

default: 语句n; break;
}

mysql中case语句的语法形式:

case 要判断的字段或者表达式
when 常量1 then 要显示的值1或者语句1;

else 要显示的值n或语句n;
end

案例:查询员工的工资,要求
部门号=30,显示的工资为1.1倍
部门号=40,显示的工资为1.2倍
部门号=50,显示的工资为1.3倍
其他部门,显示原工资

SELECT
		salary,
		department_id,

CASE department_id	
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资

FROM
		employees;

二、类似于java中的多重if

JAVA中的多重if常用于区间判断

if(条件1){
语句1;
}else if(条件2){
语句2;
}

else{
语句n;
}

mysql中的case语法:

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
		employees;

#-----------------------------------------------------------------------------------------------------

5.分组查询

5.1分组函数
功能:用作统计函数,又称为聚合函数或统计函数或组函数

分类:
sum() 求和
avg() 平均值
max() 最大值
min() 最小值
count() 计算个数

特点:
1.sum,avg一般用于处理数值型
max,min,count可以处理任何类型

2.是否忽略null值
以上分组函数都忽略null值

3.可以和distinct搭配去重?
以上分组函数都可以搭配dsitinct去重

4.和分组函数一同查询的字段有限制
是group by后的字段

5.1.1简单使用

单个函数使用
SELECT SUM(salary) FROM  employees;
SELECT AVG(salary) FROM  employees;
SELECT MAX(salary) FROM  employees;
SELECT MIN(salary) FROM  employees;	
SELECT COUNT(salary) FROM  employees;	


多种数据一同查询
SELECT 
		SUM(salary) 和,
		AVG(salary) 平均值,
		MAX(salary) 最大值,
		MIN(salary) 最小值,
		COUNT(salary) 个数
FROM 	
		employees;

5.1.2 参数支持哪种类型
说明sum,avg不适合用来存放字符值

SELECT SUM(last_name), AVG(last_name)FROM employees;	#结果为0,没有意义

max,min,count基本所有类型都支持

SELECT MAX(last_name),MIN(last_name) FROM employees;
SELECT MAX(hiredate),MIN(hiredate) FROM employees;
SELECT COUNT(commission_pct) FROM employees;

5.1.3 能搭配distinct去重吗?
都可以

SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;
SELECT AVG(DISTINCT salary),AVG(salary) FROM employees;
SELECT MIN(DISTINCT salary),MIN(salary) FROM employees;
SELECT MAX(DISTINCT salary),MAX(salary) FROM employees;
SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees;

5.1.4.count()函数介绍

SELECT COUNT(*) FROM employees;	#用来统计行数
SELECT COUNT(1) FROM employees;	#count()可以加个常量值,可以用来统计行数。

效率:
MYISAM(以前)存储引擎下,count()的效率高
INNNDB(默认)存储引擎下,count(
)和count(1)的效率差不多
所以建议统计行数用count(*)来统计行数

做道例题:查询员工表中的最大入职时间和最小入职时间的相关天数(diffrence)

SELECT
		MAX(hiredate),
		MIN(hiredate),
		DATEDIFF(MAX(hiredate),MIN(hiredate)) AS diffrence
FROM
		employees;

#-----------------------------------------------------------------------------------------------------

6.连接查询

含义:又称多表查询,当查询的字段来自多个表时,就会用到连接查询
按年份分类:

SQL92标准:仅仅支持内连接
SQL99标准(推荐):支持内连接+外连接(左外和右外)+交叉连接

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

92就不讲了
#sql99语法

语法:
	select	查询列表
	from	表1	别名	【连接类型】
	join	表2	别名
	on	 连接条件
	【where	筛选条件】
	【group by 分组】
	【having 筛选条件】
	【order by 排序列表】

分类:
内连接(*):inner
外连接:	左外:left[outer]
			右外:right[outer]
			全外:full[outer]
交叉连接:cross

一、内连接

语法:
select	查询列表
from 	表1	别名
inner join	表2	别名
on	连接条件

分类:
1.等值连接
	2.非等值连接
3.自连接

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

1.等值连接

案例:查询名字中包含e的员工名和工种名

SELECT last_name,job_title
FROM employees e
INNER JOIN jobs j
ON j.`job_id`=e.`job_id`
WHERE e.`last_name` LIKE '%e%';

2.非等值连接

查询工资级别的个数>20的个数,并且按工资级别降序

SELECT COUNT(*),grade_level
FROM 	employees e
JOIN	job_grades g
ON	e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`
GROUP BY grade_level
HAVING COUNT(*)>20
ORDER BY grade_level DESC;

3.自连接

查询姓名中包含字符K的员工名字和上级名字

SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m
ON e.`manager_id`=m.`employee_id`
WHERE e.`last_name` LIKE '%k%';

二、外连接:
应用场景:用于查询一个表中有,另一个表中没有的记录

特点:
1.外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录

2、左外连接,left join左边的是主表
右外连接,right join右边的是主表

3、左外和右外交换两个表的顺序,可以实现同样的效果
4、全外连接=内连接的结果+表1中有但表2中没有+表2中有但表1中没有

案例:查询哪个部门没有员工

#左外
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;

#右外
SELECT d.*,e.employee_id
FROM employees e
RIGHT OUTER JOIN departments d
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;

全外用不了。。

交叉连接
#就是99标准的笛卡尔乘积

SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;(11*4)

#-----------------------------------------------------------------------------------------------------

7.子查询

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

分类:
按子查询出现的位置:

select后面:仅仅支持标量子查询

from后面:支持表子查询

where或having后面:1.标量子查询 2.列子查询 3.行子查询(用的较少)

exists后面(相关子查询):支持表子查询

按结果集的行列数不同:

标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集可以有多行多列或一行多列)
表子查询(无所谓,一般为多行多列)

一、where或having后面
1、标量子查询(单行子查询)
2、列子查询(多行子查询)
3、行子查询(多列多行)

特点:
1.子查询放在小括号内
2.子查询一般放在条件右侧
3.标量子查询,一般搭配着单行操作符使用

< >= <= = ><

列子查询,一般搭配多行操作符使用
in、any/some、all

4.子查询的执行优先于主查询执行
主查询的条件用到了子查询的结果

案例:返回公司工资最少的员工的last_name,job_id和salary

#①查询公司的最低工资
SELECT MIN(salary)
FROM employees;

#②查询last_name,job_id和salary=①(代入进来)
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);

#2.列子查询(多行子查询)

案例1:返回location_id是1400或1700的部门中的所有员工姓名

#①先查询location_id =1400,1700的部门编号

SELECT department_id
FROM departments
WHERE location_id IN(1400,1700)

#②查询员工姓名,要求部门号是①中的某一个(代入进来)

SELECT last_name
FROM employees
WHERE department_id IN (

	SELECT department_id
	FROM departments
	WHERE location_id IN(1400,1700)
);

行子查询(结果集为一行多列或多行多列)

#案例:查询员工编号最小并且工资最高的员工信息

SELECT *
FROM employees
WHERE (employee_id,salary)=(
	SELECT MIN(employee_id),MAX(salary)
	FROM employees

);

二、在select后面(标量子查询)

案例:查询每个部门的员工个数()

SELECT d.*,(
	SELECT COUNT(*)
	FROM employees e
	WHERE e.`department_id`=d.`department_id`
) 个数
FROM departments d;

三、from后面;将子查询结果充当一张表

#案例:查询每个部门的平均工资的工资登记

#①查询每个部门的平均工资和部门id

SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;

#②实现两表的连接

SELECT ag_dep.*,g.`grade_level`
FROM (
	SELECT AVG(salary) ag,department_id
	FROM employees
	GROUP BY department_id 
) AS ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN `lowest_sal`AND`highest_sal`;

#-----------------------------------------------------------------------------------------------------

8.联合查询

union 联合 合并:将多条查询语句的结果合并成一个结果

语法:
查询语句1
union
查询语句2

特点:
1、要求多条查询语句的查询列数是一致的!
2、要求多条查询语句的查询的每一列的类型和顺序是一致的
3、union关键字默认去重,如果使用union all 可以包含重复项

案例:查询部门编号>90或邮箱中包含a的员工信息(其实就是查询两次合并)

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

DML

数据操作语言:
插入:insert
修改:update
删除:delete

一、插入语句

特点:
1.插入的值的类型要与列的类型一致或兼容

2.不可以为null的列必须插入值,可以为null的列如何插入值?
#1、填null
#2、列名不写就行了

3.列的顺序是否可以调换?
#可以(值要对应)

4.可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致

经典插入

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

案例:往女神表中插入唐艺昕

INSERT INTO beauty(id,NAME,sex,borndate,phone,photo,boyfriend_id)
VALUES(13,'唐艺昕','女','1990-4-23','189888888',NULL,2);

插入方式二

语法:
insert into 表名
set 列名=值,列名=值,…

案例:往女神表中插入刘涛

INSERT INTO beauty
SET id=16,NAME='刘涛',phone='999';

两种方式区别:
1、方式一支持插入多行、方式二不支持
2、方式一支持子查询,方式二不支持

二、修改语句

1、修改单表的记录(!!)

语法:
update 表名
set 列=新值,列=新值,…
where 筛选条件;

2、修改多表的记录

sql92语法:

update 表1 别名,表2 别名
set 列=值,…
where 连接条件
and 筛选条件;

sql99语法:

update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 列=值,…
where 筛选条件;

1.修改单表的记录

案例1:修改beauty表中姓唐的女神的电话为13899889898

UPDATE beauty SET phone = '13899889898'
WHERE NAME LIKE '唐%';

2.修改多表的记录

案例:修改张无忌的女朋友的手机号为12593

UPDATE boys bo
INNER JOIN beauty b 
ON bo.`id` = b.`boyfriend_id`
SET b.`phone`='12593'
WHERE bo.`boyName`='张无忌';

三、删除语句

方式一:delete
语法:
1、单表的删除
delete from 表名 where 筛选条件

2、多表的删除

方式二:truncate table 表名;

方式一:detele
1.单表的删除
案例:删除手机号以9结尾的女神信息

DELETE 
FROM beauty
WHERE phone LIKE '%8';

2.多表删除(涉及多表的都要多表连接)
案例:删除张无忌的女朋友信息

DELETE b
FROM beauty b
INNER JOIN boys bo
ON b.`boyfriend_id`=bo.`id`
WHERE bo.`boyName`='张无忌';

方式二、truncate语句(清空删除,准备跑路)

delete和truncate的区别:

1.delete可以加where条件,truncate不能加

2.truncate删除,效率高一丢丢

3.假如要删除的表中有自增长列,
如果用delete删除后,再插入数据,自增长列的值从断点开始,
而truncate删除后,再插入数据,自增长列的值从1开始
就是说truncate类似于清除痕迹

4.truncate删除没有返回值(0行受影响)
delete删除有返回值(n行受影响)

5.truncate删除不能回滚,delete删除可以回滚

DDL

数据定义语言

库和表的管理

一、库的管理
创建、修改、删除

二、表的管理
创建、修改、删除

创建:create
修改:alter
删除:drop

之前学的是对数据的操作!!(select,insert,delete,update)

一、库的管理

1、库的创建

语法:
create datebase (if not exists)库名;

#案例:创建库Books

CREATE DATABASE IF NOT EXISTS Books;

#2.库的修改(基本不修改!!)

RENAME DATABASE books TO 新库名(被废弃了)

#更改库的字符集

ALTER DATABASE books CHARACTER SET gbk;

#3、库的删除

DROP DATABASE IF EXISTS books;

二、表的管理

1、表的创建
语法:
create table 表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
。。。
列名 列的类型【(长度) 约束】,、

#案例:创建表book

CREATE TABLE book(
	id INT,#编号
	bName VARCHAR(20),#图书名
	price DOUBLE,#价格
	authorId INT,#作者
	publishDate DATETIME#出版日期
);

2.表的修改
语法:
alter table 表名 add/drop/modify/change column 列名 【列类型 约束】;

#1.修改列名

ALTER TABLE book
CHANGE COLUMN publishDate pubDate DATETIME;

#2.修改列的类型或约束

ALTER TABLE book 
MODIFY COLUMN pubdate TIMESTAMP;

#3.添加新列

ALTER TABLE author 
ADD COLUMN annual DOUBLE;

#4.删除列

ALTER TABLE author
DROP COLUMN annual;

#5.修改表名

ALTER TABLE author 
RENAME TO book_author;

3.表的删除

DROP TABLE IF EXISTS book_author;
SHOW TABLES;

4.表的复制

#1.仅仅复制表的结构

CREATE TABLE copy LIKE author;

#2.复制表的结构+数据

CREATE TABLE copy2
SELECT * FROM author;

#3.只复制部分数据

CREATE TABLE copy3
SELECT id,au_name
FROM author
WHERE nation='中国';

#4.仅仅复制部分结构

CREATE TABLE copy4
SELECT id,au_name
FROM author
WHERE 1=2;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值