"E:\MySQL\my.ini"
默认端口号为3306
myslq --version
查看mysql版本(未登录)
net stop mysql
停止
net start mysql
启动
mysql -h localhost -P 3306 -u root -p
完整登录(-u root为用户名 -p为密码隐式)
mysql -u root -proot
简写登录(-proot为密码显示)
exit
退出登录
Ctrl+C
退出登录
不区分大小写,建议关键字大写,表名、列名小写
每条命令最好用分号;
结尾
每条命令根据需要,可以进行缩进,或换行
注释
#单行注释
-- 注释文字(有空格)
/* 多
行
注
释*/
select version();
查看mysql版本(已登录)
use 库名X
进入X库
show tables from
展示某库内全部表(未进入某库)
select database()
展示目前所在库(使用函数)
#在当前库内创建表
mysql> create table stuinfo(
-> id int,
-> name varchar(20));
desc 表名Y
展示Y表结构
SQL(Structure Query Language)结构化查询语言
`NAME`和NAME区别关键字
DQL(Data Query Language)数据查询语言
#建议每次新建查询时,打开库
use 库名;
use myemployees;
select 查询列表
from 表名;
---------------------------------------------
#1.查询表中单个字段
SELECT
first_name
FROM
employees;
#2.查询表中多个字段
SELECT
first_name,
last_name,
email
FROM
employees;
#3.查询表中的所有字段
SELECT
*
FROM
employees;
#4.查询常量值
SELECT 100;
SELECT 'john';#字符串要加单引号
#5.查询表达式
SELECT 100 % 98;#取余
#6.查询函数
SELECT version();#查询MySQL版本号
#7.取别名
/*
①便于理解
②联合查询,区分重名
*/
select 100/33 as 结果1; #用as取别名
select 100%98 结果2; #用空格直接取别名
select salary as "out put" from employees;#out是关键字,别名需加引号
#8.去重distinct
#eg:查询员工表中涉及到的所有的部门编号
select distinct department_id from employees;
#9.+加号的作用
#eg:查询员工的姓名,性和名连接成一个字段,并显示为姓名
/*
java中的+加号作用:①运算符②连接字符串
MySQL中的+加号作用:①只能当运算符
*/
SELECT
concat( last_name, first_name ) AS 姓名
FROM
employees;#正确!!!!
/*
select last_name + first_name as 姓名 from employees; #错误!!!!
select 100+90; #=190,都为数值,则做加法运算
select '100'+90; #=190,只要其中一方为字符型,则试图转换成数值 #如果转换成功,则继续做加法运算
select 'john'+90; #如果转换失败,则转换为0
select null+90; #如果有一方为null,则结果一定为null
*/
#10. IFNULL(expr1,expr2) 参数1为可能为null的值,参数2为null时所替代的值
select IFNULL(commission_pct,0) as 奖金率 from employees;
select
查询列表 #第三步
from
表名 #第一步
where
筛选条件; #第二步
条件运算符:> < = != <> >= <=
!=和<>意思是不等于
# 一、按条件表达式筛选
#案例1:查询工资>12000的员工信息
SELECT
*
FROM
employees
WHERE
salary > 12000;
#案例2:查询部门编号不等于90号的员工名和部门编号
SELECT
last_name,
first_name,
department_id
FROM
employees
WHERE
department_id <> 90;
逻辑运算符:&& || !
and or not
# 二、按逻辑表达式筛选
#案例一:查询工资在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,
first_name,
salary,
commission_pct
FROM
employees
WHERE
salary >= 10000 && salary <= 20000;
#案例二:查询部门编号不在90到110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE
NOT ( department_id >= 90 AND department_id <= 110 )OR salary > 15000;
like,between and,in,is null,is not null
LIKE
特点:①一般与通配符搭配
通配符:%任意多个字符,包含0个字符
_任意单个字符
②
#1.like
#案例一:查询员工名中包含字符a的员工信息
select
*
from
employees
where
last_name like '%a%';
#案例二:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
SELECT
first_name,
last_name,
salary
FROM
employees
WHERE
first_name LIKE '__e_a%';
#案例三:查询员工名中第二个字符为_下划线的员工名
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_\_%'; #默认\反斜杠为转义符
WHERE
last_name LIKE '_$_%' ESCAPE '$'; #ESCAPE自定义转义符
BETWEEN AND和NOT BETWEEN AND
特点:①使用between and 可以提高语句的简介度
②包含临界值
③从小到大,不能颠倒
#案例:查询员工编号在100到120之间的员工信息
SELECT
*
FROM
employees
WHERE
employee_id BETWEEN 100 AND 120;
IN
含义:用于判断某字段的值是否属于in列表中的某一项
特点:①使用in提高语句的简介度
②in列表的值类型必须统一或兼容
③不支持通配符’AD_%’
#案例:查询员工的工种编号是 IT_PROG,AD_VP,AD_PRES 中的一个员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN ('IT_PROG','AD_VP','AD_PRES');
WHERE
job_id='IT_PROG'OR job_id='AD_VP' OR job_id='AD_PRES';#和等于号完全等价
IS NULL和IS NOT NULL
等号=或<>不能用于判断null值
is null和is not null仅仅用于判断null
#案例1:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL;
#案例2:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NOT NULL;
安全等于<=>
既可以判断null值,也可以判断普通数值,可读性较低
#案例1:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct <=> NULL;
#案例2:查询工资为12000的员工名和奖金率和工资
SELECT
last_name,
commission_pct,
salary
FROM
employees
WHERE
salary <=> 12000;
特点:①asc是升序,desc是降序,默认asc升序
②order by子句中可以支持单个字段、多个字段、表达式、函数、别名
③order by子句一般是放在查询语句的最后面,但limit子句除外
select 查询列表 #第三步
from 表 #第一步
【where 筛选条件】 #第二步
order by 排序列表 【asc默认升序/desc】升序/降序 #第四步
----------------------------------------------------
#案例1:查询员工信息,按从高到低、从低到高排序
select * from employees order by salary asc;#升序
select * from employees order by salary; #默认asc升序
select * from employees order by salary desc;#降序
#案例2:查询部门编号>=90的员工信息,按入职时间的先后进行排序
select * from employees where department_id >= 90 order by hiredate asc;
#案例3:按年薪的高低显示员工的信息和 年薪【按表达式/别名排序】
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 LENGTH(last_name) asc;
#案例5:查询员工信息,要求先按工资排序,再按员工编号排序【多条件排序】
select *
from employees
order by salary asc,employee_id desc;#工资升序,编号降序
功能:类似java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:①隐藏了实现细节 ②提高代码的重用性
特点:①叫什么(函数名)
②干什么(函数功能)分类:①单行函数:concat,length,ifnull等
②分组函数(统计函数,聚合函数,组函数):做统计使用,传入一组值
#调用方法
select 函数名(实参列表);【from 表】;
#1.length获取字节长度
SELECT length( 'john' );#字母一字节,返回4
SELECT length( '鸭梨亚' );#汉字三字节,返回9
#2.concat拼接字符串
select concat (last_name,'_',first_name) as 姓名 from employees;
#3.upper,lower大小写
select concat(upper(last_name),lower(first_name)) 姓名 from employees;
#4.substr,substring截取字符
#注意:SQL里索引从1开始,不是0
select substr('你好,世界!',4);
select substr('你好,世界!',1,2);
#案例:姓名中首字符大写,其他字符小写然后用拼接,显示出来
select concat(upper(substr(last_name,1,1)),lower(substr(first_name,2)))
as out_put
from employees;
#5.instr返回子串第一次出现的起始索引,没有则返回0
select instr('张三爱上了李四','李四')as out_put;#返回6
select instr('张三爱上了李四','王五')as out_put;#返回0
#6.trim去掉前后空格
select trim(' 我爱你 ')as out_put;#返回我爱你
#7.lpad用指定的字符实现left左填充
select lpad('王五',10,'a')as out_put;#返回aaaaaaaa王五
#8.rpad用指定的字符实现left左填充
select rpad('张三',5,'b')as out_put;#返回张三bbb
#9.replace全部替换
select replace('李四爱上了赵六赵六赵六','赵六','王五')as put_out;#李四爱上了王五王五王五
##1.round 四舍五入,默认取整
select(round(1.456));#返回1
select(round(1.456,2));返回1.46
#2.ceil 向上取整
select ceil(1.001);#返回2
select ceil(1.0);#返回1
select ceil(-1.2);#返回-1
#3.floot 向下取整
select floor(1.99);#返回1
select floor(1.00);#返回1
select floor(-1.99);#返回-2
#4.truncate截断
select truncate(1.456,2);#返回1.45
#5.mod取模 本质是:a-a/b*b
select mod(10,3);#返回1,等价于10%3
select 10%3;#返回1
select mod(-10,3);#返回-1
select mod(-10,-3);#返回-1
select mod(10,-3);#返回1
#1.now 返回当前系统日期+时间
select now();
#2.curdate返回当前系统日期
select curtime();
#3.curtime返回当前系统时间
select curdate();
#4.获取指定的部分:年、月、日、时、分、秒
select month(now());
select year(now());
#5.str_to_data将字符通过指定的格式转换成日期
select str_to_date('7-9-2020','%m-%d-%Y');#返回2020-07-09
#案例
select *
from employees
where str_to_date(hiredate,'%Y-%m-%d')='2002-12-23';
#6.date_format将日期转换成字符
select date_format('2020-7-9-6','%Y年%m月%d日');#返回2020年07月09日
#案例:查询有奖金的员工名和入职日期(xx月/xx日 xx年)
select last_name,date_format(hiredate,'%m月/%d日 %Y年')
from employees
where commission_pct is not null;
select version();#版本号
select database();#查看当前数据库
select user();#查看当前用户
#1.if函数 if else的效果
select if(100>99,'大','小');
select last_name, if(commission_pct is null,'呵呵,我没奖金','嘻嘻,我有奖金') as 奖金
from employees;
#2.case函数
#使用一:switch case的效果
/*
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
...
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;
#使用二:类似于多重if
/*
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
...
sele 要显示的值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;
#1.显示系统时间(注:日期+时间)
select now();
#2.查询员工号,姓名,工资,以及工资提高百分之20后的结果( NEW sa1ary)
select employee_id,last_name,salary,salary*1.2
from employees;
#3.将员工的姓名按首字母排序,并写出姓名的长度( LENGTH)
select substr(last_name,1,1) as "首字母",length(last_name) as "姓名长度",last_name
from employees
order by substr(last_name,1,1);
#4.做一个查询,产生下面的结果
# earns monthly but wants
#Dream salary King earns 24000 monthly but wants 72000
select concat(last_name," earns ",salary," monthly but wants ",salary*3) as "Dream salary"
from employees;
#5.使用 CASE-WHEN,按照下面的条件:
/*job grade
AD_PRES A
ST_MAN B
IT_PROG C
SA_REP D
ST_CLERK E
产生下面的结果
Last_name Job_id Grade
king AD_PRES A
*/
select last_name as Last_name,job_id as Job_id,
case job_id
when 'AD_PRES' then "A"
when 'ST_MAN' then "B"
when 'IT_PROG' then "C"
when 'SA_REP' then "D"
when 'ST_CLERK' then "E"
end as Grade
from employees;
功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:sum求和 avg平均值 max最大值 min最小值 count计算个数
特点:
1.sum、avg一般用于处理数值型
max、min、count可以处理任何类型
2.以上分组函数都忽略null值
3.可以和distinct搭配实现去重
4.一般使用count(*)用作统计行数
5.和分组函数一同查询的字段要求是group by后的字段
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;
select sum(last_name),avg(last_name) from employees;#0无意义
select max(last_name),min(last_name) from employees;#字符比较
select count(last_name) from employees;#计数非空空的值
select count(commission_pct) from employees;#计数非空的值
select sum(commission_pct),avg(commission_pct),sum(commission_pct)/35,sum(commission_pct)/107 from employees;
select count(commission_pct) from employees;
select count(distinct commission_pct) from employees;
效率:
MYISAN存储引擎下,COUNT(*)的效率最高
INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,COUNT(字段)最慢
#统计salary的非空个数
select count(salary) from employees;
#统计行数
select count(*) from employees;
#统计行数(加一列常量值)
select count(1) from employees;
select avg(salary),employees_id from employees;#错误
-- 1.查询公司员工工资的最大值,最小值,平均值,总和、
select max(salary),min(salary),avg(salary),sum(salary) from employees;
-- 2.查询员工表中的最大入职时间和最小入职时间的相差天数(DIFFRENCE)
select datediff('2020-10-1','2020-7-15');#查询后面参数日期到前面参数日期的天数
select datediff(max(hiredate),min(hiredate)) as DIFFRENCE from employees;
-- 3.查询部门编号为90的员工个数
select count(*) from employees where department_id=90;
#语法
select 分组函数,列(要求出现在group by的后面)
from 表
【where 筛选条件】
group by 分组的列表
【order by 子句】
#注意:查询列表必须特殊,要求是分组函数和group by后的字段
#查询每个工种的最高工资
select max(salary),job_id
from employees
group by job_id;
#查询每个位置上的部门个数
select count(*),location_id
from departments
group by location_id;
1.分组前筛选
数据源是原始表
位置在group by子句之前
关键字是where2.分组前筛选
数据源是分组后的结果集
位置在group by子句之后
关键字是having注意:
①分组函数做条件肯定是放在having子句中(原表没有)
②能用分组前筛选的,就优先使用分组前筛选(考虑性能)
#案例1:查询邮箱中包含a字符的,每个部门的平均工资
select avg(salary),department_id,email
from employees
where email like '%a%'
group by department_id;
#案例2:查询有奖金的每个领导手下员工的最高工资
select max(salary),manager_id
from employees
where commission_pct is not null
group by manager_id;
#案例1:查询哪个部门的员工个数>2
#①查询每个部门的员工个数
select count(*),department_id
from employees
group by department_id;
#②根据①的结果进行筛选,查询哪个部门的员工个数>2
select count(*),department_id
from employees
group by department_id
having count(*)>2;
#案例2:查询每个工种有奖金的员工最高工资>12000的工种编号和最高工资
select max(salary),job_id
from employees
where commission_pct is not null
group by job_id
having max(salary)>12000;
#案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
select min(salary),manager_id
from employees
where manager_id>102
group by manager_id
having min(salary)>5000;
#案例:按员工姓名的长度分组,查询每一组员工的个数,筛选员工个数>5的有哪些?
select count(*) as c,length(last_name) as len_name
from employees
group by len_name #mysq1支持别名
having c>5;
#案例:查询每个部门每个工种的员工的平均工资
select department_id,job_id,round(avg(salary),2)#保留两位小数
from employees
group by department_id,job_id;
#案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
select department_id,job_id,avg(salary)
from employees
where department_id is not null #筛选放在前面
group by department_id,job_id
order by avg(salary) desc;#降序,由高到低
-- 1.查询各job_id的员工工资的最大值、最小值、平均值、总和,并按job_id升序
select max(salary),min(salary),avg(salary),sum(salary),job_id
from employees
group by job_id
order by job_id asc;
-- 2.查询员工最高工资和最低工资的差距(DIFFERENCE)
select (max(salary)-min(salary))as DIFFERENCE
from employees;
-- 3.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
select manager_id,min(salary),count(*)
from employees
where manager_id is not null
group by manager_id
having min(salary)>=6000;
-- 4.查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
select department_id,count(*),avg(salary)
from employees
group by department_id
order by avg(salary) desc;
-- 5.选择具有各个job_id的员工人数
select count(*),job_id
from employees
group by job_id;
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
DML(Data Manipulation Language)数据操作语言
DDL(Data Definition Language)数据定义语言
TCL([Terminal Control Language )终端控制语言
GRANT ALL PRIVILEGES ON xftdb.* to 'dj_user'@'%' IDENTIFIED BY 'pythonvip';
FLUSH PRIVILEGES;
给予所有权限(GRANT ALL PRIVILEGES)xftdb(库名)所有表(.*)上给'dj_user'(普通用户)@'%'(所有设备)IDENTIFIED BY'pythonvip'(这个子用户的密码)
CREATE DATABASE 数据库名;
CREATE DATABASE IF NOT EXISTS 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
drop database 数据库名;
use 数据库名;
show databases;
create table 数据库名 charset=utf8;
create table if not exists '表名'(
'id' int unsigned primaty key auto_increment,
'name' varchar(32) not null,
'create_time' Date
)ENGING=InnoDB DEFAULT CHARSET=UTF8;
desc 表名;
drop table 表名;
show tables;
insert into 表名 (filed1,filed2,...) values (value1, value2,...);
1、通过limit属性限制返回的数量 2、通过offset指定开始查询的数据偏移量,默认是0
select 字段1,字段2 from 表名 [where 条件] [limit n] [offset m]
实例: 1、将所有人的年龄加1 update students set age=age+1; 2、将id为5的手机号改为默认的-:update students set tel=default where id=5; 3、将手机号为17521192856的姓名改为小马:update students set name=‘小马’ where tel=‘17521192856’;
update 表名 set field1=new_value1,field2=new_value2 [where 条件]
根据条件修改指定某条数据某些字段的值
delete from 表名 [where 条件];
select field1,field2... from 表名 [where 条件] order by field1 desc;
mysql -u 用户名 -p -D 数据库名 < tb_news_20181217.sql
truncate TABLE tablename;
USE + 数据库名
`
select field1,field2... from 表名 [where 条件] order by field1 desc;
mysql -u 用户名 -p -D 数据库名 < tb_news_20181217.sql
truncate TABLE tablename;
USE + 数据库名