create database name;
#查看mysql上有哪些库
SHOW DATABASES;
#查看具体库的信息
SHOW CREATE DATABASE name;
USE DATABASE name;
SELECT VERSION();
# 查询employees中所有人的名字
SELECT first_name from employees;
## 查询employees中所有人的first_name,last_name
SELECT first_name,last_name
FROM employees;
# 查询employees中所有人的信息
# * 代表所有字段
SELECT *
FROM employees;
#给字段取别名
#给字段起别名
/*
方式一 : 字段名 as 别名
方式二 : 字段名 别名
注意 : 如果别名中间有空格,那么别名必须使用""括起来。
*/
SELECT first_name AS fname
FROM employees;
SELECT first_name fname
FROM employees;
SELECT first_name "f name"
FROM employees;
在sql中的select 相当于输出语句
#可以理解成输出语句
SELECT 10;
SELECT 10+20;
SELECT 20+30 FROM DUAL; # dual是伪表,不是一个真实的表。
#字符串和整型做运算,如果字符串可以转成数值那就转成对应的数值,如果不能转那么就是0
SELECT "10"+10;
SELECT "aa"+10;
#null和任意值做运算结果还为null
SELECT NULL+10;
#查询department_id 为90 的员工的信息
SELECT *
FROM employees
WHERE department_id = 90;
#查询薪水大于5000的所有员工的姓名和薪水。
SELECT first_name,salary
FROM employees
WHERE salary > 5000;
#查询部门不等于100的所有人的部门号
SELECT department_id
FROM employees
WHERE department_id <> 100;
# 或者
SELECT department_id
FROM employees
WHERE department_id != 100;
#查询薪水大于等于5000并且小于等于8000的所有员工的薪水
SELECT salary
FROM employees
WHERE salary >= 5000 AND salary <= 8000;
SELECT salary
FROM employees
WHERE salary BETWEEN 5000 AND 8000;
#查询department_id为50,90,100的员工的部门号
SELECT department_id
FROM employees
WHERE department_id IN (50,90,100);
#选择工资不在5000到12000的员工的姓名和工资
SELECT first_name,salary
FROM employees
WHERE salary not BETWEEN 5000 AND 12000;
#查询员工的名字中带有a字符的员工姓名
SELECT first_name
FROM employees
WHERE first_name LIKE '%a%';# % 代表任意个数字符
#查询员工的名字中第二个字符是a的员工的姓名
SELECT first_name
FROM employees
WHERE first_name LIKE `在这里插入代码片`'_a%';#_代表任意一个字符
#查询员工的名字第二个字符是_的员工的姓名
SELECT first_name
FROM employees
WHERE first_name LIKE '_\_%'; # \_ 表示的就是_
SELECT first_name
FROM employees
WHERE first_name LIKE '_$_%' ESCAPE '$'; # escape 指定使用谁作为转义字符。
#查询员工的名字中包含a和e字符的员工姓名
SELECT first_name
FROM employees
WHERE first_name LIKE '%a%e%'
OR first_name LIKE '%e%a%';
#查询员工奖金率为null的员工的信息(名字,奖金率)
SELECT first_name,commission_pct
FROM employees
WHERE commission_pct IS NULL;
#查询员工奖金率不为null的员工的信息(名字,奖金率)
SELECT first_name,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
#获取所有的员工信息,薪水从小到大排序
SELECT *
FROM employees
ORDER BY salary ASC;
#asc 是升序(默认),desc 为降序
#获取所有员工信息,安照部门号进行排序(从小到大),如果部门id相同薪水降序。
SELECT *
FROM employees
ORDER BY department_id ASC,salary DESC;
#lower : 将所有的字符变成小写
SELECT LOWER("HeLLo");
#upper : 将所有的字符变成大写
SELECT UPPER("HeLLo");
SELECT UPPER(first_name)
FROM employees;
/*
字符:
CONCAT('Hello', 'World') : 字符串拼接
SUBSTR('HelloWorld',2,3) : 截取子串,从1的位置开始长度为5 (注意索引位置从1开始)
LENGTH('HelloWorld') : 字符串长度
INSTR('HelloWorld', 'W') : w在当前字符串中的位置
LPAD(salary,10,'*') :向右对齐
RPAD(salary, 10, '*') :向左对齐
TRIM('H' FROM 'HelloWorld') : 去除当前字符串两端的H
REPLACE('abcd','b','m') : 将当前字符串中的b替换成m
*/
SELECT CONCAT("hello","world");
SELECT CONCAT(first_name,last_name)
FROM employees;
SELECT SUBSTR("Helloworld",2,3);
SELECT LENGTH("aaa");
SELECT INSTR("helloWorld","w");
SELECT LPAD(first_name,10,'*'),RPAD(last_name,10,'*')
FROM employees;
SELECT TRIM('H' FROM 'HHHHHHae HHHHHH lloHHHHHHH');
SELECT REPLACE('abcdef','b','m');
/*
ROUND: 四舍五入
TRUNCATE: 截断
MOD: 求余
*/
#ROUND: 四舍五入
SELECT ROUND(12.8),ROUND(12.56,1),ROUND(-12.3),ROUND(-12.5);
#TRUNCATE: 截断
SELECT TRUNCATE(12.569,1),TRUNCATE(12.569,2),TRUNCATE(12.569,0);
#MOD:求余
SELECT MOD(5,3),MOD(-5,3);
#cell : 向上取整 >= 12.3的整数
SELECT CEIL(12.3)
#floor : 向下取整 <= 12.3的整数
SELECT FLOOR(12.3)
/*
日期函数
*/
SELECT NOW();
#CURDATE() :当前的日期
#CURTIME() :当前的时间
SELECT CURDATE(),CURTIME();
/*
通用函数:
IFNULL(commission_pct,0) :如果commission_pct的值为null那么就使用0值来替代null
*/
#需求 :求每个人的年薪
SELECT first_name,salary * 12 * (1 + IFNULL(commission_pct,0)) AS "年薪"
FROM employees;
/*
格式:
case 字段名
when 条件 then 执行的任务
when 条件 then 执行的任务
when 条件 then 执行的任务
...
else 执行的任务(如果上面的条件都不满足就执行else中的执行任务)
end (end表示该语句结束)
说明:
1.else是可选的
*/
#查询部门号为 10, 20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍,
#20 号部门, 则打印其工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数
SELECT department_id,salary,CASE department_id
WHEN 10 THEN salary * 1
WHEN 20 THEN salary * 2
WHEN 30 THEN salary * 3
END AS "new salary"
FROM employees
WHERE department_id IN(10,20,30);
#查询部门员工信息, 若manager_id为 103, 则打印其工资的 1 倍,
#若manager_id为 101, 则打印其工资的 2 倍, 若manager_id为 108工资的 3 倍数
#其它员工薪水全部增5倍
SELECT manager_id,salary,CASE manager_id
WHEN 103 THEN salary * 1
WHEN 101 THEN salary * 2
WHEN 108 THEN salary * 3
ELSE salary * 5
END AS "new salary"
FROM employees
WHERE manager_id IS NOT NULL;
SELECT CONCAT(first_name,last_name)
FROM employees;
/*
组函数:
AVG() :求平均数
SUM() : 求和
MAX() : 求最大值
MIN() : 求最小值
COUNT() : 求个数
说明:
1.avg()和sum()只能数值类型的数据进行运算
2.max()和min()可以对任意数值类型做运算。
3.count(字段名) : 求非空的数据的行数。
count(*) : 求表中所有数据的行数。
(底层原理:只要当前行中任意一个数据不为null那么就会统计成一行)
count(数值) : 求表中所有数据的行数(知道即可)。
注意 :组函数在运算时都是忽略为null的数据。
问题 :在select中如果使用组函数,那么select后面不能再使用其它的字段(除非该字段是分组字段)
#下面的写法是错误的
SELECT first_name,AVG(salary)
FROM employees;
#下面的写法是错误的
SELECT first_name,COUNT(first_name) #统计所有名字的个数
FROM employees;
*/
#求所有员工的平均薪水
SELECT AVG(salary),MAX(salary),MIN(salary),SUM(salary)
FROM employees;
SELECT MAX(first_name),MIN(first_name)
FROM employees;
SELECT COUNT(salary),COUNT(commission_pct),COUNT(*),COUNT(1)
FROM employees;
SELECT commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
#使用组函数时可能产生的问题?
#需求:求所有员工的薪水的平均值'
#下面的写法是错误的
SELECT first_name,AVG(salary)
FROM employees;
#下面的写法是错误的
SELECT first_name,COUNT(first_name) #统计所有名字的个数
FROM employees;
group by 前面的select 的语句不能添加不是group by 的字段或者不是聚集函数的字段(如果要支持需要配置一个环境)
select department_id,count(department_id )
from employees e
where department_id is not null
group by department_id;
#统计各job_id员工的薪水的总和
select job_id,count(job_id )
from employees e
where job_id is not null
group by job_id ;
#统计各个领导手下的员工的人数
select manager_id,count(manager_id )
from employees e
where manager_id is not null
group by manager_id ;
#统计各个领导手下薪水大于5000的员工的人数,并把结果进行升序排序。
select manager_id ,count(manager_id ) com
from employees e
where salary > 5000 and manager_id is not null
group by manager_id
order by com asc;
不能在 WHERE 子句中使用组函数。
可以在 HAVING 子句中使用组函数。
# 内连接等值连接
# 查询每个员工的姓名及部门名称
select e.first_name ,d.department_name
from employees e ,departments d
where e.department_id = d.department_id ;
#内连接:非等值连接
#需求:查询每个员工的薪水等级
select e.first_name ,e.salary ,jg.GRADE
from employees e ,job_grades jg
where e.salary >= jg.LOWEST_SAL and e.salary <= jg.HIGHEST_SAL
#内连接:自连接
#需求:查询每个员工及员工的管理者的姓名
select e.first_name ,e2.first_name
from employees e ,employees e2
where e.manager_id = e2.employee_id ;
/*
sql99语法
内连接:
格式 :
from 表1 [inner] join 表2
on 连接条件
join 表3
on 连接条件
*/
#内连接:等值连接
#需求:查询每个员工的姓名及部门名称
select e.first_name ,d.department_name
from employees e join departments d
on e.department_id = d.department_id ;
#内连接 :非等值连接
#需求:查询每个员工的薪水等级
select e.first_name ,e.salary ,jg.GRADE
from employees e join job_grades jg
on e.salary >= jg.LOWEST_SAL and e.salary <= jg.HIGHEST_SAL ;
#内连接 :自连接
#需求:查询每个员工及员工的管理者的姓名
select e.first_name ,e2.first_name
from employees e join employees e2
on e.manager_id = e2.manager_id ;
#需求:查询每个员工姓名,员工部门名称,员工部门所在城市
select e.first_name ,d.department_name ,l.city
from employees e
join departments d
on e.department_id = d.department_id
join locations l
on d.location_id = l.location_id ;
/*
外连接:
左外连接:
右外连接:
满外连接(mysql不支持)
格式:
1. 左外连接:
from 表1 left [outer] join 表2
on 连接条件
*/
#需求:获取所有员工及员工的部门名称
#外连接:左外连接
select e.first_name ,d.department_name
from employees e
left join departments d
on e.department_id = d.department_id ;
左外连接就是不管与之对应的表的值是否为null,都会显示出来,就是说左表的数据一定会显示出来.
#外连接:右外连接
#需求:获取员工及所有部门名称
select e.first_name ,d.department_name
from employees e
right join departments d
on e.department_id = d.department_id ;
右外连接就是不管与之对应的表的值是否为null,都会显示出来,就是说右表的数据一定会显示出来.
#练习:查询公司所有员工薪水及大于5000的员工的薪水等级
select e.first_name ,e.salary ,jg.GRADE
from employees e
left join job_grades jg
on e.salary >= jg.LOWEST_SAL
and e.salary <= jg.HIGHEST_SAL
and e.salary > 5000;
/*
full join : 满外连接(mysql不支持)
mysql实现满外连接的方法
UNION : 可以将两张表的结果进行合并-去重(相当于full join)。
UNION ALL : 可以将两张表的结果进行合并-没有去重
格式:
左外连接的结果
union/union all
右外连接的结果
DISTINCT :去重
格式 : distinct 字段名
*/
#需求 :查询所有的部门及所有的员工
select e.first_name,d.department_name
from departments d
left join employees e
on d.department_id = e.department_id
#union 去重
union all #没有去重
select e.first_name,d.department_name
from departments d
right join employees e
on d.department_id = e.department_id ;
/*
一 子查询的概念 : 在一个查询语句中嵌套了一个查询语句该查询语句叫作子查询。
例 : select first_name
from employees e join (select * from departments)
on......
二 子查询的分类 :单行子查询 vs 多行子查询
单行子查询 :子查询的结果只有一条
多行子查询 :子查询的结果有多条
单行子查询所使用的运算符 :> >= < <= =
多行子查询所使用的运算符 :in , any ,all
三 子查询使用的位置
select --- 子查询
from ----- 子查询
where ---- 子查询
having ---- 子查询
*/
#需求 :谁的工资比 Abel 高?
#方法一:内查询
select e.first_name ,e.salary ,e2.salary
from employees e ,employees e2
where e.salary > e2.salary and e2.last_name = 'Abel';
#方法二:子查询
select e2.last_name ,e2.salary
from employees e2
where e2.salary >
(select e.salary
from employees e
where e.last_name = 'Abel');
#返回job_id与141号员工相同,salary比143号员工多的员工
# 姓名,job_id 和工资
select e3.first_name ,e3.job_id ,e3.salary
from employees e3
where e3.job_id =
(select e.job_id
from employees e
where e.employee_id = 141)
and e3.salary >
(select e2.salary
from employees e2
where e2.employee_id = 143);
#返回公司工资最少的员工的last_name,job_id和salary
select e2.last_name,e2.job_id,e2.salary
from employees e2
where e2.salary =(
select min(e.salary )
from employees e );
#查询最低工资大于50号部门最低工资的部门id和其最低工资
select e2.department_id ,min(e2.salary )
from employees e2
where e2.department_id is not null
group by e2.department_id
having min(e2.salary ) >
(
select min(e.salary)
from employees e
where e.department_id = 50
);
/*
多行子查询 : 子查询的结果有多条数据。
使用的运算符:
in:等于列表中的任意一个
any: 和子查询返回的某一个值比较
all: 和子查询返回的所有值比较
*/
#返回其它部门中比job_id为‘IT_PROG’部门任一工资低的员工的员
# 工号、姓名、job_id 以及salary
select e2.first_name ,e2.job_id ,e2.salary
from employees e2
where e2.salary < any(
select distinct e.salary
from employees e
where e.job_id = 'IT_PROG'
) and e2.job_id != 'IT_PROG';
#题目:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工
# 的员工号、姓名、job_id 以及salary
select e2.first_name ,e2.job_id ,e2.salary
from employees e2
where e2.salary < all(
select distinct e.salary
from employees e
where e.job_id = 'IT_PROG'
) and e2.job_id != 'IT_PROG';
/*
对库的管理
1.创建库 : create database 库名
2.删除库 : drop database 库名
对表的管理
1.创建表 :
create table 表名(
字段名 类型,
字段名2 类型,
......
)
2.删除表 :drop table 表名
3.修改表名:alter table 原表名 rename to 新表名
4.清空表:TRUNCATE TABLE 表名
*/
#创建库
CREATE DATABASE cangjie;
#删除库
DROP DATABASE cangjie;
#创建表 - 白手起家
CREATE TABLE person(
pid INT,
pname VARCHAR(20),
score DOUBLE(4,1)
);
#创建表 - 复制表
CREATE TABLE person
AS
SELECT first_name,department_id
FROM employees;
-- 下面的操作很少极少非常少 ----
#删除表
DROP TABLE person;
#修改表名
ALTER TABLE person RENAME TO person2;
#查询表结构
DESC person;
#修改列
#格式 :alter table 表名 add/drop/modify/change column 【字段名-不同操作有区别】
#1.添加一列
ALTER TABLE person ADD COLUMN page INT;
#2.删除一列
ALTER TABLE person DROP COLUMN page;
#3.修改列的类型
ALTER TABLE person MODIFY COLUMN pid VARCHAR(20);
#4.修改列的名称
ALTER TABLE person CHANGE COLUMN pid ppid VARCHAR(20);
#清空表
TRUNCATE TABLE person2;
/*
数据处理之 :增,删,改
*/
#删除表
DROP TABLE person;
#创建表
CREATE TABLE person(
pid INT,
pname VARCHAR(20),
score DOUBLE(4,1)
);
#查询表
SELECT * FROM person;
/*
插入数据:
insert into 表名(字段名1,字段名2,字段名......) values(值1,值2,值3....)
修改数据:
update 表名 set 字段名=值,字段名2=值....... where 修改的条件
删除数据:
delete from 表名 where 删除的条件
*/
#注意:字段顺序和值的顺序必须保持一致。
INSERT INTO person(pid,pname,score) VALUES(1,'小龙哥',100);
INSERT INTO person(pname,pid,score) VALUES('小哥哥',2,101);
#注意:如果表名后面没有写字段名,那么值默认和字段的顺序依次对应(个数和顺序都不能错)
INSERT INTO person VALUES(3,'小空空',102);
#注意:可以指定只给某些字段插入数据,表名后面必须加字段名。
#需求 :只插入pid和pname
INSERT INTO person(pid,pname) VALUES(4,'小坤坤');
#需求:一次插入多条数据
INSERT INTO person VALUES(5,'小飞飞',100),(6,'小钻石',100),(7,'小辉辉',100);
#需求:将查询出的数据添加到表中
INSERT INTO person(pname)
SELECT first_name
FROM employees; #将employees中first_name字段中所有数据插入到person的pname字段中
/*
修改表中的数据:
update 表名 set 字段名=值,字段名2=值....... where 修改的条件
*/
UPDATE person SET score=300,pname='小杰杰' WHERE pid=1;
/*
删除表中的数据
delete from 表名 where 删除的条件
*/
#需求:删除pid为null的数据
DELETE FROM person WHERE pid IS NULL;#DELETE FROM person :删除表中的所有数据
/*
事务的操作:
1.设置提交状态:SET AUTOCOMMIT = FALSE;
2.开启事务
3.执行相应的执行语句
4.提交、回滚
*/
#设置提交状态
SET autocommit=FALSE;
#开启事务
START TRANSACTION;
UPDATE account SET abalance=900 WHERE aname='aa';
-- 发生异常----
UPDATE account SET abalance=1100 WHERE aname='cc';
#提交 - 一旦提交将不能再回滚
COMMIT;
#回滚
ROLLBACK;