DDL:
创建表:
CREATE TABLE [IF NOT EXISTS] 表名(ITCAST_0001
列名 列类型,
列名 列类型,
...
列名 列类型
);
* 查看当前数据库中所有表名称:SHOW TABLES;
* 查看指定表的创建语句:SHOW CREATE TABLE 表名(了解);
* 查看表结构:DESC 表名;
* 删除表:DROP TABLE 表名;
* 修改表:前缀:ALTER TABLE 表名
> 修改之添加列:
ALTER TABLE 表名 ADD (
列名 列类型,
列名 列类型,
...
);
> 修改之修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据):ALTER TABLE 表名 MODIFY 列名 列类型;
> 修改之修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
> 修改之删除列:ALTER TABLE 表名 DROP 列名;
> 修改表名称:ALTER TABLE 原表名 RENAME TO 新表名;
CREATE TABLE [IF NOT EXISTS] 表名(ITCAST_0001
列名 列类型,
列名 列类型,
...
列名 列类型
);
* 查看当前数据库中所有表名称:SHOW TABLES;
* 查看指定表的创建语句:SHOW CREATE TABLE 表名(了解);
* 查看表结构:DESC 表名;
* 删除表:DROP TABLE 表名;
* 修改表:前缀:ALTER TABLE 表名
> 修改之添加列:
ALTER TABLE 表名 ADD (
列名 列类型,
列名 列类型,
...
);
> 修改之修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据):ALTER TABLE 表名 MODIFY 列名 列类型;
> 修改之修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
> 修改之删除列:ALTER TABLE 表名 DROP 列名;
> 修改表名称:ALTER TABLE 原表名 RENAME TO 新表名;
alter table 表名
add (
列名 列类型,
列名 列类型,
...
列名 列类型
)
alter table 表名
modify 列名 列新的类型
modify 列名 列新的类型
alter table 表名
rename to 新名
rename to 新名
========================================================================================
DML(数据操作语言,它是对表记录的操作(增、删、改)!)
1. 插入数据
* INTERT INTO 表名(列名1,列名2, ...) VALUES(列值1, 列值2, ...);
> 在表名后给出要插入的列名,其他没有指定的列等同与插入null值。所以插入记录总是插入一行,不可能是半行。
> 在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应
* INTERT INTO 表名 VALUES(列值1, 列值2)
> 没有给出要插入的列,那么表示插入所有列。
> 值的个数必须是该表列的个数。
> 值的顺序,必须与表创建时给出的列的顺序相同。
* INTERT INTO 表名(列名1,列名2, ...) VALUES(列值1, 列值2, ...);
> 在表名后给出要插入的列名,其他没有指定的列等同与插入null值。所以插入记录总是插入一行,不可能是半行。
> 在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应
* INTERT INTO 表名 VALUES(列值1, 列值2)
> 没有给出要插入的列,那么表示插入所有列。
> 值的个数必须是该表列的个数。
> 值的顺序,必须与表创建时给出的列的顺序相同。
2. 修改数据
* UPDATE 表名 SET 列名1=列值1, 列名2=列值2, ... [WHERE 条件]
* 条件(条件可选的):
> 条件必须是一个boolean类型的值或表达式:UPDATE t_person SET gender='男', age=age+1 WHERE sid='1';
> 运算符:=、!=、<>、>、<、>=、<=、BETWEEN...AND、IN(...)、IS NULL、NOT、OR、AND
* UPDATE 表名 SET 列名1=列值1, 列名2=列值2, ... [WHERE 条件]
* 条件(条件可选的):
> 条件必须是一个boolean类型的值或表达式:UPDATE t_person SET gender='男', age=age+1 WHERE sid='1';
> 运算符:=、!=、<>、>、<、>=、<=、BETWEEN...AND、IN(...)、IS NULL、NOT、OR、AND
WHERE age >= 18 AND age <= 80
WHERE age BETWEEN 18 AND 80
WHERE age BETWEEN 18 AND 80
WHERE name='zhangSan' OR name='liSi'
WHERE name IN ('zhangSan', 'liSi')
WHERE age IS NULL, 不能使用等号
WHERE age IS NOT NULL
WHERE name IN ('zhangSan', 'liSi')
WHERE age IS NULL, 不能使用等号
WHERE age IS NOT NULL
3. 删除数据
* DELETE FROM 表名 [WHERE 条件];
* TRUNCATE TABLE 表名:TRUNCATE是DDL语句,它是先删除drop该表,再create该表。而且无法回滚!!!
-------------------------
在数据库中所有的字符串类型,必须使用单引,不能使用双引!
日期类型也要使用单引!
日期类型也要使用单引!
// 插入所有列
INSERT INTO stu(
number, name, age, gender
)
VALUES(
'ITCAST_0001', 'zhangSan', 28, 'male'
);
INSERT INTO stu(
number, name, age, gender
)
VALUES(
'ITCAST_0001', 'zhangSan', 28, 'male'
);
// 插入部分列,没有指定的列默认为NULL值
INSERT INTO stu(
number, name
) VAKLUES(
'ITCAST_0002', 'liSi'
);
INSERT INTO stu(
number, name
) VAKLUES(
'ITCAST_0002', 'liSi'
);
// 不给出插入列,那么默认为插入所有列!值的顺序要与创建表时列的顺序相同
INSERT INTO stu VALUES(
'ITCAST_0003', 'wangWu', 82, 'female'
);
INSERT INTO stu VALUES(
'ITCAST_0003', 'wangWu', 82, 'female'
);
-------------------------
UPDATE
UPDATE stu SET name='xxx', age=102
====================================================================================
*****DQL -- 数据查询语言
查询不会修改数据库表记录!
一、 基本查询
1. 字段(列)控制
1) 查询所有列
SELECT * FROM 表名;
SELECT * FROM emp;
--> 其中“*”表示查询所有列
2) 查询指定列
SELECT 列1 [, 列2, ... 列N] FROM 表名;
SELECT empno, ename, sal, comm FROM 表名;
SELECT 列1 [, 列2, ... 列N] FROM 表名;
SELECT empno, ename, sal, comm FROM 表名;
3) 完全重复的记录只一次
当查询结果中的多行记录一模一样时,只显示一行。一般查询所有列时很少会有这种情况,但只查询一列(或几列)时,这总可能就大了!
SELECT DISTINCT * | 列1 [, 列2, ... 列N] FROM 表名;
SELECT DISTINCT sal FROM emp;
--> 保查询员工表的工资,如果存在相同的工资只显示一次!
当查询结果中的多行记录一模一样时,只显示一行。一般查询所有列时很少会有这种情况,但只查询一列(或几列)时,这总可能就大了!
SELECT DISTINCT * | 列1 [, 列2, ... 列N] FROM 表名;
SELECT DISTINCT sal FROM emp;
--> 保查询员工表的工资,如果存在相同的工资只显示一次!
4) 列运算
I 数量类型的列可以做加、减、乘、除运算
SELECT sal*1.5 FROM emp;
SELECT sal+comm FROM emp;
I 数量类型的列可以做加、减、乘、除运算
SELECT sal*1.5 FROM emp;
SELECT sal+comm FROM emp;
II 字符串类型可以做连续运算
SELECT CONCAT('$', sal) FROM emp;
SELECT CONCAT('$', sal) FROM emp;
III 转换NULL值
有时需要把NULL转换成其它值,例如com+1000时,如果com列存在NULL值,那么NULL+1000还是NULL,而我们这时希望把NULL当前0来运算。
SELECT IFNULL(comm, 0)+1000 FROM emp;
--> IFNULL(comm, 0):如果comm中存在NULL值,那么当成0来运算。
有时需要把NULL转换成其它值,例如com+1000时,如果com列存在NULL值,那么NULL+1000还是NULL,而我们这时希望把NULL当前0来运算。
SELECT IFNULL(comm, 0)+1000 FROM emp;
--> IFNULL(comm, 0):如果comm中存在NULL值,那么当成0来运算。
IV 给列起别名
你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了
SELECT IFNULL(comm, 0)+1000 AS 奖金 FROM emp;
--> 其中AS可以省略
你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了
SELECT IFNULL(comm, 0)+1000 AS 奖金 FROM emp;
--> 其中AS可以省略
2. 条件控制
1) 条件查询
与前面介绍的UPDATE和DELETE语句一样,SELECT语句也可以使用WHERE子句来控制记录。
* SELECT empno,ename,sal,comm FROM emp WHERE sal > 10000 AND comm IS NOT NULL;
* SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000;
* SELECT empno,ename,job FROM emp WHERE job IN ('经理', '董事长');
2) 模糊查询
当你想查询姓张,并且姓名一共两个字的员工时,这时就可以使用模糊查询
* SELECT * FROM emp WHERE ename LIKE '张_';
--> 模糊查询需要使用运算符:LIKE,其中_匹配一个任意字符,注意,只匹配一个字符而不是多个。
--> 上面语句查询的是姓张,名字由两个字组成的员工。
* SELECT * FROM emp WHERE ename LIKE '___'; /*姓名由3个字组成的员工*/
1) 条件查询
与前面介绍的UPDATE和DELETE语句一样,SELECT语句也可以使用WHERE子句来控制记录。
* SELECT empno,ename,sal,comm FROM emp WHERE sal > 10000 AND comm IS NOT NULL;
* SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000;
* SELECT empno,ename,job FROM emp WHERE job IN ('经理', '董事长');
2) 模糊查询
当你想查询姓张,并且姓名一共两个字的员工时,这时就可以使用模糊查询
* SELECT * FROM emp WHERE ename LIKE '张_';
--> 模糊查询需要使用运算符:LIKE,其中_匹配一个任意字符,注意,只匹配一个字符而不是多个。
--> 上面语句查询的是姓张,名字由两个字组成的员工。
* SELECT * FROM emp WHERE ename LIKE '___'; /*姓名由3个字组成的员工*/
如果我们想查询姓张,名字几个字可以的员工时就要使用“%”了。
SELECT * FROM emp WHERE ename LIKE '张%';
--> 其中%匹配0~N个任意字符,所以上面语句查询的是姓张的所有员工。
SELECT * FROM emp WHERE ename LIKE '%阿%';
--> 千万不要认为上面语句是在查询姓名中间带有阿字的员工,因为%匹配0~N个字符,所以姓名以阿开头和结尾的员工也都会查询到。
SELECT * FROM emp WHERE ename LIKE '%';
--> 这个条件等同与不存在,但如果姓名为NULL的查询不出来!
SELECT * FROM emp WHERE ename LIKE '张%';
--> 其中%匹配0~N个任意字符,所以上面语句查询的是姓张的所有员工。
SELECT * FROM emp WHERE ename LIKE '%阿%';
--> 千万不要认为上面语句是在查询姓名中间带有阿字的员工,因为%匹配0~N个字符,所以姓名以阿开头和结尾的员工也都会查询到。
SELECT * FROM emp WHERE ename LIKE '%';
--> 这个条件等同与不存在,但如果姓名为NULL的查询不出来!
二、排序
1) 升序
SELECT * FROM WHERE emp ORDER BY sal ASC;
--> 按sal排序,升序!
--> 其中ASC是可以省略的
2) 降序
SELECT * FROM WHERE emp ORDER BY comm DESC;
--> 按comm排序,降序!
--> 其中DESC不能省略
3) 使用多列作为排序条件
SELECT * FROM WHERE emp ORDER BY sal ASC, comm DESC;
--> 使用sal升序排,如果sal相同时,使用comm的降序排
1) 升序
SELECT * FROM WHERE emp ORDER BY sal ASC;
--> 按sal排序,升序!
--> 其中ASC是可以省略的
2) 降序
SELECT * FROM WHERE emp ORDER BY comm DESC;
--> 按comm排序,降序!
--> 其中DESC不能省略
3) 使用多列作为排序条件
SELECT * FROM WHERE emp ORDER BY sal ASC, comm DESC;
--> 使用sal升序排,如果sal相同时,使用comm的降序排
三、聚合函数
聚合函数用来做某列的纵向运算。
1) COUNT
SELECT COUNT(*) FROM emp;
--> 计算emp表中所有列都不为NULL的记录的行数
SELECT COUNT(comm) FROM emp;
--> 云计算emp表中comm列不为NULL的记录的行数
2) MAX
SELECT MAX(sal) FROM emp;
--> 查询最高工资
3) MIN
SELECT MIN(sal) FROM emp;
--> 查询最低工资
4) SUM
SELECT SUM(sal) FROM emp;
--> 查询工资合
5) AVG
SELECT AVG(sal) FROM emp;
--> 查询平均工资
聚合函数用来做某列的纵向运算。
1) COUNT
SELECT COUNT(*) FROM emp;
--> 计算emp表中所有列都不为NULL的记录的行数
SELECT COUNT(comm) FROM emp;
--> 云计算emp表中comm列不为NULL的记录的行数
2) MAX
SELECT MAX(sal) FROM emp;
--> 查询最高工资
3) MIN
SELECT MIN(sal) FROM emp;
--> 查询最低工资
4) SUM
SELECT SUM(sal) FROM emp;
--> 查询工资合
5) AVG
SELECT AVG(sal) FROM emp;
--> 查询平均工资
四、分组查询
分组查询是把记录使用某一列进行分组,然后查询组信息。
例如:查看所有部门的记录数。
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
--> 使用deptno分组,查询部门编号和每个部门的记录数
SELECT job, MAX(SAL) FROM emp GROUP BY job;
--> 使用job分组,查询每种工作的最高工资
分组查询是把记录使用某一列进行分组,然后查询组信息。
例如:查看所有部门的记录数。
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
--> 使用deptno分组,查询部门编号和每个部门的记录数
SELECT job, MAX(SAL) FROM emp GROUP BY job;
--> 使用job分组,查询每种工作的最高工资
组条件
以部门分组,查询每组记录数。条件为记录数大于3
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;
以部门分组,查询每组记录数。条件为记录数大于3
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;
五、limit子句(方言)
LIMIT用来限定查询结果的起始行,以及总行数。
例如:查询起始行为第5行,一共查询3行记录
SELECT * FROM emp LIMIT 4, 3;
--> 其中4表示从第5行开始,其中3表示一共查询3行。即第5、6、7行记录。
LIMIT用来限定查询结果的起始行,以及总行数。
例如:查询起始行为第5行,一共查询3行记录
SELECT * FROM emp LIMIT 4, 3;
--> 其中4表示从第5行开始,其中3表示一共查询3行。即第5、6、7行记录。
select * from emp limit 0, 5;
1. 一页的记录数:10行
2. 查询第3页
2. 查询第3页
select * from emp limit 20, 10;
(当前页-1) * 每页记录数
(3-1) * 10
(3-1) * 10
(17-1) * 8, 8
==============================
关键字:
select
from
where
group by
having
order by
from
where
group by
having
order by
--16. 显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于50000,输出结果按月工资的合计升序排列
--7. 有奖金的工种。