DDl 数据定义语言
#1. 创建表 CREATE TABLE
#方式一:
CREATE TABLE emp3(
id INT,
NAME VARCHAR(20),
birthday DATE,
salary DOUBLE(10,2)
)
CREATE TABLE emp2(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10)
)
#方式二:基于现有表创建新表(相当于表的复制)
CREATE TABLE mep4 AS SELECT id,NAME FROM emp;
CREATE TABLE emp5 AS SELECT * FROM emp;
CREATE TABLE emp4
AS
SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 90;
#基于现有表创建新表,但是不导入数据
CREATE TABLE emp5
AS
SELECT employee_id, last_name, salary
FROM employees
WHERE 1 = 2;
DML : 数据操纵语言
#1. 添加数据
INSERT INTO emp
VALUES(101, '张三', '1990-01-01', 10000);
INSERT INTO emp(id, NAME, hire_ddate)
VALUES(103, '李四', '1990-01-01');
INSERT INTO emp(salary)
VALUES(8888);
#基于现有表导入数据
INSERT INTO emp
SELECT employee_id, last_name, phone_number, salary
FROM employees
WHERE department_id = 90;
INSERT INTO emp(id, NAME, salary)
SELECT employee_id, last_name, salary
FROM employees;
#2. 删除数据
DELETE FROM emp
WHERE id = 0;
DELETE FROM emp
WHERE id IS NULL;
#3. 修改数据
UPDATE emp
SET hire_ddate = '1990-11-11'
WHERE id = 103;
UPDATE emp
SET hire_ddate = '1989-11-11', salary = 20000.00
WHERE id = 101;
#4. 查询
SELECT * FROM emp;
DCL : 数据控制语言(对DDL语言无法进行回滚)
SET autocommit = FALSE;(取消自动提交)
COMMIT;
ROLLBACK;
常用sql语句
SELECT employee_id,last_name,salary AS SAL,salary*12*(1+IFNULL(commission_pct,0)) AS "annul salary"
FROM employees;
字符型和日期型值必须使用在单引号中,
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE last_name='KING';
#between ... and ... (包含边界) 数值小的在前面
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE salary BETWEEN 6000 AND 10000 ;
SELECT *
FROM employees
WHERE salary>=6000 AND salary<=8000 AND commission_pct IS NOT NULL
#in用法
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE department_id IN (60,80,90);
SELECT employee_id,last_name,salary,department_id
FROM employees
WHERE department_id NOT IN (60,80,90);
SELECT employee_id,last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
# 模糊查询 like
#1. % : 表示0个或多个的任意字符
# 显示名字包含 e 的员工信息
SELECT employee_id ,last_name,salary,department_id
FROM employees
WHERE last_name LIKE '%e%';
# _ : 表示1个任意字符
#2 显示第二个字母是 e 的员工信息
SELECT employee_id,last_name,salary
FROM employees
WHERE last_name LIKE '_e%';
#3 返回名字中有_的员工
SELECT employee_id,last_name,salary
FROM employees
WHERE last_name LIKE '%/_%' ESCAPE '/'; -- 此处可以用任意当转义字符
# 显示出表employees中的全部job_id(不能重复)
SELECT DISTINCT job_id
FROM employees;
#按别名排序
SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) "年薪"
FROM employees
ORDER BY 年薪 DESC; 此处别名不加双引号
#格式化日期
select * from t_apply_pay where DATE_FORMAT(createTime,'%Y-%m-%d') = '2018-12-05';
select * from t_apply_pay where createTime >= '2018-12-05 00:00:00' AND createTime <'2018-12-06 00:00:00'; #10
#包含边界
select * from t_apply_pay where createTime BETWEEN '2018-12-05 00:00:00' AND '2018-12-05 23:59:59';
#按照年月日分组
select year(createTime),month(createTime),day(createTime),count(0) from t_apply_pay GROUP BY year(createTime),month(createTime),day(createTime);
#二 多表查询
/*根据查询情况不同 多表查询可以分为以下几种
①等值连接 - 非等值连接
②內连接 - 外连接
③自连接 - 非自连接
*/
#问题:当完成多表查咨询时,容易引发 笛卡尔集 的情况 如下 原因:缺少表之间的连接情况
SELECT employee_id,department_name
FROM employees,departments;
#增连接条件 解决加笛卡尔集 和下面内连接语句效果一样
SELECT employee_id,department_name
FROM employees,departments;
WHERE employees.`department_id`=departments.`department_id`;
#内连接(将两个表中满足条件的数据查出来) sql99语法适合所有数据库
SELECT employee_id,e.deoartment_id,department_name
FROM employees e
INNER JOIN departments d -- inner join(内连接) inner可以省略不写
ON e.`department_id`=d.`department_id`;
# 外连接:不仅将多个表中满足条件的数据查询出来,还将不满足条件的数据查询出来
-- 左外连接:不仅将多个表中满足条件的数据查询出来,还将 左表 中不满足条件的数据查询出来
SELECT employee_id,last_name,e.department_id,department_name
FROM employees e
LEFT OUTER JOIN departments d
ON e.`department_id`=d.`department_id`;
-- 右外连接:不仅将多个表中满足条件的数据查询出来,还将 右表 中不满足条件的数据查询出来
SELECT employee_id,last_name,e.department_id,department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON e.`department_id`=d.`department_id`;
#以上是非自连接
#自连接(一个表之间的连接,将一个表看作两个表即可)
# xxx works for xxx
SELECT CONCAT(e.last_name,' works for ',m.last_name)
FROM employees e
JOIN employees m
ON e.`manager_id`=m.`employee_id`
下面用图标的方法表示sql的七连接
建表语句
CREATE TABLE `tbl_dept` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30) DEFAULT NULL,
`locAdd` VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `tbl_emp` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`deptId` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_dept_id` (`deptId`)
#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `tbl_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('HR',12);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MK',13);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MIS',14);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('FD',15);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z3',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z4',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z5',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('w5',2);
INSERT INTO tbl_emp(NAME,deptId) VALUES('w6',2);
INSERT INTO tbl_emp(NAME,deptId) VALUES('s7',3);
INSERT INTO tbl_emp(NAME,deptId) VALUES('s8',4);
INSERT INTO tbl_emp(NAME,deptId) VALUES('s9',51);
七图中FULL OUTRE JOIN... ON...在orcal中可以,在mysql中用union来实现
单行函数:方法中传入单行变量,返回结果为一个值
#转换大小写的函数
SELECT LOWER ('HelloWorld') 转小写,UPPER('HelloWorld') "转大写";
#拼串的函数
SELECT CONCAT('Hello','World') 拼串儿;
#截取字符串
-- 注意:SQL中的索引是从1开始
-- 从第几个索引位置开始,截取几个
-- substr后不能有空格,否则方法报错
SELECT SUBSTR('HelloWorld',2,5);
#字符个数
SELECT LENGTH('HelloWorld');
#某个字符出现的索引位置,没有返回0
SELECT INSTR('Helloworld','o');
SELECT INSTR('Helloworld','or');
#去除首尾指定字符,包括空格
SELECT TRIM('H' FROM 'HelloWHHorldHH'),TRIM(' ' FROM ' HelloWHHorldHH ');
#替换
SELECT REPLACE('abcbbdbbbBBBe','b','m');
#对数字四舍五入
SELECT ROUND(163.4556,0),ROUND(163.456,-2);
#截断数字
SELECT TRUNCATE(163.456,2),TRUNCATE(163.456,0),TRUNCATE(163.456,-2);
#求余数
SELECT MOD(15,2),MOD(15,3),MOD(5,10);
#练习:查询部门号为 所有 的员工信息, 若部门号为 10,则打印其工资的 1.1 倍,
# 部门号为 20,则打印其工资的 1.2 倍,
# 部门号为 30,则打印其工资的 1.3 倍,
# 其他打印其工资的 1.4 倍.
SELECT last_name,department_id,salary,CASE department_id WHEN 10 THEN salary*1.1
WHEN 20 THEN salary*1.2
WHEN 30 THEN salary*1.3
ELSE salary*1.4
END haha #haha为别名,job_id
FROM employees
组行数(多行函数):方法中传入多行变量,返回一个值
#组函数
#MAX() MIN() SUM() AVG() COUNT()
#组函数不计算空值
SELECT COUNT(commission_pct)
FROM employees;
SELECT AVG(commission_pct), SUM(commission_pct) / COUNT(IFNULL(commission_pct, 0))
FROM employees;
#group by 分组
#求出 employees 表中各个部门的平均工资
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id;
#求出每个部门中每个工种(job_id)的平均工资
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id,job_id;
#where 子句不能过滤组函数。 需要 having
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 8000;
#分页公式:
#limit (当前页数-1)*每页条数,每页条数
#SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize
SELECT * FROM employees LIMIT (1-1)*10, 10; -- 第1页
SELECT * FROM employees LIMIT (2-1)*10, 10; -- 第2页
SELECT * FROM employees LIMIT (n-1)*10, 10; -- 第n页