mysql学习笔记

启动/停止

管理员身份打开cmd
启动: net start mysql
停止: net stop mysql

登录和退出

方式一:
mysql自带的客户端
方式二:
cmd
登录:
mysql -h localhost -P 3306 -u root -p
h: host
P: 端口号
登录本地:
mysql -u root -p
退出:
exit/ctrl + c

查看mysql服务端的版本

方式一:
客户端中输入:
select version();
方式一:
cmd中输入:
mysql --version/mysql -V

mysql常见命令

  1. 查看当前所有的数据库
    show databases;
  2. 打开指定的库
    use 库名;
  3. 查看当前库的所有表
    show tables;
  4. 查看其它库的所有表
    show tables from 库名;
  5. 创建表
    create table 表名(
    列名 列类型,

    列名 列类型);
  6. 查看表结构
    desc 表名;

mysql的语法规范

  1. 不区分大小写,但建议关键字大写,表名、列名小写
  2. 每条命令最好用分号结尾
  3. 每条命令根据需要,可以进行缩进或换行
  4. 注释:
    单行注释:#注释文字
    单行注释:-- 注释文字(有空格)
    多行注释:/* 注释文字 */

DQL语言的学习(data query language 数据查询语言)

基础查询

语法:
SELECT 查询列表 FROM 表名
特点:
1.查询列表可以是:表中的字段、常量值、表达式、函数
2.查询的结果是一个虚拟的表格
例:
1.查询表中的单个字段
SELECT last_name FROM employees;
2.查询表中的多个字段
SELECT last_name,salary,email FROM employees;
3.查询表中的所有字段
SELECT * FROM employees;
4.查询常量值
SELECT 100;
SELECT ‘john’;
5.查询表达式
SELECT 100%98;
6.查询函数
SELECT VERSION();
7.起别名
方式一:
SELECT 100%98 AS 结果;
SELECT last_name AS 姓, first_name AS 名 FROM employees;
方式二:
SELECT last_name 姓, first_name 名 FROM employees;
SELECT salary “out put” FROM employees;
8.去重
SELECT DISTINCT department_id FROM employees;
9.+号的作用
mysql中的加号,仅仅只有一个功能,运算符
SELECT CONCAT(last_name, first_name) AS 姓名 FROM employees;
字符型转换失败,则将字符型数值转换为0
其中一方为NULL,则结果一定为NULL

条件查询

语法:
SELECT 查询列表 FROM 表名 WHERE 筛选条件
执行顺序:
表名、条件、列表
分类:
1.按条件表达式筛选
条件运算符:> < = != <> >= <=
SELECT * FROM employees WHERE salary>12000;
SELECT last_name, department_id FROM employees WHERE department_id<>90;
2.按逻辑表达式筛选
逻辑运算符:&& || ! and or not
SELECT last_name,salary,commission_pct FROM employees WHERE salary>=10000 AND salary<=12000;
SELECT * FROM employees WHERE department_id<90 OR department_id>110 OR salary>15000;
SELECT * FROM employees WHERE NOT(department_id>=90 AND department_id<=110) OR salary>15000;
3.模糊查询
like, between and, in, is null, is not null, <=>
SELECT * FROM employees WHERE last_name like ‘%a%’;
通配符:
% 任意多个字符,包含0个字符
_ 任意单个字符
SELECT last_name, salary FROM employees WHERE last_name like ‘__a_e%’;
SELECT last_name FROM employees WHERE last_name like ‘_%’;
SELECT last_name FROM employees WHERE last_name like '
KaTeX parse error: Expected group after '_' at position 1: _̲%' ESCAPE '’;
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
SELECT last_name, job_id FROM employees WHERE job_id = ‘IT_PROG’ OR job_id =‘AD_VP’ OR job_id = ‘AD_PRES’;
SELECT last_name, job_id FROM employees WHERE job_id IN (‘IT_PROG’,‘AD_VP’,‘AD_PRES’);
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 last_name,commission_pct,salary FROM employees WHERE salary <=> 12000;

排序查询

语法:
SELECT 查询列表 FROM 表名 WHERE 筛选条件 ORDER BY 排序列表 ASC|DESC
SELECT * FROM employees ORDER BY salary DESC;
不写默认是升序
ORDER BY 支持别名、表达式、函数等

常见函数

SELECT 函数名() [FROM 表];

单行函数

