您的当前位置:首页正文

数据库一

2024-11-24 来源:个人技术集锦

基本概念

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)
%H24小时制
%h12小时制
%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';
显示全文