基本概念
DB | 存储数据的仓库,保存一系列有组织的数据 |
DBMS | 数据库管理系统,数据库通过DBMS来创建和操作容器 |
SQL | 结构化查询语言,专门和数据库通信的语言 |
SQL的优点
不是某个特定数据库供应商转悠的语言,几乎所有的DBMS 都支持SQL
简单易学
灵活使用元元素,可以进行非常复杂和高级的数据库操作
数据库结构
将数据放入到表中,表再放入到库中
每个表的名字是用来标识自己的,表名具有唯一性
表由列组成,也称为字段
表中的数据时按行存储的
MySQL的Windows安装
MySQL的Windows启停
net stop mysql
net start mysql
语法规范
不区分大小写,建议关键字大写
每条命令用分号结尾
每条命令可进行缩进和换行
单行注释 #,--(后面要加空格)
多行注释 /* */
查询
SELECT name FROM names; | 查询一个 |
SELECT name,id FROM names; | 查询多个 |
SELECT * FROM names; | 查询所有(只能按照表的原来顺序输出,不能自定义顺序输出) |
SELECT name AS ‘n’ FROM names; | 起别名,别名最好用引号括起 |
SELECT DISTINCT id FROM names; | 去除重复的项 |
SELECT id+name FROM names; | 返回相加结果 |
SELECT CONCAT(id,name) FROM names; | 拼接字符 |
SELECT IFNULL(id,0) FROM names; | 判断是否为空,为空则返回0 |
> +号两边如果都是数值,就返回计算结果,
> 如果一方为字符型数值,就会识图将字符转换为数值,
> 如果转换成功,则继续做运算,
> 若不成功,则将字符型数值转换成0再进行运算
> CONCAT函数在拼接字符时,如果有一项为null,则结果为null
加判断
SELECT * FROM names WHERE id>90; | 查询id大于90的信息 |
SELECT * FROM names WHERE id>90 && id<100; | 查询id在90到100之间的信息 |
SELECT * FROM names WHERE id between 90 and 100; | 查询id在90到100之间的信息 |
SELECT * FROM names WHERE id in(90,100); | 查询id为90和100的信息 |
条件运算符 | |
---|---|
< > = | |
!= <> | 不等于 |
<= >= | |
<=> | 安全等于,可以判断null值 |
逻辑运算符 | |
---|---|
&& and | 与 |
or | 或 |
! not | 非 |
模糊查询 | |
---|---|
like | 通配符:% 可代替任意数量的字符,_ 可代替任意一个字符,/ 支持转义 |
between and | 范围包含临界值,不能调换临界值的顺序 |
in | 判断字符是否在in表中,in表中的元素必须为同类型,且不支持通配符 |
is null / is not null | 只能判断null值 |
练习
1.select * from employees;
2.select * from employees where commission_pct like '%%' and last_name like '%%';
3.select * from employees where commission_pct like '%%' or last_name like '%%';
#1和2的结果可能不一样,因为会null值的影响
#1和3的结果受null值影响的程度较小,除非两项在同一列都有null值
排序
SELECT * FROM names ORDER BY id ASC; 信息按id排序,ASC是升序,DESC是降序,默认是升序
#按条件排序
SELECT *
FROM employees
where depertment_id>=90
ORDER BY hiredate ASC;
#按表达式/别名排序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 #别名,判断null值
FROM employees
ORDER BY 年薪 ASC; #排序
#按函数排序
SELECT LENGTH(last_name) 字节长度 ,last_name
FROM employees
ORDER BY LENGTH(last_name) DESC;
练习
#查询与昂的姓名,部门号和年薪,按年薪降序,按姓名升序
SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC,last_name ASC;
#选择工作不在8000到17000的员工的姓名和工资,按工资排序
SELECT last_name,salary
FROM employees
WHERE salary NOT BETWEEN 8000 and 17000
ORDER BY salary DESC;
#查询邮箱中包含e的员工的信息,并先按邮箱的字节数降序,在按部门号升序
SELECT *
FROM employees
WHERE email LIKE '%e%'
ORDER BY LENGTH(email) DESC,department_id ASC;
函数
常用函数 | |
---|---|
length | 返回字节数,汉字是3字节 |
concat | 拼接字符串 |
upper | 转大写 |
lower | 转小写 |
substr | 截取从指定索引处后面的字符 |
instr | 返回字符串第一次出现的索引,从1开始,找不到返回0 |
trim | 去除字符串首尾的指定字符 |
lpad | 用指定的字符实现左填充指定长度 |
rpad | 用指定的字符实现右填充指定长度 |
replace | 替换字符串 |
#姓名中首字母大写,其他字符小写
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2)))
FROM employees;
#去除指定字符
SELECT TRIM('a' FROM 'aaAAaa') AS out_opt;
#左填充
SELECT LPAD('xxx',12,'*') AS out_opt;
SELECT REPLACE('abc','a','A') AS out_opt;
数学函数 | |
---|---|
round | 四舍五入 |
ceil | 向上取整 |
floor | 向下取整 |
truncate | 截断 |
mod | 取余 |
SELECT ROUND(4.5);
日期函数 | |
---|---|
now | 日期和时间 |
curdate | 日期 |
curtime | 时间 |
year | 年份 |
mouth | 月份 |
mouthname | 月份用英文表示 |
str_to_date | 将日期格式的字符转换成指定格式的日期 |
date_format | 将日期转换成字符 |
%Y | 四位年份 |
%y | 两位年份 |
%m | 两位月份(01,02,11,12) |
%c | 一位月份(1,2,11,12) |
%d | 日(01,02) |
%H | 24小时制 |
%h | 12小时制 |
%i | 分钟 |
%s | 秒 |
SELECT YEAR(NOW());
SELECT YEAR('1992-4-4');
SELECT YEAR(hiredate) 年 FROM employees;
#查询入职日期为1992-3-4的员工
SELECT * FROM employees WHERE hiredate = '1992-3-4' ;
SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');
流程控制函数
SELECT if(10>5,'大','小')
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金','有奖金') 备注
FROM employees;
# 部门号是30,工资是1.1倍,部门号是40,工资是1.2倍
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;
#工资>20000,为A级,工资>15000,为B级,工资>10000,为C级,工资<10000,为D级
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 LENGTH(last_name) 长度,SYBSTR(last_name,1,1) 首字符,last_name
FROM emmplyees
ORDER BY 首字符
#做一个查询产生下面的结果
#<last_name> earns <salary> mouthly but wants <salary*3>
SELECT CONCAT(last_name,'earns',salary,'mouthly but wants',salary*3)
FROM employees
WHERE salary=24000;
#使用case,按照下面的条件:
#job grade
#AD_PREES A
#ST_MAN B
#IT_PROG C
SELECT last_name,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
WHERE job_id = 'AD_PRES';