如 concat, length, isnull等
字符函数:

  1. length 获取参数值的字节个数
  2. concat 拼接字符串
  3. upper lower 大小写
    SELECT UPPER(‘john’);
    SELECT LOWER(‘joHn’);
  4. substr substring 截取字符串
    SELECT SUBSTR(‘李莫愁爱上了陆展元’, 7) out_put;(结果为 陆展元)
    SELECT SUBSTR(‘李莫愁爱上了陆展元’, 1, 3) out_put;(结果为 李莫愁)
  5. instr 返回起始索引
    SELECT INSTR(‘杨不悔爱上了殷六侠’, ‘殷六侠’) AS out_put;(结果为7,找不到返回0)
  6. trim 去前后空格等
    SELECT LENGTH(TRIM(’ 张翠山 ')) AS out_put;
    SELECT TRIM(‘a’ FROM ‘aaaaaaaaa张aaaaa翠山aaaaaa’) AS out_put;
  7. lpad 用指定字符实现左填充指定长度
    SELECT LPAD(‘殷素素’, 10, ‘’) AS out_put;
    SELECT LPAD(‘殷素素’, 2, '
    ’) AS out_put;
  8. rpad 用指定字符实现左填充指定长度
    SELECT RPAD(‘殷素素’, 10, ‘’) AS out_put;
    SELECT RPAD(‘殷素素’, 2, '
    ’) AS out_put;
    SELECT RPAD(‘殷素素’, 12, ‘ab’) AS out_put;
  9. replace 替换
    SELECT REPLACE(‘张无忌爱上了周芷若’, ‘周芷若’, ‘赵敏’) AS out_put;
    SELECT REPLACE(‘周芷若周芷若周芷若张无忌爱上了周芷若’, ‘周芷若’, ‘赵敏’) AS out_put;(多个都改)
数学函数

round 四舍五入
ceil 向上取整,返回>=该参数的最小整数
floor 向下取整,返回<=该参数的最大整数
truncate 截断 SELECT TRUNCATE(1.699999,1); 结果为1.6
mod 取余 (a=a - a/b*b)

日期函数

now 返回当前系统日期+时间
curdate 返回当前系统日期,不包含时间
curtime 返回当前系统时间,不包含日期
year 年 month 月 …
str_to_date 将日期格式的字符转换成指定格式的日期
date_format 将日期转换成字符
在这里插入图片描述

其他函数[补充]

version database user

流程控制函数[补充]
  1. if函数 if else 的效果
    SELECT IF(10<5, ‘大’, ‘小’);
    SELECT last_name, commission_pct, IF(commission_pct IS NULL, ‘没奖金,呵呵’,‘有奖金,嘻嘻’) 备注 FROM employees;
  2. case函数的使用
    (1)switch case 的效果
    case 要判断的字段或表达式
    when 常量1 then 要显示的值1或语句1
    when 常量2 then 要显示的值2或语句2

    else 要显示的值或语句n;
    end
    SELECT salary 原始工资, department_id,
    CASE department_id
    WHEN 30 THEN salary1.1
    WHEN 40 THEN salary
    1.2
    WHEN 50 THEN salary*1.3
    ELSE salary
    END AS 新工资
    FROM employees;
    (2)类似于 多重if
    case
    when 条件1 then 要显示的值1或语句1
    when 条件2 then 要显示的值2或语句2

    else 要显示的值n或语句n
    SELECT salary,
    CASE
    WHEN salary>20000 THEN ‘A’
    WHEN salary>15000 THEN ‘B’
    WHEN salary>10000 THEN ‘C’
    ELSE ‘D’
    END AS 工资级别
    FROM employees;
分组函数

功能:做统计使用,又称为统计函数、聚合函数、组函数
分类:
sum 求和、avg 平均值、max 最大值、min 最小值、count 计算个数(计算不为空的个数)
SELECT SUM(salary), AVG(salary) FROM employees;
SELECT COUNT(*) FROM employees;(一般用于统计行数)

分组查询

语法:

select 分组函数,列(要求出现在group by的后面)from 表 [where 筛选条件] group by 分组的列表 [order by 子句]

例:

查询每个工种的最高工资
SELECT MAX(salary), job_id FROM employees GROUP BY job_id;
查询每个位置上的部门个数
SELECT COUNT(), location_id FROM departments GROUP BY location_id;
查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary), department_id FROM employees WHERE email like ‘%a%’ GROUP BY department_id;
查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary), manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY department_id;
查询哪个部门的员工个数>2
SELECT COUNT(
),department_id FROM employees GROUP BY department_id HAVING COUNT()>2;
查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT MAX(salary), job_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary)>12000;
查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
SELECT MIN(salary), manager_id FROM employees WHERE manager_id > 102 GROUP BY manager_id HAVING MIN(salary) > 5000;
按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
SELECT COUNT(
), LENGTH(last_name) len_name FROM employees GROUP BY LENGTH(last_name) HAVING COUNT(*) > 5;
查询每个部门每个工种的员工的平均工资
SELECT AVG(salary), department_id, job_id FROM employees GROUP BY department_id, job_id;
查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
SELECT AVG(salary), department_id, job_id FROM employees GROUP BY department_id, job_id ORDER BY AVG(salary) DESC;

