MySQL 进阶之路(一)数据操作

解决数据库管理工具连接数据库失败

  1. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';

MySQL 进阶之路(一)数据操作

服务的启动与停止
启动服务: net stop 服务名
关闭服务: net start 服务名
服务端的登录
登录远程mysql:mysql -h 主机名 -P 端口号 -u 用户名 -p密码
登录本地mysql:mysql -u root -p密码

常见命令
创建数据库:create database 库名;

查看当前所有数据库:show databases;

打开指定的库:use 数据库名;

查看当前库的所有表:show tables;

查看其他库的所有表:show tables from 数据库名;

查看当前数据库名:select database();

查看当前用户:select user();

查看mysql服务器版本:select version();

查看表结构:desc 表名;

查询数据库字符集:SHOW VARIABLES LIKE '%char%';

返回该字符串的MD5加密形式:SELECT M5('hello');

查看数据库引擎:SHOW ENGINES ;
建表,数据操作
创建表:
create table 表名(
id, int,
name varchar(20)
);

插入数据:
insert into 表名 (id,name) values(1,'张三');

更新数据:
update 表名 set name="李四" where id=1;

删除数据:
delete from 表名 where id=1;

去重:
select distinct 字段名 from 表名;

cout(*) 统计行数,效率高
1
2
3


  • +:
    select 100+90;
    两个操作数都为数值型,则作加法运算
    select "100"+90;
    其中一方为字符型,将字符型数值转换为数值型,转换成功,作加法运算,
    转换失败,将字符型数值转换为 0

%:通配符,任意多个字符,包含0个;
_:任意单个字符;

null
select null+10;
只要其中一方为null,则结果为null;
是否为空判断
select ifnull(字段名,如果该字段为null时你期望返回的值) as 别名 from 表名;

1
2
3
4
5
拼接字段
拼接为一个字段
select concat(last_name,first_name) as name from 表名;
select concat(last_name,',',first_name) as name from 表名;

别名中有特殊字符时加引号

模糊查询

查询员工编号不是在90到100之间,或者工资高于15000的员工信息

select from 员工表 where 员工编号<90 or 员工编号>100 or 工资>15000;
select
from 员工表 where not(员工编号>=90 and 员工编号<=100) or 工资>15000;

查询员工名中包含字符a的员工信息

select * form 员工表 where name like '%a%';

查询员工名中第三个字母为a,第五个字母为b的员工信息;

select * from 员工表 where name like '__a_b%';

查询员工名中第二个字母为的员工信息;
select * from 员工表 where name like '
_%';

指定 $ 为转义符
select * from 员工表 where name like '$%' escape '$';

查询员工编号在100到200之间的员工信息;
select * from 员工表 where 员工编号 between 100 and 200;

in 相当于 or 的代替
select * from 员工表 where 员工部门 in ('开发部','人事部');

选择工资不在8000到17000的员工的姓名和工资,按工资降序
SELECT last_ name, salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 1 7000
ORDER BY salary DESC;

排序查询
查询没有奖金的员工信息;
select from 员工表 where 奖金 is null;
select
from 员工表 where 奖金 <=> null;

<=>:安全等于
select * from 员工表 where 奖金 is not null;

查询员工信息,要求各自从高到低排序
select from employees order by salary desc;
select
from employees order by salary asc;

按年薪高低显示员工的信息和年薪
select ,salary12*(1+ifnull(commission,0)) 年薪 from employees order by 年薪 desc;

按姓名的长度显示员工的姓名和工资
SELECT LENGTH(last name) 字节长度,1ast name, salary FROM employees
ORDER By LENGTH (last
name) DESC;

查询员工信息,要求先按工资升序,再按员工编号降序[按多个字段排序]
SELECT *
FROM employees
ORDER BY salary ASC employee_id DESCE;

字符函数
concat:连接
substr:截取子串
upper:变大写
lover:变小写
replace:替换
length:获取字节长度
trim:去前后空格
lpad:左填充
rpad:右填充
instr:获取子串第一次出现的索引
将姓变大写,名变小写,然后拼接
SELECT CONCAT (UPPER(last name) ,LOWER(first name))姓名 FROM employees;

