DB
数据库:存储数据的仓库,保存了一系列的有组织的数据 create database student
DBMS
数据库管理系统,数据库通过dbms创建和操作的容器。Mysql
SQL(structure query language)
结构化查询语言
1、查看mysql版本cmd窗口中输入mysql --version。
2、
查看当前所有数据库
show databases;
use 库名
show databases;
create table 表明(
列名 类型,
);
查看表结构
desc 表名;
########mysql语法规范
1、不区分大小写,但是建议关键字大写、表名、列名小写。
2、每条命令用分号结尾。g也行。
3、每条命令根据需要,可以缩进或换行直接回车不输入分号就行。
4、注释 单行注释# 单行注释,-- 注释文字,多行注释/* 注释文字 */
#######
DQL语言的学习 data query language
基础查询、条件查询、排序查询、常见函数、分组函数、分组查询、连接查询、子查询、分页查询、union联合查询。
1、查询列表可以是:表中的字段、常量值、表达式、函数
2、查询的结果是一个虚拟的表格
#取别名,便于理解。使用别名可以区分开来。
SELECT last_name AS 姓, first_name AS 名 FROM employees;
查询 去重
SELECT DISTINCT department_id FROM employees;
+号的作用
mysql中的+号 仅仅只能代表运算符
查询员工名和姓连接成一个字段,并且显示为姓名
ifnull 函数
SELECT IFNULL(commission_pct,0) AS 奖金率 FROM employees;
进阶2
分类
一、按条件表达式筛选
条件运算符:>、< != <> <= >=
二、按逻辑表达式筛选
逻辑表达式运算符
&& || !
and or not
三、模糊查询like between and
in is null
1、SELECT * FROM employees WHERE salary>12000;
2、部门编号不等于90号的员工名和员工编号
SELECT last_name,department_id FROM employees WHERE department_id!=90;
3、逻辑运算符
SELECT last_name,salary commission_pct FROM employees WHERE salary>10000 AND salary<20000;
4、模糊
SELECT * FROM employees WHERE last_name LIKE '%a%';
a前后都有字符
like 一般与通配符搭配使用
% 任意多个字符,包含0个字符
_任意单个字符
案例2
查询员工名中第三个字符为e 第五个为a的员工名的工资
SELECT last_name,salary FROM employees WHERE last_name like '___e_a%';
案例三:查询员工名第二个字符为_的员工名 用转义符
SELECT last_name FROM employees WHERE last_name LIKE '__%'; 相当于 like '_$_%' escape '$';
#between and 注意事项:可以提高代码的简洁度、包含边界值、两个临界值不要颠倒。
案例1:查询员工编号在100-120之间的员工信息
SELECT * from employees WHERE employee_id BETWEEN 100 and 120;
#in 关键字
in的含义 判断某字段的值 是否属于in列表中的某一些。
1、使用in提高语句简洁度
2、in列表的值类型必须统一或兼容
3、不能使用通配符% _
案例:查询员工的工种编号是 IT_PROG或AD_VP或AD_PRES
SELECT last_name,job_id FROM employees WHERE job_id IN ('IT_PROT','AD_VP','AD_PRES');
#is null关键字
案例:查询没有奖金的员工名和奖金率
= < >号 不能判断null值。
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL;
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
#安全等于
<=>
案例 查询工资为12000的员工信息
既可以判断null值,也可以判断普通的数值。
SELECT last_name,salary FROM employees WHERE salary <=>12000;
测试题:
1、查询工资大于12000的员工姓名和工资:
SELECT CONCAT(last_name,first_name) FROM employees WHERE salary>12000;
2、查询员工号为176的员工的姓名和部门号和年薪
SELECT CONCAT(last_name,first_name),department_id,salary*12 FROM employees WHERE employee_id=176;
3、选择工资不在5000到12000的员工的姓名和工资
SELECT CONCAT(last_name,salary) FROM employees WHERE salary>12000 OR salary <5000;
4、选择在20或者50号部门工作的员工姓名和部门号
SELECT CONCAT(last_name,first_name) FROM employees WHERE department_id=20 OR department_id=50;
5、选择公司中没有管理者的员工i姓名及jobid
SELECT CONCAT(last_name,first_name),job_id FROM employees WHERE manager_id IS NULL;
6、选择公司中又奖金的员工姓名,工资和奖金级别
SELECT CONCAT(last_name,first_name),salary,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
7、选择员工姓名的第三个字母是a的员工姓名
SELECT CONCAT(last_name,first_name) FROM employees WHERE CONCAT(last_name,first_name) LIKE '__a%';
8、选择姓名中又字母a和e的员工姓名
SELECT CONCAT(last_name,first_name) FROM employees where CONCAT(last_name,first_name) like '%a%' OR CONCAT(last_name,first_name) like '%e%'
模糊查询用like
9、显示出表employees中first_name以'e'结尾的员工信息
SELECT * FROM employees where first_name LIKE '%e';
10、显示出表employees部门编号在80-100之间的姓名和职位。
SELECT CONCAT(last_name,first_name),job_id FROM employees where department_id>=80 or department_id<=100;
11、显示出表employees的manager_id是100,101,110的员工姓名、职位
SELECT CONCAT(last_name,first_name),job_id FROM employees WHERE manager_id=100 OR manager_id=101 OR manager_id=110;
测试题1:
一、查询没有奖金, 且工资小于18000的salary,last_name
SELECT last_name,salary FROM employees WHERE salary<18000 AND commission_pct IS NULL;
二、查询employees表中,job_id不为'IT'或者工资为12000的员工信息
SELECT last_name,salary,job_id FROM employees WHERE job_id NOT like'IT%' OR salary=12000;
三、查询departments表中涉及到的位置编号。
SELECT DISTINCT department_id FROM departments;
四、select* from employees ;
select * from employees compactpic like '%%'; 不为null
#进阶3 排序查询
SELECT * FROM employees ORDER BY salary DESC; 降序
SELECT * FROM employees ORDER BY salary ASC;升序
不写 按什么序,默认为升序.
查询部门编号大于等于90的员工信息,按入职时间的先后进行排序
SELECT * FROM employees WHERE department_id >= 90 ORDER BY hiredate asc;
#案例3
按表达式排序
按年薪的高低显示员工的信息和年薪
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
#案例4 :查询,按姓名的长度显示员工的姓名和工资
SELECT LENGTH(last_name) 名字长度,last_name,salary FROM employees ORDER BY 名字长度;
#案例5:查询员工信息,先按工资排序,在按员工编号排序(按照多个字段进行排序)
SELECT * FROM employees ORDER BY salary ASC,employee_id DESC;
当薪资一样的时候,id降序.
练习题:
1 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序
SELECT CONCAT(last_name,first_name),department_id,salary*12*(1+IFNULL(commission_pct,0)) FROM employees ORDER BY salary DESC,CONCAT(last_name,first_name) ASC;
2 选择工资不在8000到17000的员工的姓名和工资,按工资降序
SELECT CONCAT(last_name,first_name),salary FROM employees WHERE salary not BETWEEN 8000 and 12000 ORDER BY salary DESC;
3 查询邮箱中博阿寒e的员工信息,并先按邮箱的字节数降序,再按部门号升序
SELECT * FROM employees WHERE email LIKE '%e%';
4 查询邮箱中包含e的员工信息,并按邮箱的字节降序,再按部门号升序.
SELECT * FROM employees WHERE email LIKE '%e%' ORDER BY LENGTH(email) DESC,department_id ASC;
#进阶4:常见函数
功能 类似于java的方法。
将我们的一组逻辑语句封装在方法体中,对外暴露方法名,隐藏了功能细节。
调用:select 函数名(实参列表) from 表;
单行函数:
select length(‘john’);
select length(‘张三丰’);
select concat (last_name,'-',fist_name)姓名 from employees;
案例 姓名中首字符大写,其他字符按_拼接,显示出来
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(first_name,2))) FROM employees;
#TRIM 去掉字符串中的字符
select trim('a' from 'aaaaaaaaaaaaaaaaaaa张翠山aaaaaaaaaaaaaaaaaa') as output FROM employees;
去掉a字符
#lpad用所指定的字符进行填充,达到5这个长度,如果不足5截断。
SELECT LPAD('殷素素',5,'*') AS output;
rpad右填充
#replace 替换
#数学函数
#round四舍五入
select round(-1.45);
答案-2
ceil向上取整
floor向下取整
truncate 截断
mod(a,b)取余
#流程控制函数
判断当前是否有奖金,奖金率是否为null
SELECT last_name,commission_pct,if(commission_pct IS NULL,'没奖金','有奖金') FROM employees;
# case函数的使用
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;
#case函数的使用二
SELECT job_id as job,
CASE job_id
WHEN 'AD_PRES' THEN 'A'
WHEN 'ST_MAN' THEN 'B'
WHEN 'IT_PROG' THEN 'C'
END as 'grade'
FROM employees;
#分组函数
功能:统计使用,聚合函数,统计函数,或组函数
分类
sum求和,avg平均值,max最大值、min最小值、count计算个数。
求和。
SELECT SUM(salary) FROM employees;
null未参与运算。以上分类函数
select count(*) from employees;
统计行数
select count(1) from employees;
加一列全为1
效率:innodb引擎下,count(*)和count(1)效率差不多,比count(字段)要高一些。
5.5之前是myisam count*效率最高
#6和分组函数一同查询的字段有限制,要求是group by后的字段
查询员工最大入职时间和最小入职时间
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) difference FROM employees;
查询部门编号为90的员工个数
count数行数。
SELECT count(*) FROM employees where department_id=90;
#进阶5 分组查询
group by语法
select 分组函数count等,列 (要求出现在groupby的后面)
from 表
where(筛选条件)
group by 分组列表
orderby 子句
注意查询列表特殊,要求分组函数和groupby后出现的字段
案例:查询每个工种的最高工资
SELECT MAX(salary),job_id FROM employees GROUP BY job_id;
案例:查询每个位置上的部门个数
SELECT count(*),location_id FROM departments GROUP BY location_id;
案例:查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id;
案例:有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id FROM employees WHERE commission_pct is not null GROUP BY manager_id;
#添加筛选条件 having
案例:查询哪一个部门的员工个数大于2
SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING count(*)>2;
案例:查询每个工种有奖金的员工的最高工资大于12000
SELECT MAX(salary),job_id FROM employees WHERE commission_pct is NOT NULL GROUP BY job_id HAVING MAX(salary)>12000;
案例:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个
SELECT MIN(salary),manager_id FROM employees WHERE manager_id>102 GROUP BY manager_id HAVING MIN(salary)>5000;
筛选 分组前筛选 数据源 原始表 where
分组后筛选 数据源 筛选出来后的 结果集 having
1、分组函数做条件肯定放在having字句中
2、能用分组前 优先选用分组前筛选。性能!!!!
#按表达式分组
案例: 按员工姓名的长度分组,查询每一组员工个数,筛选员工个数>5的有哪些。
SELECT count(*),LENGTH(last_name) FROM employees GROUP BY LENGTH(last_name) HAVING count(*)>5;
#按多个字段分组
案例:查询每个部门每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id FROM employees GROUP BY department_id,job_id;
#添加排序
SELECT AVG(salary),department_id,job_id FROM employees GROUP BY department_id,job_id ORDER BY AVG(salary) DESC;
案例:查询城市名中第二个字母为o的部门名和城市名
SELECT department_name,city FROM departments d,locations l WHERE l.city LIKE '_o%' AND l.location_id=d.location_id;
不应该是 SELECT department_name,city FROM departments d,locations l WHERE l.city LIKE '_o%' ;
如果是这样会成笛卡尔积
##加分组
案例1:查询每个城市的部门个数
SELECT COUNT(*) 个数,city FROM departments d,locations l WHERE d.location_id=l.location_id GROUP BY city;
#案例2:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
SELECT MIN(e.salary),d.manager_id 部门领导编号,d.department_name,e.department_id 部门号 FROM employees e,departments d WHERE d.department_id=e.department_id AND e.commission_pct IS NOT NULL GROUP BY e.department_id;案例 查询每个工种的工种名和员工个数
#案例查询每个工种的工种名和员工的个数,并且按照员工个数降序。
SELECT count(*),job_title FROM jobs j,employees e WHERE e.job_id=j.job_id GROUP BY job_title ORDER BY Count(*) 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;
等值连接
1、多表等值连接的结果为多表的交集部分
2、n表连接,至少n-1个连接条件
3、多表顺序不同
4、一般为多表起别名
5、搭配排序、分组、筛选
非等值连接。
案例1:查询员工的工资和工资级别
SELECT salary,grade_level
FROM employees e,job_grades j
WHERE salary BETWEEN j.lowest_sal AND j.highest_sal;
自连接
案例2:查询员工名和上级名
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;
效率比较
MyISAM存储引擎,count(*)最高
InnoDB存储引擎,count(*)和count(1)效率>count(字段)
笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接。
如何解决:添加有效的连接条件
#######sql99语法
#内连接
语法
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件
分类:等值连接,非等值连接
案例1:查询员工名、部门名
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id;
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
案例2:查询名字中包含了e的员工名和工种名(添加筛选)
SELECT last_name,job_title FROM employees e
INNER JOIN jobs j ON e.job_id=j.job_id WHERE last_name LIKE '%e%';
案例3:查询部门个数>3的城市名和部门个数(添加分组+筛选);
SELECT city,count(*) 部门个数
FROM departments d
INNER JOIN
locations l
ON l.location_id=d.location_id
GROUP BY city
HAVING count(*)>3;
#案例:查询员工名、部门名、工种名、并按照部门名降序
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 department_name DESC;
特点:
1、添加排序、分组、筛选
2、innner可以省略
3、筛选条件放在where后面,连接条件放在了on后面,提高了阅读性。
#非等值连接
案例:员工的工资级别
SELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;
#案例:查询,每个工资界级别的个数>2的,并且工资级别降序
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.last_name,m.last_name
FROM employees e
JOIN employees m
on e.manager_id=m.employee_id;
#外连接
查询一个表有的记录,另一个表无与该字段对应的记录。
特点:外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值,如果没有匹配的值,则显示null。
外连接查询的结果=内连接查询的结果+主表中有而从表中没有的结果
1、查询结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配则显示null
左外连接:left join左边的是主表
右外连接,right join右边的是主表
3、一般用于查询除了交集部分的剩余不匹配的行
左外和右外交换两个表的顺序,可以实现同样的效果。
案例1:查询哪个部门没有员工
SELECT d.*,e.employee_id
FROM departments d
left OUTER JOIN employees e
on d.department_id = e.department_id
WHERE e.employee_id is null;
左外
#全外连接=左外+右外
#交叉连接
类似于生成笛卡尔乘积
select 查询列表
from 表1 别名
cross join 表2 别名;
#sql99实现连接条件和筛选条件分离,可读性更高。
#进阶7:子查询
含义:
出现在其他语句中 select语句,称为子查询。
外部的查询语句,称为主查询或外查询(子查询需要放在括号内)
分类:
按子查询出现的位置:
select后面
from后面
支持表子查询
where或者having后面
标量子查询、列子查询、行子查询
exists后面(相关子查询)
表子查询
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集一行多列)
表子查询(结果集多行多列)
#where或having后面
1、标量子查询(单行子查询)
2、列子查询(多行子查询)
3、行子查询(多行多列)
@特点:
1、子查询放在小括号内
2、子查询一般放在条件的右侧
3、 标量子查询,一般搭配单行操作符使用
> < >= <= = <>
列子查询,一般搭配着多行操作符使用
IN,ANY/SOME,ALL
#1、标量子查询
案例:谁的工资比abel高
select *
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name='Abel'
);
案例:
返回jobid与141号员工相同,salary比143号员工多的员工 姓名,jobid和工资
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);
#案例3:返回公司工资最少的员工的lastname,jobid 和salary
SELECT last_name,job_id,salary FROM employees WHERE salary=(SELECT MIN(salary) FROM employees);
#案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资
SELECT department_id ,Min(salary)
FROM employees
WHERE salary>(SELECT MIN(salary)
from employees
WHERE department_id = 50)
GROUP BY department_id;
案例:列子查询() 多行子查询
多行操作符
in not in any some all
行子查询 一行多列
案例:查询员工最小 并且工资最高的员工信息
SELECT * FROM employees
WHERE (employee_id,salary)=(
SELECT MIN(employee_id),MAX(salary) FROM employees)
#select 后面
查询每个部门的员工个数
SELECT d.*,(SELECT count(*) FROM employees e
WHERE e.department_id=d.department_id) 个数
FROM departments d;
#from后面
#分页查询
select 查询列表
from表
join type join 表2
on 连接条件
where 筛选条件
group by分组条件
having 分组后的筛选
order by 排序字段
limit offset,size;
offset要显示条目的起始索引
size要显示的条目个数
特点:1、limit语句放在查询语句的最后
2、公式
要显示的页数page,每页的条数size
select 查询列表 from 表 limit(page-1)*size,size;
案例:查询员工前五条信息
SELECT * FROM employees LIMIT 0,5;
案例:查询弟11条-弟25条数据
SELECT * FROM employees LIMIT 10,15;
案例:有奖金的员工信息,并且较高的前10名显示出来
SELECT * FROM employees WHERE commission_pct is NOT NULL ORDER BY commission_pct DESC LIMIT 10;
##查询语句中的先后顺序 执行顺序
select 查询列表 7
from 表 1
连接类型 join 表2 2
on 连接条件 3
where 筛选条件 4
group by分组列表 5
having 分组后的筛选 6
order by 排序列表 8
limit 条目数
#子查询 经典题目:
案例1:查询工资最低的员工信息:last_name,salary
SELECT salary,last_name FROM employees WHERE salary=(SELECT MIN(salary) FROM employees);
案例2:查询平均工资最低的部门信息和该部门的平均工资
SELECT d.* from departments d WHERE department_id =
(SELECT department_id FROM employees e GROUP BY department_id HAVING AVG(salary)=(SELECT MIN(avg) FROM (SELECT AVG(salary) avg,department_id d_id FROM employees GROUP BY department_id) AVG_DEP))
案例3:查询平均工资最低的部门信息和该部门的平均工资
SELECT * from departments d JOIN (SELECT AVG(salary),department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) ASC limit 1) ag_dep
ON d.department_id=ag_dep.department_id;
案例4:查询平均工资最高的工作的所有信息
SELECT * FROM jobs WHERE job_id = (select job_id FROM employees GROUP BY job_id ORDER BY AVG(salary) DESC LIMIT 1);
案例5:查询平均工资高于公司所有人的平均工资的部门
SELECT AVG(salary),department_id FROM employees GROUP BY department_id HAVING AVG(salary)>(SELECT AVG(salary) FROM employees);
案例6:查询所有manage的所有信息
SELECT * FROM employees WHERE employee_id any (SELECT DISTINCT manager_id from employees WHERE manager_id IS NOT NULL) and employee_id is not NULL;
案例7: 各个部门最高工资最低的部门,最低工资
SELECT salary FROM employees WHERE department_id=(SELECT department_id from employees GROUP BY department_id ORDER BY MAX(salary) LIMIT 1) ORDER BY salary ASC LIMIT 1;
案例8:查询平均工资最高的部门的manager的详细信息:last_name,department_id,email,salary
SELECT last_name,department_id,email,salary FROM employees WHERE employee_id = (SELECT manager_id FROM departments WHERE department_id =
( SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG(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);
# union联合查询
合并:将多条查询语句的结果合并成一个结果
#引入案例:查询部门编号>90 或者邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id>90;
应用场景:结果来自多个表,并且没有连接关系。
特点:
1、union查询的列数是一致的
2、查询的每一列类型尽量是一样的
3、自动去重(不想去重,增加关键字all)
#DML语言
插入:insert
修改:update
删除:delete
插入语句:
语法一、insert into 表名(列名,。。。)
values(值1,值2....);
语法二、insert into 表名
set 列名=值,列名=值,...
#注意
1、varchar和char,日期都要用单引号
2、可以为null的列是如何插入值
方式一、设置为null
方式二、不输入列名
3、列的顺序可以调换
4、列数和值必须相同
5、可以省略列名,默认所有列,并且顺序和表中列的顺序要一致
两种语法比较
语法一:支持插入多行
insert into beauty
values (,,,,,,),
(,,,,,,,)
语法二不支持
语法一:支持子查询,方式二不支持
insert into beauty(id,name,phone)
select 26,‘宋茜’,‘110809866’;
修改语句:
语法:update 表名 1
set 列=新值,列=新值 2
where 筛选条件 3
#修改多表记录
语法:
sql92语法 只支持内联
update 表1 别名,表2 别名
set 列=值,...
where 连接条件
and 筛选条件
sql99语法:
update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 列=值,...
where 筛选条件
删除语句
方式1:delete from 表 where 筛选条件
方式2:truncate table 表名;
整个数据,保留结果
多表删除
delete 表1的别名,表2的别名
from 表1 别名,表2 别名
where 连接条件
and 筛选条件
sql99语法:
delete 表1的别名,表2的别名
from 表1 别名
inner 表1 别名
join 表2 别名
where 筛选
#方式二:truncate语句
#案例:将魅力值>100的男神信息删除
truncate table boys;就清空数据了。
#区别
1、delete可以加where truncate 不能加where
2、truncate删除,效率高一丢丢
3、加入delete删除后,再插入数据,自增列的值从断点开始
4、二truncate是从1开始
5、truncate删除没有返回值,不能回滚,delete删除有返回值,能回滚。
DDL语言
数据定义语言(对库和表的管理)
库和表的管理
一、库的管理
创建、修改、删除
二、表的管理
创建、修改、删除
创建:create
修改:alter
删除 drop
一、库的管理
1、库的创建
语法:
create database 库名;案例:创建库books
create database books;
create database if not exists books;
2、库的修改
ALTER DATABASE books CHARACTER SET gbk;
3、库的删除
drop database books if exists books;
表的管理
#1、表的创建
/*
create table 表名(
列名 列的类型[(长度 ) 约束],
列名 列的类型[(长度 ) 约束],
列名 列的类型[(长度 ) 约束],
)
#案例:创建表book
create table book(
id INT,#编号
bName VARCHAR(20),#图书名
price DOUBLE,#价格
authorID INT,#作者编号
publishDate DATETIME#出版日期
)
作者表
create table author(
id INT,#编号
au_name VARCHAR(20),
nation VARCHAR(20)
)
#表的修改 alter table 表名 modify column drop rename
1、修改列名
alter table book change column publishdate pubDate DATETIME;
2、修改类的类型或约束
ALTER TABLE book modify COLUMN PUBdate TIMESTAMP;
3、添加新的列
alter table author add column annual double;
4、删除列
alter table author DROP column annual;
5、修改列名
alter table author RENAME TO book_author;
6、删除表
drop table author;
删除库
drop database if exists 库名;
表的复制
1、仅仅能复制表的结构
copy table copy like author;
2、复制表的结构+数据
create table copy2
select * from author;
3、只复制部分数据
create table copy3
select id,au_name
where id=1;
4、仅仅复制某些字段
create table copy4
select id,au_name
from author
where 1=2;
#常见的数据类型
数值型:
整形
小数:浮点数,定点数
分类:
tinyint smallint mediumint int/integer bigint
1字节 2 3 4 8
特点:如果不设置无符号还是有符号,默认为无符号
如果插入的值 超过范围,会报out of range 但是插入的是临界值
CREATE TABLE tab_int(
t1 INT
)
CREATE TABLE tab_int(
t1 INT unsigned
)
小数
浮点型
float(M,D)
double(M,D)
定点型
dec=decimal(M,D)
(M,D)可以省略。
M小数点前面的位+小数部位,
D为小数点后面的位数
如果超过范围,则插入临界值。
2
如果是decimal ,则M默认为10,D默认为0
如果是foat 和double,则会根据插入的数值的精度来决定精度
3
定点型的精确度较高,如果要求插入精度较高如货币运算,则用定点型
#原则
所选择的类型越简单越好,能保存数值的类型越小越好。
字符型:
较短的文本:char,varchar
较长的文本: text、blob(较长的二进制)
char(M)
M代表最多的字符数
char 固定长度 比较耗费 效率高
varchar 可变长度 比较节省 效率低
日期型
分类:
date:只保存日期
time :只保存时间
year:只保存年
datetime:保存日期+时间 8字节 范围 1000-9999
timestamp:保存日期+ 时间 4字节 范围 1979-2038
#约束
六大约束
NOT NULL:非空,
DEFAULT:默认,用于保证该字段有默认值
比如性别
PRIMARY KEY:主键,
UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空。
CHECK;检查约束mysql不支持。
FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
从表中添加外键约束,用于应用主表中某列的值
约束的添加分类:
列级约束:
六大约束与法上都支持,但外键约束没有效果
表级约束:
除了非空、默认,其他都支持
表级约束与列级约束
表级约束与列级约束
(1)对一个数据列建立的约束,称为列级约束
(2)对多个数据列建立的约束,称为表级约束
(3)列级约束既可以在列定义时声明,也可以在列定以后声明
(4)表级约束只能在列定义后声明
主键、外键、非空、唯一、default都是约束条件。主键、外键、唯一既可以作为表级约束,也可作为列级约束
( not null, default )只有列级约束