连接查询

含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件

分类

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

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

按功能分类
内连接 inner

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

等值连接

查询女神名和对应的男神名
SELECT name,boyName FROM beauty,boys WHERE beauty.boyfriend_id=boys.id;

sql99
查询员工名、部门名
SELECT last_name, department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;
inner 可省略

非等值连接

查询员工的工资和工资级别
SELECT salary, grade_level FROM employees e, job_grades g WHERE salary BETWEEN g.lowest_sal AND g.highest_sal AND g.grade_level=‘A’;

sql99
SELECT salary,grade_level FROM employees e INNER JOIN job_grades g ON e.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 employees e,employees m WHERE e.manager_id=m.employee_id;

sql99
SELECT e.last_name,m.last_name FROM employees e INNER JOIN employees m ON e.manager_id=m.employee_id;

外连接
应用场景

用于查询一个表中有,另一个表没有的记录

特点:

1.外连接的查询结果为主表中的所有记录,
如果从表中有和它匹配的,则显示匹配的值,
如果从表中没有和它匹配哦的,则显示null,
外连接结果=内连接结果+主表中有而从表中没有的记录
2.左外连接,left join左边的是主表
右外连接,right join 右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果
4.全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

左外连接 left [outer]

查询男朋友不在男神表的女神名
SELECT * FROM beauty;
SELECT * FROM boys;
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 FROM boys bo RIGHT OUTER JOIN beauty b ON b.boyfriend_id=bo.id WHERE bo.id IS NULL;

全外连接 full [outer]

SELECT b.,bo. FROM beauty b FULL OUTER JOIN boys bo ON b.boyfriend_id = bo.id;

交叉连接 cross join

SELECT b.,bo. FROM beauty b CROSS JOIN boys bo;

子查询

含义

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

分类

按子查询出现的位置
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.department_id=102) 部门名;

from后面

支持表子查询
将子查询结果充当一张表,要求必须起别名
案例:查询每个部门的平均工资的工资等级
(1)SELECT AVG(salary),department_id FROM employees GROUP BY department_id;
SELECT * FROM job_grades;
(2)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后面

标量子查询(单行)
列子查询(多行)
行子查询(多列多行)

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

1.标量子查询
案例:谁的工资比Abel高
(1)查询Abel的工资
SELECT salary FROM employees WHERE last_name = ‘Abel’;
(2)查询员工的信息,满足salary>(1)结果
SELECT * FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name = ‘Abel’);
2.列子查询(多行子查询)
案例:返回location_id是1400或1700的部门中的所有员工姓名
(1)查询location_id是1400或1700的部门编号
SELECT DISTINCT department_id FROM departments WHERE location_id IN(1400, 1700);
(2)查询员工姓名,要求部门号是(1)列表中的某一个
SELECT last_name FROM employees WHERE department_id IN (SELECT DISTINCT department_id FROM departments WHERE location_id IN(1400, 1700));
3.行子查询(结果集为一行多列或多行多列)
案例:查询员工编号最小并且工资最高的员工信息
SELECT * FROM employees WHERE (employee_id,salary)=(SELECT MIN(employee_id),MAX(salary) FROM employees);

exists后面(相关子查询)

语法:exists(完整的查询语句)
结果:0或1
SELECT EXISTS(SELECT employees_id FROM employees);
案例:查询有员工的部门名
SELECT department_name FROM departments d WHERE EXISTS(SELECT * FROM employees e WHERE d.department_id=e.department_id);
SELECT department_name FROM departments d WHERE d.department_id IN(SELECT department_id FROM employees);
查询没有女朋友的男神信息
SELECT bo.* FROM boys bo WHERE bo.id NOT IN (SELECT boyfriend_id FROM beauty);
SELECT bo.* FROM boys bo WHERE NOT EXISTS(SELECT boyfriend_id FROM beauty b WHERE bo.id=b.boyfriend_id);

按结果集的行列数

标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)

分页查询

union联合查询

DML语言的学习(Data manipulation language 数据操作语言)

DDL语言的学习(Data define language 数定义语言)

TCL语言的学习(Transaction control language 事务控制语言)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值