参考我的安装mysql的博客
远程连接
mysql -h localhost -P 3306 -u root -p
h-host-主机
P-Port-端口号
u-user-用户
p-password-密码
如果登陆本机可以省略掉-h和-P内容即:
mysql -u root -p
\p
或者exit
参考我的安装mysql的博客
show databases;
use 库名;
show tables;
create table 表名(
列名 列类型,
列名 列类型,
...
);
dasc 表名;
select version();
方式二:不登录到mysql服务端
mysql --verson
#或
mysql --v
参考我的博客:sequel Pro的安装和使用
语法:select 查询列表 from 表名;
特点:
11. 查询列表可以是:表中的字段、常量值、表达式、函数
12. 查询的结果是一个虚拟的表格
语法:
SELECT 列表名 FROM 表名;
语法:
SELECT 列表名1 , 列表名2 , 列表名3 FROM 表名;
语法:
SELECT * FROM 表名;
USE 库名
语法:
SELECT 100;
SELECT 'ironman';#(字符串放入单引号)
语法:
SELECT 100%98 ;#相当于查询2
语法:
SELECT VERSION();
好处:
AS
关键字SELECT 字段 AS 别名;
例:
SELECT 200%98 AS 结果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
SELECT 字段 别名;
例:
SELECT 200%98 结果;
在起别名的时候如果别名中有特殊符号应用双引号将别名引起来。
例:
SELECT last_name AS "ming zi" FROM employees;
DINSTINCT
语法:
SELECT DISTINCT 字段名 FROM 数据库;
例:
SELECT DISTINCT department_id FROM employees;
作用:作为运算符使用
其中一方为字符型,试图将字符型树脂转换成数值型,如果转换成功则做加法运算,如果转换失败,则将字符型转换成0。如果其中一方为null则结果为null
例:
SELECT 100+90; #查询190
SELECT '123'+10 #查询133;
SELECT 'hello'+10 #查询10;
SELECT null+10; #查询null
语法:
DESC 表名;
语法:
CONNCAT(列名1,列名2,列名3,.....);
例子:
SELECT CONCAT(first_name,last_name) AS 姓名 FROM employees;
注意事项:如果拼接的内容中有null
则全部为null
。
语法:
SELECT IFNULL(列名,当列的内容为空时替换的内容);
例子:
SELECT IFNULL(num,0); #如果num储存的内容为空则输出时替换为0
语法:
SELECT ISNULL(列名);
例子:
SELECT ISNULL(num); #如果num储存的内容为null则替换为1,不为null则替换为0
SELECT 查询列表 FROM 表名 WHERE 筛选条件;
条件运算符:
>,<,=,<>,>=,<=(大于,小于等于,不等于,大于等于,小于等于)
例子:
SELECT * FROM employees WHERE salary>12000;#查询工资大于12000的员工信息
SELECT last_name ,department_id FROM employees WHERE department_id<>90;#部门编号不等于90号的员工名和部门编号
逻辑运算符:
and,or,not(也支持&&,||,!)
例子:
SELECT last_name,salary FROM employees WHERE salary>=10000 and salary<=20000#查询工资在10000到20000之间的员工名和工资
语句:
like,between and,in,is null
一般与通配符搭配使用。
通配符:
%
包涵任意0个或多个字符
_
包涵任意单个字符
例子:
SELECT * FROM employees WHERE last_name LIKE '%a%';#查询员工名中包涵字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE '__a_b%';#查询员工中第三个字符为a,第五个字符为b的员工名
SELECT * FROM employees WHERE last_name LIKE '_\_%';#查询员工中第二个字符为下划线的员工名
SELECT * FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';#查询员工中第二个字符为下划线的员工名
ESCAPE后接定义为转意符的符号
例子:
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120; #查询员工编号在100-120之间的员工信息
等价于
SELECT * FROM employees WHERE employee_id>=100 AND employee_id<=120; #查询员工编号在100-120之间的员工信息
特点:
例子:
SELECT last_name,job_id FROM employees WHERE job_id IN ('IT_RPOT','AD_VP','AD_RPES');#查询员工的工种编号是IT_RPOT,AD_VP,AD_RPES其中之一的员工名和工种编号
等价于
SELECT last_name,job_id FROM employees WHERE job_id='IT_RPOT' OR job_id='AD_VP' OR job_id='AD_RPES';#查询员工的工种编号是IT_RPOT,AD_VP,AD_RPES其中之一的员工名和工种编号
注意事项:
例子:
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL;#查询没有奖金的员工名和员工率
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;#查询有奖金的员工名和员工率
SELECT last_name,commission_pct FROM employees WHERE commission_pct <=> NULL;#查询没有奖金的员工名和员工率
缺点:可读性差
语法:
SELECT 查询列表 FROM 表 [WHERE 筛选条件] ORDER BY 排序列表[ASC|DESC]; #ASC升序,DESC降序
例子:
SELECT * FROM employees ORDER BY salary DESC;#查询员工信息,工资由高到低排序
SELECT * FROM employees WHERE department_id>=90 ORDER BY hiredate ASC;#查询部门编号大于等于90,按入职先后排序
注意事项:ASC可以省略
例子:
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;#按年薪高低现实员工信息和年薪
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY 年薪 DESC;#按年薪高低现实员工信息和年薪
例子:
SELECT LENGTH(last_name) AS 字节长度,last_name,salary FROM employees ORDER BY LENGTH(last_name) DESC; #按照员工姓名长度排序
例子:
SELECT * FROM employees ORDER BY salary ASC,employee_id DESC;#查询员工信息,要求先按照工资排序,再按员工编号排序
limit
子句除外概念:类似于java中的方法。
优点:
SELECT 函数名(实参列表) [FROM 表];
分类:单行函数:主要用作处理;分组函数(统计函数):用做统计。
LENGTH
SELECT LENGTH('字符') ;#查询参数值字节个数
UPPER,LOWER
SELECT UPPER('abc'); #将字符改为大写
SELECT LOWER('abc');#将字符改为小写
例子:
SELECT CONCAT(UPPER(last_name),'_',LOWER(first_name)) AS 姓名 FROM employees;#将姓小写,名字大写输出
SUBSTR,SUBSTRING
注意:sql中索引值从1开始
SELECT SUBSTR('字符',索引值,[索引长度]); #返回索引值开始的字符
例子:
SELECT SUBSTR('TomandJarry',7,5); #返回jarry
INSTR
SELECT INSTR('被索引字符','索引字符') ;#返回索引字符第一次出现在被索引字符的位置,如未找到,则返回0
例子:
SELECT INSTR('TomAndJarry','And') ;# 返回4
TRIM
SELECT TRIM(['a' FROM]'字符串'); #去除字符串首位特定字符,如果不写默认去空格
例子:
SELECT TRIM('a' FROM 'aaaaTomaaaaaa'); #输出Tom
LPAD
SELECT LPAD('字符',长度,'填充字符');#用指定字符实现左填充字符至指定长度,如果字符本身长度大于指定的长度,则截断。
例子:
SELECT LPAD('字符',10,'填充'); #输出:填充填充填充填充字符
SELECT LPAD('字符',1,'填充'); #输出:字
RPAD
SELECT RPAD('字符',长度,'填充字符');#用指定字符实现右填充字符至指定长度,如果字符本身长度大于指定的长度,则截断。
例子:
SELECT RPAD('字符',10,'填充'); #输出:字符填充填充填充填充`
SELECT RPAD('字符',1,'填充'); #输出:字
REPLACE
SELECT REPLACE('字符','被替换字符','替换字符');#将字符中被替换字符替换成替换字符
例子:
SELECT REPLACE('TomAndJarry','Jarry','Dog');#输出:TomAndDog
ROUND
SELECT ROUND(数值,位数);#将数值四舍五入至指小数点后几位数
例子:
SELECT ROUND(3.14); #输出3`
SELECT ROUND(-3.14); #输出3`
SELECT ROUND(3); #输出3`
SELECT ROUND(3.1415,3); #输出3.142
CEIL
SELECT CEIL(数值);#向上取整
例子:
SELECT CEIL(3.14);#输出4`
SELECT CEIL(-3.14);#输出-3`
SELECT CEIL(1.00);#输出1
FLOOR
SELECT FLOOR(数值);#向下取整
例子:
SELECT FLOOR(3.14);#输出3`
SELECT FLOOR(-3.14);#输出-4`
SELECT FLOOR(1.00);#输出1
TRUNCATE
SELECT TRUNCATE(数值,截断位数);#讲述值在小数点后n位截断
例子:
WLECT TRUNCATE(3.1415,2);#输出3.14
MOD
SELECT MOD(数值1,数值2); #取余
例子:
SELECT MOD(10,3); #输出1`
SELECT MOD(10,0); #输出null
NOW
SELECT NOW(); #返回系统当前日期+时间
CURDATE
SELECT CURDATE(); #返回系统当前日期,不包含时间
CURTIME
SELECT CURTIME(); #返回系统当前时间,不包含日期
YEAR、MONTH、MONTHNAME、DAY、HOUR、MINUTE
SELECT YEAR(NOW());#打印出当前的年份`
SELECT MONTH(NOW());#打印出当前的月份`
SELECT MONTHNAME(NOW());#打印出当前的月份的英文
STR_TO_DATE
日期格式符:
%Y | 四位的年份 |
%y | 两位的年份 |
%m | 月份(01,02,03) |
%c | 月份(1,2,3) |
%d | 日(01,02,03) |
%H | 小时(24小时制) |
%h | 小时(12小时制) |
%i | 分钟(00,01,02) |
%s | 秒(00,01,02) |
SELECT STR_To_DATE('字符型日期','指定的格式');#将将指定的格式字符型日期转换成日期类型
例子:
SELECT STR_TO_DATE('02-08-2020','%m-%d-%Y');#输出2020-02-08
DATE_FORMAT
SELECT DATE_FORMAT(日期,'指定的格式');#将日期转换成将指定的格式字符型日期
例子:
SELECT DATE_FORMAT('2020/02/08','%Y年%m月%d日');#输出2020年02月08日
VERSON
SELECT VERSON(); #显示当前数据库版本号
DATABASE
SELECT DATABASE(); #查看当前库
USER
SELECT USER(); #查看当前用户
IF
SELECT IF(条件表达式,式子1,式子2); #成立返回式子1,不成功返回式子2
例子:
SELECT(10>5,'是','否‘); #返回是
CASE
使用方式:
CASE 要判断的字段或者表达式
WHEN 常量1 THEN 要显示的值1或者语句1
WHEN 常量2 THEN 要显示的值2或者语句2
...
ELSE 常量n THEN 要显示的值n或者语句n
END;
例子:
SELECT salary AS 原始工资 ,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;
#查询员工工资,要求:
#部门号等于30,显示的工资为原来的1.1倍
#部门号等于40,显示的工资为原来的1.2倍
#部门号等于50,显示的工资为原来的1.3倍
#其他部门工资为原工资。
CASE
WHEN 条件1 THEN 如果条件1满足执行的语句1
WHEN 条件2 THEN 如果条件2满足执行的语句2
...
ELSE 如果所有条件都不满足执行的语句
END;
例子:
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>20000 THEN 'B'
WHEN salary>20000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM employees;
#查询员工工资情况
#如果工资大于20000,显示A级别
#如果工资大于15000,显示B级别
#如果工资大于10000,显示C级别
都则显示D级别
特点:
函数 | 支持的参数类型 | 功能 | null是否参与运算 |
---|---|---|---|
SUM | 数值型 | 求和 | 否 |
AVG | 数值型 | 平均值 | 否 |
MAX | 数值和字符型 | 最大值 | 否 |
MIN | 数值和字符型 | 最小值 | 否 |
COUNT | 任何类型 | 非空个数 | 否 |
DISTINCT
搭配运算SELECT COUNT(DISTINCT salary),COUNT(DISTINCT salary) FROM employees;#输出30 60,30为去重后
语法
语法:
SELECT SUM(参数) FROM employees;
例子:
SELECT SUM(参数) FROM employees;#统计salary的和
语法:
SELECT AVG(参数) FROM employees;
例子:
SELECT AVG(salary) FROM employees;#统计salary的平均值
语法:
SELECT MAX(参数) FROM employees;
例子:
SELECT MAX(salary) FROM employees;#统计salary的最大值
语法:
SELECT MIN(参数) FROM employees;
例子:
SELECT MIN(salary) FROM employees;#统计salary的最小值
语法:
SELECT COUNT(参数) FROM employees;
例子:
SELECT COUNT(salary) FROM employees;#统计salary的非空个数
SELECT COUNT(*) FROM employees;#统计表的总行数
SELECT COUNT(常量值) FROM employees;#额外增加常量值的列后统计行数
注意事项:COUNT(*)
效率最高.
语法:
SELECT 分组函数,列(要求出现在GROUP BY后面)
FROM 表
[WHERE 筛选条件]
GROUP BY分组的列表
[HAVING 条件]
[ORDER BY 子句];
#查询列表必须特殊,要求是分组函数和group by后出现的字段
#分组列表可以是函数或者表达式
#HAVING用于在查询结果后筛选
例子:
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;#查询每个工种的最高工资
SELECT AVG(salary),department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;#查询邮箱中包含a字符的,每个部门的平均工资
SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;#查询有奖金的领导手下员工的最高工资
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;#查询哪个部门的员工个数大于2
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000
ORDER BY MAX(salary) ASC;#查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资,最高工资由小到大排序
用处:当数据存于不同表的时候进行查询
SELECT 列1,列2 FROM 表1,表2;#不可取会出现问题。
#出现笛卡尔积现象:表1有m行,表2有n行,结果等于m*n行
#发生原因:没有有效的连接条件
语法:
语法:
SELECT 列1,列2 FROM 表1,表2 WHERE 条件;
例子:
SELECT last_name,department_name
FROM employees,departments
WHERE employees.`department_id`=departments.`department_id`;
#查询员工名对应的部门名
注意事项:
例子:
SELECT salary,grade_level
FROM employees,job_grades
WHERE salary BETWEEN job_grades.`lowest_sal`AND job_grades.`highest_sal`;
#查询工资和对应的工资等级
例子:
SELECT e.employee_id,e.first_name,m.employee_id,m.first_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;
#查询员工名和上级的名称
语法:
SELECT 查询列表
FROM 表1 [别名] [连接类型]
JOIN 表2 [别名]
ON 连接条件
[WHERE 筛选条件]
[GROUP BY 分组]
[HAVING 筛选条件]
[ORDER BY 排序列表]
INNER
例子:
SELECT last_name,department_name
FROM departments d
INNER JOIN employees e
ON e.`department_id`=d.`department_id`;
#查询员工名、部门名
#查询员工名、部门名、工种名,并按部门名降序(添加三表连接)
SELECT last_name,department_name,job_title
FROM employees e
INNER JOIN departments d ON e.`department_id`=d.`department_id`
INNER JOIN dobs j ON e.`job_id`=j.`job_id`
ORDER BY department_name DESC;
例子:
#查询工资级别>20的个数,并按工资级别降序
SELECT COUNT(*),grade_level
FROM employees e
INNER JOIN job_grades g
ON e.`salary` BETWEEN g.`lowest_sal` AND g.`hightest_sal`
GROUP BY grade_level
HAVING COUNT(*)>20
ORDER BY grade_level DESC;
例子:
#查询员工和其上级名字
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m
ON e.`manager_id` = m.`employee_id`;
特点:
LEFT JOIN
左边的是主表RIGHT JOIN
右边的是主表LEFT[OUTER]
例子:
#查询女生对应的男朋友
SELECT b.name,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.`id`;
#查询没有男朋友的女生
SELECT b.name
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.`id`
WHERE bo.`id` IS NULL;
RIGHT[OUTER]
例子:
#查询女生对应的男朋友
SELECT b.name,bo.*
FROM boys bo
LEFT OUTER JOIN beauty b
ON b.`boyfriend_id` = bo.`id`;
#查询没有男朋友的女生
SELECT b.name
FROM boys bo
LEFT OUTER JOIN beauty b
ON b.`boyfriend_id` = bo.`id`
WHERE bo.`id` IS NULL;
CROSS
例子:
#使用99语法标准实现笛卡尔乘积
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;
FULL[OUTER]
语法:
#效果相当于左外+右外
SELECT b.*,bo.*
FORM beauty b
FULL OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.id;
定义:出现在其他语句中的SELECT
语句称之为子查询(内查询)
外部的查询语句称之为主查询(外查询)
例子:
SELECT first_name FROM employees WHERE department_id IN(
SELECT department_id FROM departments WHERE location_id=1700
);
分类:
SELECT
后面FROM
后面WHERE
或HAVING
后面EXISTS
后面(相关子查询)SELECT
后面例子:
#查询每个部门的员工个数
SELECT d.*,(
SELECT COUNT(*)
FROM employees e
WHERE e.`department_id` = d.`department_id`
)FROM departments d;
例子:
#查询员工号=102的部门名
SELECT (
SELECT department_name
FROM departments d
INNER JOIN employees e
ON d.department_id = e.department_id
WHERE e.employee_id =102
) 部门名;
FROM
后面#查询每个部门的平均工资的工资等级
SELECT ag_dep.*,g.`grade_level`
FROM (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
)ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
WHERE
或HAVING
后面特点:
操作符 | 含义 |
---|---|
IN/NOT IN | 等于列表中的任意一个 |
ANY/SOME | 和子查询返回的某一个值比较 |
ALL | 和子查询返回的所有值比较 |
例子:
#谁的工资比 Abel 高?
SELECT *
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
例子:
#返回公司工资最少的员工的last_name,job_id,salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
例子:
#查询最低工资大于50号部门最低工资的部门id及其最低工资
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM employees
WHERE department_id='50'
);
注意事项:
字查询结果必须一行一列
例子:
#返回location_id是1400或1700中所有员工的姓名
SELECT last_name
FROM employees
WHERE department_id IN(
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700)
);
例子:
#返回其他工种中比job_id为`IT_RPOG`部门任意工资低的员工的:工号、姓名、job_id、salary。
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ANY(
SELECT salary
FROM employees
WHERE job_id='IT_PROG'
) AND job_id <>'IT_PROG';
例子:
#查询员工编号最小并且工资最高的员工信息
SELECT *
FROM employees
WHERE (employee_id,salary)=(
SELECT MIN(employee_id),MAX(salary)
FROM employees
);
EXISTS
后面(相关子查询)语法:
EXISTS (完整的查询语句);
#结果1或0
例子:
#查询有员工的部门名
SELECT department_name
FROM departments d
WHERE EXISTS(
SELECT *
FROM employees e
WHERE d.`department_id` = e.`department_id`
);
语法:
SELECT 查询列表
FROM 表
[JOIN TYPE] [JOIN 表2]
[ON 连接条件]
[WHERE 筛选条件]
[GROUP BY 分组字段]
[HAVING 分组后的筛选]
[ORDER BY 排序]
LIMIT offset,size;#offest要显示的条目的其实索引(0开始),size显示要显示的条目个数
例子:
#查询第11-25条信息
SELECT * FROM employees LIMIT 10,15;
例子:
#查询有奖金的人,并且工资较高的前10名显示出来
SELECT * FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC
LIMIT 10;
UNION
联合查询语法:
#将多条查询语句的结果合并成一个结果
#多用于查询结果是来自于不同没有关系的表中
查询语句1
UNION [ALL]
查询语句2
UNION [ALL]
...
查询语句n
注意事项:
UNION
关键字默认去重,使用UNION ALL
不去重例子:
#查询部门编号>90或邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id > 90;
例子:
#热点搜索(多数据查询同一个关键词)
#查询中国用户中男性的信息以及外国用户中年男性的用户信息
SELECT id,cname,csex FROM t_ca WHERE csex='男'
UNION
SELECT t_id,tName,tGender FROM t_ua WHERE tGender='male';
INSERT
语法:
INSERT INTO 表名(列名,...) VALUES(值1,...)
注意事项:
null
的列必须插入值#插入一个人的信息
INSERT INTO beauty(id,NAME,sex,borndate,phone,photo,boyfriend_id)
VALUES(13,'q','女','1990-4-23','18989898989',NULL,2);
null
的列必须插入值,可以为NULL
的列如何插入值例子:例子:
#直接插入`null`
INSERT INTO beauty(id,NAME,sex,borndate,phone,photo,boyfriend_id)
VALUES(13,'q','女','1990-4-23','18989898989',NULL,2);
例子:
#列名也不写
INSERT INTO beauty(id,NAME,sex,borndate,phone,boyfriend_id)
VALUES(13,'q','女','1990-4-23','18989898989',2);
INSERT INTO beauty
VALUES(13,'q','女','1990-4-23','18989898989',NULL,2);
语法:
INSERT INTO 表名
SET 列名=值,列名=值...;
例子:
INSERT INTO beauty
SET id=19,NAME='刘涛',phone=999;
经典插入 | 简洁插入 | |
---|---|---|
多行插入 | ✅ | ❌ |
子查询 | ✅ | ❌ |
UPDATE
语法:
UPDATE 表名
SET 列=新值,列=新值...
WHERE 筛选条件;
例子:
#修改beauty中姓唐的电话号改为119
UPDATE beauty
SET phone='119'
WHERE NAME LIKE '唐';
例子:
例子:
语法:
UPDATE 表1 别名,表2 别名
SET 列=值,....
WHERE 连接条件
AND 筛选条件;
语法:
UPDATE 表1 别名
INNER|LEFT|RIGHT JOIN 表2 别名
ON 连接条件
SET 列=值,...
WHERE 筛选条件;
例子:
#修改张无忌女朋友的手机号为119
UPDATE boys bo
INNER beauty b ON bo.`id`=b.`boyfriend_id`
SET b.`phone`='119'
WHERE bo.`boyName`='张无忌';
例子:
#修改没有男朋友的女朋友的男朋友为2
UPDATE boys bo
RIGHT beauty b ON bo.`id`=b.`boyfriend_id`
SET b.`boyfriend_id`=2
WHERE bo.`id` IS NULL;
DELETE
语法:
DELETE FROM 表名 WHERE 筛选条件
例子:
#删除手机号以9结尾的女生信息
DELETE FROM beauty WHERE phone LIKE '%9';
语法:
DELETE 表1的别名,表2的别名
FROM 表1 别名,表2 别名
WHERE 连接条件
AND 筛选条件
语法:
DELETE 表1的别名,表2的别名
FROM 表1 别名
INNER|LEFT|RIGHT JOIN 表2 别名 ON 连接条件
WHERE 筛选条件
例子:
#删除刘德华的女朋友的信息
DELETE b
FROM beauty b
INNER JOIN boys bo ON b.`boyfrinend_id` = bo.`id`
WHERE bo.`boyName`='刘德华';
TRUNCATE
语法:
TRUNCATE TABLE 表名;
例子:
#清空boys表
TRUNCATE TABLE boys;
DELETE | TRUNCATE |
---|---|
可以加WHERE 筛选 |
不可以加WHERE 筛选 |
效率低 | 效率高 |
删除自增长列后插入数据,自增长的列的值从断点开始 | 删除自增长列后插入数据,自增长的列的值从1开始 |
有返回值 | 无返回值 |
可以回滚 | 不可以回滚 |
CREAT
语法:
CREATE DATABASE [IF NOT EXISTS] 库名;
例子:
#创建图书库
CREATE DATABASE books;
例子:
#books库如果不存在创建,如果存在不创建
CREATE DATABASE IF NOT EXISTS books
ALTER
语法:
#更改字符集
ALTER DATABASE 库名 CHARACTER SET 字符集名称;
DROP
语法:
DROP DATABASE [IF EXISTS] 库名;
例子:
#删除books库
DROP DATABASE IF EXISTS books;
CREAT
语法:
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列的类型[长度(约束)],
列名 列的类型[长度(约束)],
列名 列的类型[长度(约束)],
...
)
例子:
#创建表book
CREATE TABLE book(
id INT ,#编号
bName VARCHAR(20),#图书名
price DOUBLE,#价格
authorId INT,#作者编号
publishDate DATETIME #出版日期
);
例子:
#创建作者表
CREATE TABLE author(
id INT,
au_name VARCHAR(20),
nation VARCHAR(20)
);
ALTER
语法:
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 列的类型;
例子:
#修改publishDate 为 pubDate
ALTER TABLE book CHANGE COLUMN publishDate pubDate DATETIME;
语法:
ALTER TABLE 表名 MODIFY COLUMN 列名 列类型;
例子:
#修改book表中pubdate的类型为TIMESTAMP
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
语法:
ALTER TABLE 表名 ADD COLUMN 列名 列类型;
例子:
#在author表中添加列 annual 类型为DOUBLE;
ALTER TABLE author ADD COLUMN annual DOUBLE;
语法:
ALTER TABLE 表名 DROP COLUMN 列名;
例子:
#删除author表中annual列
ALTER TABLE author DROP COLUMN annual;
语法:
ALTER TABLE 旧表名 RENAME TO 新表名;
例子:
#修改表author名为 book_author
ALTER TABLE author RENAME TO book_author;
DROP
语法:
DROP TABLE 表名;
例子:
#删除表book
DROP TABLE book;
语法:
CREATE TABLE 复制后的表名 LIKE 被复制的表;
例子:
#复制author表并命名为copy
CREATE TABLE copy LIKE author;
语法:
CREATE TABLE 复制后的表名 SELECT 列名 FROM 被复制的表;
例子:
#复制author的所有数据到copy表
CREATE TABLE copy SELECT * FROM author;
语法:
CREATE TABLE 复制后的表名 SELECT 想复制的结构的列名1,想复制的结构的列名2... FROM 被复制的表 WHERE 0;
例子:
#复制author表的id,au_name 两个列的结构到copy表
CREATE TABLE copy SELECT id,au_name FROM author WHERE 0;
整数类型 | 字节 | 范围 |
---|---|---|
TinyInt | 1 | 有符号:-128~127 无符号:0~255 |
SamallInt | 2 | 有符号:-32768~32767 无符号:0~65535 |
MediumInt | 3 | 有符号:-8388608~32767无符号:0~1677251 |
Int、Integer | 4 | 有符号:-2147483648~2147483647无符号:0~4294967295 |
BigInt | 8 | 有符号:-9223372036854775808~9223372036854775807无符号:0~9223372036854775807*2-1 |
注意事项:
ZEROFILL
语法:
CREATE TABLE 表名(
列1 INT,#有符号
列2 INT UNSIGNED #无符号
);
浮点数 | 字节 |
---|---|
float | 4 |
double | 8 |
定点数 | 字节 |
---|---|
DEC(M,D)|DECIMAL(M,D) | M+2 |
特点:
字符串类型 | 最多字符数 | 描述及存储需求 |
---|---|---|
char | M(可以省略默认为1) | M为0~255之间的整数 |
varchar | M(不可以省略) | M为0~65535之间的整数 |
text | ||
blob(二进制) |
特点:
char
代表固定长度字符varchar
代表可变长度字符char
比varchar
效率高关键字 | 类型 |
---|---|
binary | 包含二进制字符串 |
varbinary | 不包含二进制字符串 |
Enum | 枚举类型 |
Set | 类似枚举,不过可以一次插入多个 |
日期和时间类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
date | 4 | 1000-01-01 | 9999-12-31 |
datetime | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
timestamp | 4 | 19700101 080001 | 2038年某一刻 |
time | 3 | -838:59:59 | 838:59:59 |
year | 1 | 1901 | 2155 |
特点:
含义:用于限制表中的数据,为了保证添加到表中的数据准确可靠
约束类型 | 关键字 | 作用 | 是否支持列级约束 | 是否支持表级约束 |
---|---|---|---|---|
非空约束 | NOT NULL |
用于保证字段的值不能为空。例如学号、姓名 | ✅ | ❌ |
默认约束 | DEFAULT |
用于保证该字段由默认值。例如性别 | ✅ | ❌ |
主键约束 | PRIMARY |
用于保证该字段具有唯一性,并且非空。例如学号 | ✅ | ✅ |
唯一约束 | UNIQUE |
用于保证该字段具有唯一性,可以为空。 | ✅ | ✅ |
外键约束 | FOREIGN KEY |
用于保证该字段的值必须来自主表的关联列的值 | ❌ | ✅ |
检查约束(Mysql不支持) | CHECK |
检查插入数据是否符合特定约束 | ✅ | ✅ |
语法:
CREATE TABLE 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
);
主键约束和唯一约束的对比:
保证唯一性 | 是否允许为空 | 一个表中存在多少 | 是否允许组合 | |
---|---|---|---|---|
主键约束 | ✅ | ❌ | 至多1个 | ✅ |
唯一约束 | ✅ | ✅ | 多个 | ✅ |
外键的特点:
注意事项:
5. 创建表或者修改表时添加约束
例子:
CREATE TABLE stu(
id INT PRIMARY KEY,#主键
stuName VARCHAR(20) NOT NULL,#非空
gender CHAR(1) CHECK(gender='男',gender='女'),#检查
seat INT UNIQUE,#唯一
age INT DEFAULT 18 #默认约束
);
语法
CREATE TABLE 表名(
列名 类型,
列名 类型,
列名 类型,
...
列名 类型,
[CONSTRAINT 约束名] 约束类型(字段名);
);
例子:
CREATE TABLE stu(
id INT,
stuName VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
mijorid INT,
CONSTRAINT uq UNIQUE(seat),
CONSTRAINT ck CHECK(gender='男',gender='女),#检查
CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES mojor(id)#外键
);
语法
ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 新约束;#列级约束
ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型(字段名) [外键的引用];
例子
ALTER TABLE stu MODIFY COLUMN stuname VARCHAR(20) NOT NULL;#添加非空约束
ALTER TABLE stu MODIFY COLUMN age INT DEFAULT 18;#添加默认约束
ALTER TABLE stu MODIFY COLUMN id INT DEFAULT KEY;#添加主键约束
ALTER TABLE stu ADD MODIFY KEY(id);#添加主键约束
ALTER TABLE stu MODIFY COLUMN seat INT UNIQUE;#添加唯一约束
ALTER TABLE stu ADD UNIQUE(seat);#添加唯一约束
ALTER TABLE stu ADD FOREIGN KEY(majorid) REFERENCES major(id);#添加外键约束
ALTER TABLE stu MODIFY COLUMN stuname VARCHAR(20) NULL;#删除非空约束
ALTER TABLE stu MODIFY COLUMN age INT;#删除默认约束
ALTER TABLE stu MODIFY COLUMN id INT;#删除主键约束
ALTER TABLE stu DROP PRIMARY KEY;#删除主键约束
ALTER TABLE stu DROP INDEX seat;#删除唯一约束
ALTER TABLE stu DROP FOREIGN KEY majorid;#删除外键约束
特点:
AUTO_INCREMENT
一定是一个KEYSET auto_increment_increment=n
设置步长语法
CREATE TABLE 表名(
列名 类型 KEY AUTO_INCREMENT
);
例子:
CREATE TABLE tab(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
语法
ALTER TABLE 表名 MODIFY COLUMN 列名 类型 KEY AUTO_INCREMENT;
例子:
ALTER TABLE tab MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
事务:一个或一组SQL语句组成的一个执行单元,这个执行单元中每个SQL语句相互依赖,这个执行单元要么全部执行,要么全部不执行,如果执行错误,整个单元将会回滚。
存储引擎:用于mysql中用不同存储技术在文件中,通过SHOW ENGINES
来查看存储引擎。其中innodb引擎支持事务。
SELECT
、INSERT
、UPDATE
、DELETE
等SET AUTOCOMMIT =0
。语法:
SET AUTOCOMMIT=0;#设置自动提交关闭
[START TRANSACTION;]#开始事务
编写事务的sql语句
语句1;
语句2;
...
COMMIT;#提交事务
ROLLBACK;#回滚事务
例子:
#张飞转账给李白
SET AUTOCOMMIT = 0;
START TRANSACTION;
UPDATE account SET balance =500 WHERE username = '张飞';
UPDATE account SET balance =1000 WHERE username = '李白';
COMMIT;#成功COMMIT失败ROLLBACK
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题
可能会导致的问题:
隔离级别:
隔离级别 | 描述 | Oracle是否支持 | Mysql是否支持 |
---|---|---|---|
READ UNCOMMITTED (读未提交数据) |
允许事务读取未被其他事务提交的变更。脏读、不可重复读、幻读的问题都会出现 | ❌ | ✅(默认) |
READ COMMITED (读已提交数据) |
只允许事务读取已经被其他事务提交的变更。可以避免脏读,但不可重复读和幻读的问题可能出现 | ✅ (默认) | ✅ |
REPEATABLE READ (可重复读) |
确保事务可以多次从一个字段读取相同的值。在这个事务持续期间,禁止其他事务对这个字段进行更新。可以避免脏读和不可重复读,但幻读的问题仍然存在 | ❌ | ✅ |
SERIALIZABLE (串行化) |
确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入更新和删除操作。所有并发问题都可以避免,但性能低下 | ✅ | ✅ |
语法
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;
例子:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;#读未提交数据
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;#读已提交数据
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;#可重复读
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;#串行化
语法:
SAVEPOINT 节点名;#设置节点
ROLLBACK TO 节点名;#回滚至保存点
含义:表的投影。
优点:
语法:
CREATE VIEW 视图名
AS 查询语句;
例子:
#查询姓名中包含a字符的员工名、部门名和工种信息
CREATE VIEW myv1
AS
SELECT last_name,department_name,job_title
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN jobs j ON j.job_id = e.job_id;
语法:
SELECT 列名 FROM 视图名 WHERE 查询条件;
例子:
#查询姓名中包含a字符的员工名、部门名和工种信息
SELECT * FROM myv1 WHERE last_name LIKE '%a%';
语法:
#如果存在则修改,不存在就创建
CREATE OR REPLACE VIEW 视图名
AS 查询语句;
语法:
ALTER VIEW 视图名
AS 查询语句;
语法:
DROP VIEW 视图名,视图名...;
语法:
DESC 视图名;#方式一
SHOW CREATE VIEW 视图名;#方式二
语法:
CREATE OR REPLACE VIEW 视图名
AS
新的查询语句;
不允许更新的视图:
DISTINCT
、GROUP BY
、HAVING
、UNION
、UNION ALL
SELECT
中包含子查询JOIN
WHERE
子句的子查询饮用了FROM子句中的表创建语法的关键字 | 是否占用物理空间 | 使用 | |
---|---|---|---|
视图 | CREATE VIEW |
基本没有 | 主要用于查询 |
表 | CREATE TABLE |
占用 | 增删改查 |
DELETE
和TRUNCATE
在事务使用时的区别TRUNCATE
不支持回滚,DELETE
支持回滚
含义:变量由系统提供,不是用户定义,属于服务器层面。
作用域:服务器每次启动将为所有全局变量赋初值,针对所有会话(链接)有效,但不能夸重启。
语法:
#查看所有系统变量
SHOW [SESSION] VARIABLES;#查看会话变量
#查看满足某种条件的部分系统变量
SHOW [SESSION] VARIABLES LIKE '%char%';#查看会话变量
#查看指定的某个系统变量的值
SELECT @@[SESSION].系统变量名;#查看会话变量
#为某个系统变量赋值
SET [SESSION] 系统变量名 = 值;#会话变量
SET @@[SESSION].系统变量名 = 值;#会话变量
作用域:仅仅针对于当前会话(连接)有效,每次服务器启动会为每个客户端赋初值。
语法:
#查看所有系统变量
SHOW GlOBAL VARIABLES;#查看全局变量
#查看满足某种条件的部分系统变量
SHOW GlOBAL VARIABLES LIKE '%char%';
#查看指定的某个系统变量的值
SELECT @@GLOBAL.系统变量名 ;#查看全局变量
#为某个系统变量赋值
SET GLOBAL 系统变量名 = 值;#全局变量
SET @@GLOBAL.系统变量名 = 值;#全局变量
定义:由用户定义的变量
使用步骤:声明-使用-赋值
作用域:针对于当前会话(连接)有效,同会话变量的作用域。应用于任何位置。
语法:
#声明并初始化
SET @用户变量名=值;#方式一
SET @用户变量名:=值;#方式二
SELECT @用户变量名:=值;#方式三
#更新用户变量的值
SET @用户变量名=值;#方式一
SET @用户变量名:=值;#方式二
SELECT @用户变量名:=值;#方式三
SELECT 字段 INTO 变量名 FROM 表;#方式四
#使用
SELECT @用户变量名;
注意事项:
SELECT INTO
更新时字段需为一行一列作用域:仅仅在定义他的BEGIN END
中,应用在BEGIN END
第一句
语法:
#声明
DECLARE 变量名 类型;
#声明并赋值
DECLARE 变量名 类型 DEFAULT 值;
#赋值
SET 局部变量名=值;#方式一
SET 局部变量名:=值;#方式二
SELECT 局部变量名:=值;#方式三
SELECT 字段 INTO 局部变量名 FROM 表;#方式四
#使用
SELECT 局部变量名;
定义:类似于java中方法
含义:一组预先编译好的SQL语句的集合,理解成批处理语句。
语法:
#创建
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体;
END;
注意事项:
IN
该参数可以作为输入OUT
该参数可以作为输出(返回值)INOUT
该参数及可以作为输入有可以作为输出BEGIN END
可以省略DELIMITER
重新设置。DELIMITER
语法:
DELIMITER 结束标记
例子:
DELIMITER $;
语法:
#调用
CALL 存储过程名(实参列表);
例子:
#根据女生名,查询对应男生信息
#创建
CREATE PROCEDURE myp(IN beaytyName VARCHAR(20))
BEGIN
SELECT bo.*
FROM boys bo
RIGHT JOIN beauty b ON bo.id=b.boyfriend_id
WHERE b.name=beautyName;
END$
#调用
CALL myp('ross')$
例子:
#根据女生名返回男生名
#定义
CREATE PROCEDURE myp(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
SELECT bo.boyName INTO boyName
FROM boys bo
INNER JOIN beauty b ON bo.id=b.boyfriend_id
WHERE b.name = beautyName;
END$
#调用
SET @bName$
CALL myp('rose',@bName)$
例子:
#传入a,b返回时a,b翻倍
#创建
CREATE PROCEDURE myp(INOUT a INT ,INTOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END$
#调用
SET @a=10;
SET @b=20;
CALL myp(@a,@b)$
语法:
DROP PROCEDURE 存储过程名;
例子:
DROP PROCEDURE myp;
语法:
SHOW CREATE PROCEDURE 存储过程名;
优点:同存储过程
存储过程与函数区别:函数有且仅有一个返回值
适合用于处理数据后返回结果
语法:
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
RETURN 值;
END$
注意事项:函数体中只有一句话可以省略BEGIN END
语法:
SELECT 函数名(参数列表);
例子:
#返回公司员工个数
#创建
CREATE FUNCTION myf() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;#定义变量
SELECT COUNT(*) INTO c#赋值
FROM employees
RETURN c;
END$
#调用
SELECT myf()$
语法:
SHOW CREATE FUNCTION 函数名;
语法:
DROP FUNCTION 函数名;
类型 | 执行方式 | 函数 |
---|---|---|
顺序结构 | 从上到下 | |
分支结构 | 两条或多条路径中选择一个 | IF 函数、CASE 结构、IF 结构 |
循环结构 | 满足一定条件基础上重复执行一段代码 | WHILE 、LOOP 、REPEAT |
IF
结构:
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
...
END IF;
WHILE
[标签]:WHILE 循环条件 DO
循环体;
END WHILE[标签];
LOOP
[标签]:LOOP
循环体;
END LOOP[标签];
REPEAT
[标签]:REPEAT
循环体;
UNTIL 结束循环调节
END REPEAT[标签];
ITERATE
:相当于continue
LEAVE
:相当于break
名称 | 特点 |
---|---|
WHILE |
先判断后执行 |
LOOP |
先执行后判断 |
REPEAT |
没有条件的死循环 |
如果你看到了这里,那么你的未来一定会很优秀。愿保初心,追寻梦想!