1 数据库的好处
- 可以持久化数据到本地
- 结构化查询
2 数据库的常见概念
- DS:数据库,存储数据的容器
- DBNS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
- SQL:结构化查询语言
3 数据库存储数据的特点
- 数据存到列表中,然后再放回到库中
- 一个库中可以有多张表,每张表具有唯一的表名用来标识自己
- 表中有一个或多个列,列又称为“字段”,相当于属性
- 表中的每一行数据库,相当于java中‘对象’
4 语法规范
- 不区分大小写
- 每条命令用分号结尾
- 每条命令根据需要可以进行缩进和换行
- 单行注释: #或–
- 多行注释:/* 注释文字 */
5 常见命令
- show databases; 显示数据库
- use 库名; 进入某个指定库
- show tables from xx(库名); 展示某个库当中的表
- select database(); 查看当前所在库
- select * from (表名); 看表当中的数据
- create table name(id int, name varchar(20)); 创建一个表
- insert into name (属性名) values (值)
- desc 表明; 查看某表的结构
6 DQL语言
SELECT last_name From employees;
SELECT last_name,salary,email FROM employees;
SELECT * FROM employees;
SELECT 100;
SELECT 'john';
SELECT VERSION();
SELECT 100%98
SELECT 100%98 AS 结果;
SELECT last_name as 姓, first_name as 名 FROM employees;
SELECT last_name 姓,first_name 名 FROM employees;
SELECT last_name AS 'out put' FROM employees;
SELECT DISTINCT department_id FROM employees;
SELECT CONCAT(last_name,' ',first_name) AS 姓名 FROM employees;
DESC departments;
SELECT IFNULL(commission_pct,0) AS 奖金率,
commission_pct
From
employees;
SELECT concat(last_name,'-',first_name) AS 姓名 from employees where salary >= 12000;
SELECT * from employees where salary >= 12000;
SELECT
CONCAT(last_name,' ',first_name,' id:',department_id) as INFO
FROM
employees
WHERE
department_id <> 90;
SELECT
CONCAT(last_name,' ',first_name) AS 姓名,
salary AS 工资,
commission_pct AS 奖金,
FROM
employees
WHERE
salary>10000 and salary<20000;
SELECT *
FROM employees
WHERE ((0<department_id<90) OR (110<department_id)) OR salary>15000;
SELECT job_id FROM employees WHERE salary>10000;
SELECT * From employees WHERE last_name LIKE '%a%';
SELECT last_name from employees where last_name LIKE '__a_l%';
SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
SELECT
last_name,job_id
FROM
employees
WHERE
job_id IN ('AD_Vp','IT_PROT','AD_PRES');
SELECT
last_name,commission_pct
FROM
employees
WHERE
commission_pct IS NULL;
SELECT
last_name,commission_pct
FROM
employees
WHERE
commission_pct <=> NULL;
SELECT
last_name,
department_id,
salary*12*IFNULL(1+commission_pct,0) AS 年薪
FROM
employees
WHERE
job_id = 176;
SELECT
salary,
last_name
FROM
employees
WHERE
(commission_pct is null) and (salary<18000);
DESC employees;
SELECT
*
FROM
employees
WHERE
(job_id not LIKE 'IT%') OR (salary = 12000);
DESC departments;
SELECT
department_id
FROM
departments;
SELECT * FROM employees;
SELECT * FROM employees WHERE commission_pct LIKE '%%' AND last_name LIKE '%%';
SELECT * FROM employees ORDER BY salary DESC;
SELECT * FROM employees WHERE department_id >=90 order by hiredate ASC;
SELECT *,salary*12*(IFNULL(commission_pct,0)+1) AS 年薪 FROM employees ORDER BY salary*12*(IFNULL(commission_pct,0)+1) DESC;
SELECT *,salary*12*(IFNULL(commission_pct,0)+1) AS 年薪 FROM employees ORDER BY 年薪 DESC;
SELECT LENGTH(last_name) 字节长度,last_name,salary from employees ORDER BY 字节长度;
SELECT *
FROM employees
ORDER BY salary ASC,job_id DESC;
SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 DESC, last_name ASC;
SELECT last_name,salary FROM employees WHERE salary<8000 OR salary>17000 ORDER BY salary DESC;
SELECT * FROM employees WHERE email LIKE '%e%' ORDER BY LENGTH(email) DESC,department_id ASC;
SELECT length('wada');
select concat(upper(last_name),lower(first_name)) 姓名 FROM employees;
SELECT SUBSTR('李莫愁爱上了陆展元',6) out_put;
SELECT SUBSTR('李莫愁爱上了陆展元',1,3) out_put;
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) FROM employees;
SELECT INSTR('杨不美爱上了我的我','我的我') as out_put;
SELECT TRIM('d' FROM'd d d d d') out_put;
SELECT LPAD('殷素素',10,'*') AS out_put;
SELECT REPLACE('aassd','a','q') AS out_put;
SELECT ROUND(1.653,2);
SELECT CEIL(0.1);
SELECT FLOOR(0.1);
SELECT TRUNCATE(1.65,1);
SELECT MOD(-10,-3);
SELECT NOW();
SELECT YEAR(NOW()) 年;
SELECT YEAR(hiredate) FROM employees;
SELECT MONTH(hiredate) FROM employees;
SELECT MONTHNAME(hiredate) FROM employees;
SELECT STR_TO_DATE('09-1-2020','%m-%d-%Y');
SELECT * FROM employees WHERE hiredate = '1992-4-3';
SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3-1992','%c-%d-%Y');
SELECT DATE_FORMAT(NOW(),'%Y-%c-%d');
SELECT last_name 姓名,DATE_FORMAT(hiredate,'%m月/%d日/%y年') 入职日期 FROM employees WHERE commission_pct is NOT NULL;
SELECT VERSION();
SELECT DATABASE();
SELECT user();
SELECT IF(10>5,'大','小');
SELECT last_name,commission_pct,IF(commission_pct is not NULL,'有奖金','无奖金')
FROM employees;
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;
SELECT salary 工资,
case
WHEN salary>20000 THEN 'A级'
WHEN salary>15000 THEN 'B级'
WHEN salary>10000 THEN 'C级'
ELSE 'D级'
END AS 工资级别
FROM employees;

