Mysql基础(一)
数据库相关概念
1.DB: 数据库,保存一组有组织的数据的容器
2.DBMS: 数据库管理系统,又称数据库软件,用于管理DB中的数据
3.SQL:结构化查询语言,用于DBMS通信
MYSQL服务的登录和退出
登录:mysql 【-h主机名 -p端口号】 -用户名 -密码
退出: exit , ctrl c 如: mysql -u root -p123456
MYSQL的常见命令
1.查看当前所有的数据库: show database;
2.打开指定的库 :use库名
3.查看当前库的所有类 :show tables;
4.查看其他库的所有类 :show table 表名;
5.创建表 : create table 表名(
列名 列类型,
列名 列类型,
。。。
);
6.查看表结构 :desc 表名;
7.查看服务器的版本
方式一:登录到mysql 服务端 select version();
方式二:没有登录到mysql服务端 mysql --version 或 mysql --V
注释:
单行注释:#注释文字 或 -- 注释文字
多行注释:/* 注释文字 */
基础查询
USE myemployees; -- 查表中单个字段 SELECT last_name FROM employees; -- 查询表中的多个字段 SELECT last_name,salary,email FROM employees; -- 查询表中的所有字段 SELECT * FROM employees; -- 查询常量值 SELECT 100; SELECT 'join'; -- 查询表达式 SELECT 100*23; -- 查询函数 SELECT VERSION(); -- 起别名 as 或者用空格 SELECT 100*123 AS 结果; -- 去重 SELECT DISTINCT department_id FROM employees; -- + 号的作用:只有一个功能 运算符加法运算 SELECT 'join'+99; -- 结果为99 转换失败,将字符型数值转换为0 SELECT '133'+99; -- 结果为232,转换成功 继续做加法运算 SELECT NULL+99; -- 结果为null,只要其中一方为null,则结果肯定为null -- 拼接 CONCAT 可以嵌套 ifnull(a,0) SELECT CONCAT('a','b','c')AS 结果; SELECT CONCAT (last_name,first_name)AS 姓名 FROM employees;
条件查询
#条件查询 /*语法 select 查询列表 from 表名 where 筛选条件; 分类 按条件表达式筛选 条件运算符 > < = <> >= <= 按逻辑表达式 逻辑运算符 && || ! and or not 模糊查询 like between and in is null */ -- 1.查询工资>12000的员工信息 SELECT * FROM employees WHERE salary>12000; -- 2.查询部门编号不等有90的员工名和部门名 SELECT last_name,department_id FROM employees WHERE department_id != 90; -- 3.查询工资在10000到20000之间的员工名,工资以及奖金 SELECT last_name,salary,commission_pct FROM employees WHERE salary>=10000 AND salary<=20000; -- 4.查询部门编号不是在90到110之间,或者工资高于15000的员工信息 SELECT * FROM employees WHERE department_id<90 OR department_id>110 OR salary>15000; -- 5.查询员工名中包含字符a的员工信息 SELECT * FROM employees WHERE last_name LIKE '%a%'; -- 6.查询员工名中第三个字符为a 第五个字符为a的员工的工资和员工名 SELECT salary,last_name FROM employees WHERE last_name LIKE '__n_l%'; -- 7.查询员工名中第二个字符为_的员工名 SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$'; -- 8.查询员工编号在100-120的员工信息 SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120; -- 包含临界值,不可调换顺序的 -- 9.询员工的工种编号是 IT_PROG,AD_PRES的一个员工名和编号 SELECT last_name,job_id FROM employees WHERE job_id IN('IT_PROG','AD_PRES'); -- in列表的值的了类型必须统一或兼容 -- 10.查询没有奖金的员工名和奖金率 SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL; -- 11.安全等于 SELECT last_name,commission_pct FROM employees WHERE commission_pct <=>NULL; -- 12.查询员工号为176的员工的姓名和部门号和年薪 SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0))AS 年薪 FROM employees WHERE employee_id = 176; #练习 -- 13.查询没有奖金,且工资小于18000的salary,last_name SELECT salary,last_name FROM employees WHERE commission_pct IS NULL AND salary<18000; #14.试问select *from employees;和 # selet * from empleyees # where commission_pct like'%%'and last_name like '%%'; # 不一样的,判断的字段有null值就不一样了 # 换成or的话是一样的
排序
USE myemployees; -- 15.查询员工信息,要求工资从高到底排序 SELECT * FROM employees GROUP BY salary DESC; -- desc 降序 默认升序 -- 16.查询部门编号大于等于90的员工信息,按入职时间的先后顺序进行排序 SELECT * FROM employees WHERE department_id>=90 GROUP BY hiredate; -- 17.按年薪的高低显示员工的信息和年薪 SELECT *, salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees GROUP BY 年薪; -- 18.按姓名的长度显示员工的姓名和工资 SELECT LENGTH(last_name) AS 名字长度,last_name,salary FROM employees ORDER BY 名字长度; -- 19.查询员工信息,先按工资排序再按员工编号排序 SELECT * FROM employees ORDER BY salary ASC ,department_id DESC;
特点:order by 字句中可以支持单个字段,多个字段,表达式,函数,别名
order by 字句一般是放在查询语句的最后面,limit语句除外
函数
#字符函数 -- length()获取字节个数 utf-8每个汉字三个字节15 SELECT LENGTH('丁芳芳linlin'); SELECT LENGTH('join'); -- 4 SHOW VARIABLES LIKE '%char%'; -- concat()拼接字符串 SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees; -- upper() 转为大写, lower()转为小写 -- substr ,substring 索引从1 开始 -- 两个参数的截取:从指定索引处开始截取指定长度的字符 SELECT SUBSTR('我想你了,琳琳',5) out_put; -- ,琳琳 -- instr 返回子串第一次出现的索引,如果找不到返回0 -- trim去除字符串两边的空格 -- lpad 左填充,用指定的字符实现左填充指定的长度, -- rpad 右填充同理 SELECT LPAD('何苗苗',6,'AA') OUT_PUT; -- replace 替换 SELECT REPLACE('AABBCC','AA','DD') SOUT; -- DDBBCC
#数学函数 -- round四舍五入 负数先算绝对值再加符号 SELECT ROUND(1.56); SELECT ROUND(1.238,2);-- 小数点后保留两位 1.24 -- ceil 向上取整,返回大于等于该参数的最小整数 SELECT CEIL(1.00); -- 1 SELECT CEIL(-2.35);-- -2 -- floor 向下取整,返回小于等于该参数的最大整数 SELECT FLOOR(9.83); -- 9 SELECT FLOOR(-23.34); -- 24 -- truncate 截断 SELECT TRUNCATE(23.599,2); -- 23.59 -- MOD()取余 /*有意思 mod(a,b):a-a/b*b mod(-10,-3):-10-(-10)/(-3)*(-3) = -1 */ SELECT MOD(10,-3); -- 1 符号与10的符号相同
#日期函数 -- now() 返回当前系统日期 + 时间 SELECT NOW();-- 2020-04-07 16:26:42 -- curdate() 返回当前系统日期,不包含时间 SELECT CURDATE();-- 2020-04-07 -- currime() SELECT CURTIME();-- 16:29:37 -- 获取年 SELECT YEAR(NOW()) 年;-- 2020 -- STR_TO_DATE查询入职日期为1992-4-3的员工信息 SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y'); -- date-formate() 将日期转换为字符 SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日')AS sout;
#流程控制函数 -- if函数:if else的结果 SELECT IF( 10>3,'大于','小于'); -- CASE函数的使用 switch-case -- 查询员工的工资,要求 /* 部门号 = 30,显示的工资为1.1倍 部门号 = 40,显示的工资为1.2倍 部门号 = 40,显示的工资为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; -- 查询员工的工资情况 /* 如果工资>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;
#分组函数 -- sum avg min max count SELECT SUM(salary) ,AVG(salary) ,MIN(salary), MAX(salary),COUNT(salary) FROM employees; -- distinct与分组函数搭配 SELECT SUM(DISTINCT salary) FROM employees; -- count() 函数,统计行数 SELECT COUNT(*) FROM employees;
和分组函数一同查询的字段要求是group by后的字段
分组查询
#分组函数 -- 查询每个部门的平均工资 SELECT AVG(salary), department_id FROM employees GROUP BY department_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 manager_id; -- 查询那个部门的员工个数大于2 SELECT COUNT(*) c ,department_id FROM employees GROUP BY department_id HAVING c>2; -- 查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资 SELECT job_id,MAX(salary) m FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING m>12000 ; -- 查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低 SELECT manager_id,MIN(salary) m FROM employees WHERE manager_id>102 GROUP BY manager_id HAVING m>5000; -- 查询按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些 SELECT COUNT(*) c, LENGTH(last_name) m FROM employees GROUP BY m HAVING c>5; -- 查询每个部门每个工种的员工的平均工资,平均工资大于10000的,按平均工资的高低显示 SELECT AVG(salary) a,department_id,job_id FROM employees WHERE department_id IS NOT NULL GROUP BY department_id, job_id HAVING a>10000 ORDER BY a DESC; -- 查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内 SELECT MIN(salary) m,manager_id FROM employees WHERE manager_id IS NOT NULL GROUP BY manager_id HAVING m>=6000;