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;