substr、substring
注意:索引从1开始
截取从指定索引处后面所有字符
SELECT SUBSTR("李莫愁爱.上了陆展元',7) out_ put ;

截取从指定索引处指定字符长度的字符
SELECT SUBSTR('李莫愁爱上了陆展元',1,3) out_put;

姓名中首字符大写,其他字符小写然后用拼接,显示出来
SELECT CONCAT (UPPER (SUBSTR(last
name,1,1)),'' ,LOWER (SUBSTR(last name,2))) out_put
FROM employees;

instr返回子串第一次出现的素引,如果找不到返回0
SELECT INSTR('杨不殷六侠悔爱上了殷六侠", '殷八侠") AS out_ put;

SELECT LENGTH (TRIM("张翠山")) AS out_ put;

SELECT TRIM('a' FROM 'aaaaaaa张aaaaaaaaaaa 翠山aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') AS out_ put;

lpad用指定的字符实现左填充指定长度
SELECT LPAD('殷素素',4,'*") AS out_ put;

rpad用指定的字符实现右填充指定长度
SELECT RPAD('殷素素',12, 'ab') AS out_ put;

replace 替换
SELECT REPLACE ('张无忌爱上了周芷若", '周芷若','赵敏') AS out_ put;

数学函数
ceil:向上取整
round:四舍五入
mod:取模
floor:向下取整
truncate:截断
rand:获取随机数,返回0-1之间的小数
round四舍五入
SELECT ROUND(-1.55) ;
SELECT ROUND(1.567,2) ;

ceil向上取整,返回>=该参数的最小整数
SELECT CEIL(-1.02) ;

floor向下取整,返回<=该参数的最大整数
SELECT FLOOR(-9.99) ;

truncate截断,小数点后保留一位
SELECT TRUNCATE (1.69999,1) ;

mod取余
MOD(a,b)
SELECT MOD(10,3) ;
SELECT 10%3;

日期函数
now:返回当前日期时间
year:近回年
month:返回月
day:返固日
date_format:将日期转换成字符
curdate:返回当前日期
str_to_date:将字符转换成日期
curtime:返回当前时间
hour:时
mimute:分钟
second:秒
datediff:返回两个日期相差的天数
monthname:以英文形式返回月
now返回当前系統日期+时间
SELECT NOW () ;

curdate返回当前系统日期,不包含时间
SELECT CURDATE () ;

curtime返回当前时间,不包含日期
SELECT CURTIME () ;

可以获取指定的部分,年、月、日、小时、分钟、秒
SELECT YEAR(NON())年
SELECT YEAR('1998-1-1") 年;
SELECT YEAR (hiredate) 年 FROM employees;
SELECT MONTH (NOW()) 月 ;
SELECT MONTHNAME (NOW()) 月 ;

str_to_date:将日期格式的字符转换成指定格式的日期
STR
TO DATE('9-13-1999','%m-%d-%Y")
1999-09-13

查询入职日期为1992--4-3的员工信息
SELECT FROM employees WHERE hiredate = '1992-4-3' ;
SELECT
FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992",'%c-%d %Y');

dateformat:将日期转换成字符
DATE
FORMAT('2018/6/6','%Y年%m月 %d日')
2018年06月06日

SELECT DATE_FORMAT(NOW(), '%y年%m月%d日') AS out put ;
查询有奖金的员工名和入职日期(xx月/xx日 xx年)
SELECT last name, DATE PORMAT (hiredate,'%m月/%d日 %y年') 入职日期
FROM employees
WHERE commission IS NOT NULL;

%Y 四位的年份
%y 2位的年份
%m 月份( 01,02...11,12 )
%c 月份( 1,2...11,12 )
%d 日( 01,02,.. )
%H 小时( 24小时制)
%h 小时( 12小时制)
%i 分钟( 00,01...59 )
%s 秒( 00,01...59 )

流程控制函数
SELECT IF(10<5, '大', "小');
BELECT last_ name, commission pct, IF(commission IS NULL, '没奖金,呵呵’,'有奖金,嘻嘻') 备注 FROM employees;

case
查询员工工资,要求
部门号=30,显示的工资为1.1倍
部门号=40,显示的工资为1.2倍
部门号=50, 显示的工资为1.3倍
其他部门,显示的工资为原工资

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;

查询员工的工资的情况
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示c级别
否则,显示D级别
SELECT salary,
ICASE
WHEN salary>20000 THEN 'A'
WHEN salary>1 5000 THEN ' B,
WHEN salary>10000 THEN 'C"
ELSE 'D'
ENDAS工资级别
FROMm employees;

分组函数
sum求和、avg”平均值、max最大值、min最小值,count 计算个数(都忽略null)
SELECT SUM(salary) FROM employees ;
SELECT AVG(salary) FROM employees ;
SELECT MIN(salary) FROM employees ;
SELECT MAX(salary) FROM employees;
SELECT COUNT (salary) FROM employees;

SELECT SUM(DISTINCT salary) ,SUM(salary) FROM employees;
SELECT COUNT (DISTINCT salary) , COUNT (salary) FROM employees;

求差值
SELECT DATEDIFF (NON (), '199 5-1-1') ;

查询部门编号为90的员工个数
SELECT COUNT(*) 个数
FROM employees
WHERE department_ id = 90;

查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id
FROM employees
WHERE commnission IS NOT NULL
GROUP BY manager_id;

where 分组前的条件筛选
having 对分组后的结果进行查询
添加分组后的筛选条件
查询哪个部门的员工个数>2
查询每个部门的员工个数
SELECT COUNT (*) , department id
FROM employee s
GROUP BY department
id;

②根据①的结果进行筛选,查询哪个部门的员工个数>2
SELECT COUNT () , department_id
FROM employee s
GROUP BY department_id
HAVING COUNT (
)>2;

查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
①查询每个工种有奖金的员工的最高工资
SELECT MAX (salary),job id :
FROM employees
WHERE comnission pct IS NOT NULL
GROUP BY job
id;

②根据①结果继续筛选,最高工资>12000
SELECT MAX (salary),job id
FROM employees
WHERE commi ssion pct IS NOT NULL
GROUP BY job id
HAVING MAX (salary)>12000;

按多个字段分组
查询每个部门每个工种的员工的平均工资
SELECT AVG (salary) , department_id,job_id
FROM employees
GROUP BY department_id,job_id;

department_id,job_id都一样的分为一个组

查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
SELECT AVG (salary),department_id,job_id
FROM employees
GROUP BY job_id, department_id
HAVING MAX (salary)>12000
ORDER BY AVG (salary) DESC;

查询各部门的平均工资
SELECT AVG (salary),department id
FROM employees
GROUP BY department
id

连接查询
按照功能分类
内连接:inner
等值连接
非等值连接
自连接
外连接:
左外连接:left [ outer ]
右外连接:rightI ( outer]
全外连接
交叉连接:
语法格式

select 查询列表
from 表1别名[连接类型 )
join 表2别名
on 连接条件
[where 筛选条件]
[group by 分组]
[having 筛选条件1]
[order by 排序列表]
内连接:
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件;

等值连接
查询员工名、部门名
SELECT last_name, department_name
PROM employees e
INNER JOIN departments d
ON e.department_id= d.department_id;

查询名字中包含e的员工名和工种名 (添加筛选)
SELECT last_name,job_title
FROM employees e
INNER JOIN jobs j
ON e.job_id= j.job_id
WHERE e.last_name LIKE '%e%';

查询部门个数 >3 的城市名和部门个数 (添加分组+筛选)
SELECT city, COUNT() 部门个数
PROM departments d
INNER JOIN locations 1
ON d.location_id=l.location_id
GROUP BY city
HAVING COUNT (
)>3;

查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排字)
SELECT COUNT () , department_name
FROM employees e
INNER JOIN departments d
ON e.dopartment_id =d.dopartment_id
GROUP BY department_name
HAVINGN QUNT (
) > 3
ORDER BY COUNT(*) DESC;

查询员工名、部门名、工种名+并按部门名降序(添加三表连接)
SELECT lastname , department name, job_titlo
FROM employees e
INNER JOIN departments_id ON e.department_id=d.departmentid
INNER JOIN jobs j ON e.job
id = j.job_ id
ORDER BY department_name DESC;

查询工资级别的个数>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;

查询员工名和上级的名称(自连接)
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;

外连接
应用场景:用于查询一个表中有,另一个表没有的记录
特点:
1、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记剥
2、
左外连接,left join左边的是主表
右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序,可以实现同样的效果
查询男朋友不在男神表的的女神名
SELECT FROM beauty;
SELECT
FROM boys;
左外连接
SELECT b.name, bo. *
FROM beauty b
LEFT OUTER JOIN boys bo
ON b. 'boyfriend id' = bo.id
WHERE bo.id IS NULL;

查询哪个部门没有员工(左外)
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.'department_d' = e.department_id'
WHERE e.employee_id IS NULL;

查询部门名为SAL或巧的员工信息
SELECT e. *, d.department_name
FROM departments_id
LEPT JOIN employees e
ON d.department_id = e.department_id
WHERE d.department_name IN('SAL', 'IT') ;

子查询
谁的工资比 Abel 高

①查询Abel的工资
SELECT salary
FROM employees
WHERE last_name = ‘Abel’

②查询员工的信息,满足salary>①结果

SELECT *
FROM employees
WHERE salary> (
SELECT salary
FROM employees
WHERE last_name = 'Abel')

查询没有女朋友的男神信息
#in
SELECT bo.*
FROM boys bo
JWHERE bo.id NOT IN (
SELECT boyfriend_id
FROM beauty

分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交sq1请 求
语法:
select查询列表
from表
[join type join表2
on连接条件
where筛选条件
group by分组字段
having分组后的筛选
order by排序的字段]
limit offset, size;
offset要显示条目的起始素引(起始素引从0开始)
size要显示的条目个数

查询第11条-- 第25条
SELECT * FROM employees LIMIT 10, 15;

有奖金的员工信息,并且工资较高的前10名显示出来
SELECT
FROM
emp1oyees
WHERE commission IS NOT NULL
ORDER BY salary DESC
LIMIT 10 ;

特点:
①limit语句放在查询语句的最后
②公式
要显示的页数page,每页的条目数size
select 查询列表
from 表
limit (page-1)*size,sip;

查询男生和女生的个数
select count(*) 个数 sex
from stuinfo
group by sex;

update / delete
INSERT INTO beauty
VALUES(23, "唐艺听1', '女', 1990-4-23. "1898888888 , NULL,2)
, (24, "唐艺听2", '女",
1990-4-23', 1898888888 , NULL,2)
,(25,"唐艺听3", 女",1990-4-23, 1898888888 , NULL,2) ;

INSERT INTO beauty (id, NAME , phone )
SELECT id, boyname,1234567,
FROM boys WHERE id<3 ;

修改多表的记录
修改张无忌的女朋友的手机号为114
UPDATE boys bo
INNER JOIN beauty b ON bo.id=b.boyfriend_id
SET b.'phone'='114 '
WHERE bo.boyName='张无忌';

PELETE b
FROM beauty b
INNER JOIN boys bo ON b.boyfriend_id=bo.id
WHEREL bo. boyName='张无忌';

删除黄晓明的信息以及他女朋友的信息
DELETE b,bo
FROM beauty b
INNER JOIN boys bo ON b.boyfriend_id=bo.id
WHERE bo.'boyName'='黄晓明';

1.delete可以加where 条件,truncate不能加

  1. truncate删除,效率高一丢丢
    3.假如要删除的表中有自增长列,
    如果用delete删除后,再插入数据,自增长列的值从断点开始,
    而truncate删除后,再插入数据,自增长列的值从1开始。
  2. truncate删除没有返回值,delete删除有返 回值
  3. truncate删除不能回滚,delete 刪除可以回滚。

猜你喜欢

转载自blog.51cto.com/14509987/2434168
今日推荐