SELECT SUM(salary) FROM employees;
SELECT avg(salary) FROM employees;
SELECT COUNT(salary) FROM employees;
SELECT MAX(last_name),MIN(last_name) FROM employees;
SELECT SUM(commission_pct),AVG(commission_pct) FROM employees;
SELECT SUM(DISTINCT salary),sum(salary) FROM employees;
SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees;
SELECT COUNT(*) FROM employees;
SELECT COUNT(1) FROM employees;
SELECT AVG(salary),employee_id FROM employees;
SELECT MAX(salary),MIN(salary),AVG(salary),AVG(salary),SUM(salary) FROM employees;
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) 'DIFFRENCE' FROM employees;
SELECT COUNT(*) FROM employees WHERE department_id=90;
SELECT AVG(salary) FROM employees;
SELECT MAX(salary),job_id FROM employees
GROUP BY job_id;
SELECT COUNT(*),department_id FROM departments GROUP BY location_id;
SELECT AVG(salary) FROM employees WHERE email LIKE '%a%' GROUP BY department_id;
SELECT manager_id,MAX(salary) 最高工资 FROM employees WHERE commission_pct is not null GROUP BY manager_id;
SELECT COUNT(*) 员工个数,department_id FROM employees GROUP BY department_id
HAVING 员工个数>2
;
SELECT MAX(salary) 最高工资, job_id 工种编号 FROM employees WHERE commission_pct is not null GROUP BY job_id
HAVING 最高工资>12000;
SELECT manager_id 领导编号,MIN(salary),job_id FROM employees WHERE manager_id>102
GROUP BY 领导编号
HAVING MIN(salary) >5000;
SELECT `name`,boyName FROM beauty,boys
WHERE beauty.boyfriend_id = boys.id;
SELECT last_name 员工名, department_name 部门名 FROM employees,departments
WHERE employees.department_id = departments.department_id;
SELECT last_name 员工名,e.job_id 工种号, job_title 工种名
FROM employees e,jobs
WHERE e.job_id = jobs.job_id;
SELECT last_name,department_name
FROM employees E, departments D
WHERE E.department_id = D.department_id AND commission_pct IS NOT NULL;
SELECT department_name 部门名, city 城市名
FROM departments D,locations L
WHERE D.location_id = L.location_id
AND city LIKE '_o%';
SELECT city 城市, count(*) 部门个数
FROM locations L,departments D
WHERE L.location_id=D.location_id
GROUP BY 城市;
SELECT department_name 部门名,D.manager_id 领导编号,MIN(salary) 最低工资
FROM employees E, departments D
WHERE E.department_id = D.department_id
and commission_pct is not null
GROUP BY 部门名,D.manager_id;
SELECT job_title 工种名, COUNT(*) 员工个数
FROM employees e,jobs j
WHERE e.job_id = j.job_id
GROUP BY 工种名
ORDER BY 员工个数 DESC;
SELECT last_name 员工名, department_name 部门名,city 城市
FROM employees E, departments D, locations L
WHERE E.department_id = D.department_id AND D.location_id =L.location_id;
CREATE TABLE job_grades
(grade_level VARCHAR(3),
lowest_sal INT,
highest_sal INT);
INSERT into job_grades
VALUES ('A',1000,2999);
INSERT into job_grades
VALUES ('B',3000,5999);
INSERT into job_grades
VALUES ('C',6000,9999);
INSERT into job_grades
VALUES ('D',10000,14999);
INSERT into job_grades
VALUES ('E',15000,24999);
INSERT into job_grades
VALUES ('A',25000,40000);
SELECT salary,grade_level
FROM employees E,job_grades J
WHERE salary BETWEEN J.lowest_sal AND J.highest_sal;
SELECT e.last_name 员工名, e.employee_id 员工编号, m.last_name,m.manager_id 上级编号
FROM employees e,employees m
WHERE e.manager_id = m.employee_id;
SQL99
SELECT last_name,department_name
FROM employees e INNER JOIN departments d
ON e.department_id = d.department_id;
SELECT last_name 员工名,job_title 工种名
FROM employees e
INNER JOIN jobs j
on j.job_id = e.job_id
WHERE e.last_name LIKE '%e%';
SELECT city 城市名, count(*) 部门个数
FROM locations l
INNER JOIN departments d
on l.location_id =d.location_id
group by city
having 部门个数>=3;
SELECT department_name 部门名,COUNT(*) 员工个数
FROM departments d
INNER JOIN employees e
on d.department_id =e.department_id
GROUP BY department_name
HAVING 员工个数>3
ORDER BY 员工个数 DESC;
SELECT last_name 员工名,department_name 部门名,job_title 工种名
FROM employees e
INNER JOIN departments d
on e.department_id = d.department_id
INNER JOIN jobs j
on e.job_id = j.job_id
ORDER BY 部门名 DESC;
SELECT salary 工资,grade_level 工资级别
FROM employees e
inner join job_grades g
on e.salary BETWEEN g.lowest_sal and g.highest_sal;
SELECT COUTN(*) 个数,grade_level 工资级别
FROM employees e
INNER JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal and g.highest_sal
GROUP BY 工资级别
HAVING COUNT(*)>20
ORDER BY 工资级别 DESC;
SELECT e.last_name,m.last_name
FROM employees e
INNER JOIN employees m
ON e.manager_id = m.employee_id;
SELECT b.name,bo.*
FROM beauty b
left outer join boys bo
on b.boyfriend_id = bo.id;
SELECT d.*,e.employee_id
FROM departments d
left outer join employees e
on e.department_id = d.department_id
HAVING e.employee_id is null;
SELECT bo.*, b.id
FROM beauty b
LEFT JOIN boys bo
ON bo.id = b.boyfriend_id
WHERE b.id >3;
SELECT city 城市
FROM locations l
left join departments d
on d.location_id = l.location_id
WHERE d.location_id is NULL;
SELECT d.department_name,e.*
FROM employees e
RIGHT JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name = 'SAL'
or d.department_name = 'IT';
子查询
SELECT * FROM employees
WHERE salary>
(
SELECT salary FROM employees
WHERE last_name ='Abel'
);
SELECT last_name,job_id,salary FROM employees
WHERE job_id =
(
SELECT job_id FROM employees
WHERE employee_id = 141
)
AND salary >
(
SELECT salary FROM
employees
WHERE employee_id=143
);
SELECT last_name,job_id,salary
FROM employees
WHERE salary =
(
SELECT MIN(salary) FROM employees
);
SELECT department_id,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary)>
(
SELECT MIN(salary) FROM employees
WHERE department_id = 50
);
SELECT department_name,location_id
from departments GROUP BY location_id
WHERE location_id =1400
SELECT last_name FROM employees
WHERE department_id IN
(
SELECT DISTINCT department_id
from departments
WHERE location_id IN (1400,1500)
);
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ANY(
SELECT salary
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id <> 'IT_PROG';
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary <
(
SELECT MIN(salary) FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id <> 'IT_PROG';
SELECT * FROM employees
WHERE (employee_id,salary)=
(
SELECT MIN(employee_id),MAX(salary) FROM employees
);
SELECT * FROM employees
WHERE employee_id =
(
SELECT MIN(employee_id) FROM employees
) AND salary =
(
SELECT MAX(salary) FROM employees
);
SELECT d.*,
(
SELECT COUNT(*) FROM employees e
WHERE e.department_id = d.department_id
) 个数
FROM departments d;
SELECT
(
SELECT department_name FROM departments d
INNER JOIN employees e
ON e.department_id =d.department_id
WHERE e.employee_id = 102
);
SELECT aga.*,department_id,grade_level
FROM
(
SELECT AVG(salary) ag,department_id FROM employees
GROUP BY department_id
) aga
INNER JOIN job_grades g
ON aga.ag BETWEEN g.lowest_sal and g.highest_sal;
SELECT department_name
FROM departments d
WHERE EXISTS(
SELECT * FROM employees e
WHERE e.department_id =d.department_id
);
SELECT bo.* FROM boys bo
WHERE NOT EXISTS(
SELECT * FROM beauty b
WHERE bo.id = b.boyfriend_id
);
SELECT last_name,salary,department_name FROM employees,departments
WHERE department_name = (
SELECT department_name FROM departments d,employees e
WHERE last_name = 'Zlotkey' AND d.department_id =e.department_id
);
SELECT employee_id,last_name,salary FROM employees e
WHERE salary > (
SELECT avg(salary) FROM employees
);
SELECT employee_id,last_name,salary FROM
(
SELECT AVG(salary) aa,department_id FROM employees
GROUP BY department_id
) A
INNER JOIN employees e
ON e.department_id = A.department_id
WHERE salary>A.aa;
SELECT employee_id,last_name FROM employees
WHERE department_id IN(
SELECT DISTINCT department_id FROM employees
WHERE last_name LIKE '%u%'
);
SELECT employee_id,last_name FROM(
SELECT DISTINCT department_id FROM employees
WHERE last_name LIKE '%u%'
) d INNER JOIN employees e
on d.department_id = e.department_id
WHERE e.department_id;
SELECT last_name,salary FROM employees e
WHERE e.manager_id IN (
SELECT employee_id FROM employees m
WHERE m.last_name = 'K_ing'
);
SELECT * FROM employees LIMIT 0,5;
SELECT * FROM employees LIMIT 10,15;
SELECT * FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC
LIMIT 0,10;
SELECT last_name FROM employees
WHERE employee_id IN
(
SELECT manager_id FROM employees
);
SELECT last_name,salary FROM employees
WHERE salary = (SELECT MIN(salary) FROM employees
);
SELECT * FROM departments
WHERE department_id = (
SELECT department_id FROM employees e
GROUP BY e.department_id
order by AVG(salary) ASC
LIMIT 1);
SELECT AVG(salary),department_id FROM employees
GROUP BY department_id;
SELECT MIN(ag)
FROM
(
SELECT AVG(salary) ag,department_id FROM employees
GROUP BY department_id
) agg;
SELECT d.* FROM departments d
WHERE d.department_id =
(SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) =
(
SELECT MIN(ag)
FROM
(
SELECT AVG(salary) ag,department_id FROM employees
GROUP BY department_id
) agg
)
);
SELECT d.*,ag
FROM departments d
INNER JOIN
(
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 1
) agg
on agg.department_id = d.department_id;
SELECT j.* FROM jobs j
WHERE j.job_id =
(
SELECT job_id FROM employees
GROUP BY job_id
order by AVG(salary) DESC
LIMIT 1
);
SELECT department_id,avg(salary) FROM employees
GROUP BY department_id
HAVING AVG(salary)>
(
SELECT AVG(salary)
FROM employees
);
SELECT e.* FROM employees e
WHERE e.employee_id IN
(
SELECT employee_id FROM employees
WHERE employee_id IN
(
SELECT manager_id FROM employees
)
);
SELECT MIN(salary) FROM employees
WHERE department_id = (
SELECT department_id FROM employees
GROUP BY department_id
ORDER BY MAX(salary) desc
LIMIT 1);
SELECT
last_name,d.department_id,email,salary
FROM employees e
INNER JOIN departments d
ON d.manager_id = e.employee_id
WHERE d.department_id =(
SELECT department_id FROM employees
GROUP BY department_id
ORDER BY AVG(salary) DESC
LIMIT 1
);
SELECT *
FROM employees
WHERE department_id >90 OR email like '%a%';
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id >90;
7 DML
INSERT INTO beauty(id,`name`,sex,borndate,phone,photo,boyfriend_id)
VALUES(13,'古力娜扎','女','1994-1-7','122222222',NULL,2);
SELECT * FROM beauty;
INSERT INTO beauty(id,`name`,sex,borndate,phone,boyfriend_id)
VALUES(14,'唐艺昕','女','1984-1-7','144444444',3);
SELECT * FROM beauty;
INSERT INTO beauty
VALUES(18,'张飞','男',NULL,'119',NULL,NULL);
insert into beauty(id,`name`,phone)
SELECT 26,'宋茜','11809866';
UPDATE beauty
SET phone = '13899888899'
WHERE `name` LIKE '唐%';
UPDATE beauty b
INNER JOIN boys bo
ON b.boyfriend_id = bo.id
set phone='115'
WHERE b.boyfriend_id = 1;
UPDATE boys
SET boyName = '张飞',userCP =10
WHERE id = 2;
SELECT * FROM boys;
UPDATE beauty b
LEFT JOIN boys bo
ON b.boyfriend_id = bo.id
SET b.boyfriend_id = 2
WHERE b.boyfriend_id IS NULL;
DELETE FROM beauty WHERE phone LIKE '%9';
delete b
FROM beauty b
JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE b.boyfriend_id = 1;
TRUNCATE TABLE boys WHERE userCP >100;
DDL语句
create DATABASE IF NOT exists books;
ALTER DATABASE books CHARACTER SET gbk;
Drop DATABASE books;
Create database books;
Create table Book(
id INT,
bname VARCHAR(20),
price DOUBLE,
authorid INT,
publishdate VARCHAR(20)
);
ALTER TABLE BOOK CHANGE COLUMN PUBLISHDATE PD VARCHAR(20);
DESC BOOK;
ALTER TABLE BOOK MODIFY COLUMN PD TIMESTAMP;
ALTER TABLE BOOK ADD COLUMN ANNUAL DOUBLE;
ALTER TABLE BOOK DROP COLUMN ANNUAL;
ALTER TABLE BOOK RENAME TO BOOKK;
DROP TABLE book;
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;
DROP TABLE IF EXISTS 旧表名;
CREATE table 新表名;
create TABLE author(
id INT,
an_name varchar(20),
nation VARCHAR(20)
);
Insert into author VALUES
(1,'村上春树','日本'),
(2,'莫言','中国'),
(3,'冯唐','中国'),
(4,'金庸','中国');
SELECT * FROM AUTHOR;
create table copy like author;
create TABLE copy2
SELECT * from author;
create table copy3
SELECT id,an_name
FROM author
WHERE 0;
常见类型
CREATE TABLE tab_int(
t1 INT,
t2 INT UNSIGNED
);
desc tab_int;
SELECT * FROM employees
WHERE salary = (
SELECT MIN(salary) FROM employees
);
SELECT * FROM departments WHERE department_id =
(SELECT department_id FROM employees ORDER BY AVG(salary) LIMIT 1
);
SELECT d.*, avgg.ag FROM departments d INNER JOIN(
SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) LIMIT 1
) avgg on d.department_id = avgg.department_id;
SELECT * FROM jobs WHERE job_id =(
SELECT job_id FROM employees GROUP BY job_id ORDER BY AVG(salary) DESC LIMIT 1);
SELECT department_id, AVG(salary) 平均工资 FROM employees GROUP BY department_id HAVING 平均工资 >
(
SELECT AVG(salary) FROM employees
);
SELECT * FROM employees WHERE employee_id =any
(
SELECT manager_id FROM employees
);
SELECT MIN(salary) FROM employees WHERE department_id =(
SELECT department_id FROM employees GROUP BY department_id ORDER BY MAX(salary) DESC LIMIT 1
);
SELECT last_name,department_id email, salary FROM employees WHERE department_id = (
SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) DESC LIMIT 1) AND
manager_id IN (
SELECT manager_id FROM employees WHERE department_id = (SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) DESC LIMIT 1)
)
;
SELECT last_name FROM employees E
UNION
SELECT job_title FROM jobs J;
USE myemployees;
CREATE TABLE my_employees(
id INT(10),
First_name VARCHAR(10),
Last_name VARCHAR(10),
Userid VARCHAR(10),
Salary DOUBLE(10,2)
);
CREATE TABLE users(
id INT,
userid VARCHAR(10),
department_id INT
);
INSERT INTO my_employees
VALUES(1,'patel','Ralph','Rpatel',895)
,(2,'Dancs','Betty','Bdancs',860)
,(3,'Biri','Ben','Bbiri',1100)
,(4,'Newman','Chad','Cnewman',750)
,(5,'Ropeburn','Audrey','Aropebur',1550);
CREATE database IF NOT EXISTS books;
RENAME DATABASE books to
ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;