1、SQL基础概念
DB:
数据库(database):存储数据的”仓库“,它保存了一系列有组织的数据。
DBMS:
数据库管理系统(Database Management System ).数据库是通过DBMS创建和操作的容器。
SQL:
结构化查询语言(Structure Query Language):专门用来与数据库通信的语言。
2.常见的数据库管理系统
MYSQL、Oracle、DB2、SqlServer
3.配置mysql服务器
1.端口设置
2.默认字符集设置
3.将bin目录配置成环境变量
4.root账号密码设置
5.允许远程登录: Enable root access from remote machines
4.SQL语言四大类
DML
data manipulation language 数据库操作语言
DDL
data definition language 数据可定义语言
DQL
data query language 数据库查询语言
DCL
data control language 数据库控制语言
5.操作数据库相关命令
1.查看当前所有的数据库
show databases;
2.打开指定的库
use 库名;
3.查看当前库的所有表
show tables ;
4.查看其他库的所有表
show tables from 库名;
5.查看表结构
desc 表名;
6.查看服务器的版本
方式一:登录到mysql服务端 select version();
方式二:没有登录到mysql服务端 mysql --version 或 mysql --V
7.创建表
create table 表名(
列名 列类型,
列名 列类型
);
8.启动服务器、关闭服务器
net start mysql net stop mysql
9.连接mysql数据库
mysql -h 192.168.*.* -u root - p
10.创建数据库
create database myschool;
11.删除数据库
drop database myschool;
6.MYSQL的语法规范
1.不区分大小写,但建议关键字大写,表名、列名小写
2.每条命令最好用分号结尾
3.每条命令根据需要,可以进行缩进 或换行
4.注释 单行注释:#注释文字
单行注释:-- 注释文字
多行注释:/* 注释文字 */
7.数据类型
(1)数值类型
int smallint mediumint int bigint folat duble decimal
unsigned属性 拥有该属性只有正数
zerofill属性 拥有该属性如果是4位输入1就是0001
(2)字符串类型
char varchar tinytext test
char 表示定长,长度固定,varchar表示变长,即长度可变。char如果插入的长度小于定义长度时,则用空格填充;varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。
(3)日期类型
date
datatime
time
timestamp
year
默认是timestamp 一般用datetime
8.MYSQL相关语句概念
操作表语句
创建表
create table if not exists student ( studentId int(11) primary key auto_increment comment '学生id', studentName varchar(10) not null comment '学生姓名' )相关约束
not null 非空
default 默认
unique key 唯一
primary key 主键
foreign key 外键
auto_increment 自增
查看表的定义
desc student;删除表
drop table if exists student存储引擎
mylsan 与 innodb
区别
m没事务 查询位置 空间小
i有事务,操作丰富 安全性好
关键字 engine
mysql系统帮助
help contents; help int ;重命名表
ALTER TABLE 旧表名 RENAME [AS] 新表名修改字段
ALTER TABLE 表名 MODIFY 字段名 列类型 [ 属性 ] ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列类型 [ 属性 ]添加字段
ALTER TABLE 表名 ADD 字段名 列类型 [ 属性 ]删除字段
ALTER TABLE 表名 DROP 字段名
二.查询
1.查询总语法
SELECT [ALL | DISTINCT]
{ * | table.* | [ table.field1 [ as alias1] [, table.field2 [as alias2]][, …]] }
FROM table_name [ as table_ alias ]
[ left|out|inner join table_name2 ] #联合查询
[ WHERE … ] #指定结果需满足的条件
[ GROUP BY …] #指定结果按照哪几个字段来分组
[ HAVING …] #过滤分组的记录必须满足的次要条件
[ ORDER BY… ] #指定查询记录按一个或者多个条件排序
[ LIMIT { [ offset,] row_count | row_count OFFSET offset }] ;2.基本查询
(1)语法格式:select 字段名 from 表名 ;
查询数据前,先打开数据库。 USE book;
案例1 (查询表中的单个字段):SELECT NAME FROM t_book;
案例2 (查询表中的多个个字段):SELECT NAME,price,author FROM t_book;
案例3(查询表中的所有字段):SELECT * FROM t_book;
(2)起别名
方式一 、使用as 例如:SELECT price AS 价格 FROM t_book;
方式二、使用空格 例如:SELECT price 价格 FROM t_book;
(3)去重
使用distinct 例如:SELECT DISTINCT NAME FROM t_book;
(4)连接
使用CONCAT连接 例如:SELECT CONCAT(first_name,last_name) 姓名 FROM employees;
3.条件查询
用于检索数据表中符合条件的记录
搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
搜索条件的组成
逻辑操作符
比较操作符
1.基本语法:
select 查询列表 from 表名 where 筛选条件;分类:
一、按条件表达式筛选
简单条件运算符:> < = != <> >= <=
二、按逻辑表达式筛选
逻辑运算符:
作用:用于连接条件表达式 && || ! and or not
&&和and:两个条件都为true,结果为true,反之为false
||或or: 只要有一个条件为true,结果为true,反之为false
!或not: 如果连接的条件本身为false,结果为true,反之为false
三、模糊查询
like between and in is null
2.基本案例:
1.查询用户姓名中包含a字符的相关信息
SELECT * FROM employees WHERE first_name LIKE '%a%';
2.查询用户第二个字母为a 第四个字母为c的用户信息
SELECT * FROM employees WHERE first_name LIKE '_a_c%';
3.查询用户第二个字母为_的用户信息 用到ESCAPE转义字符
SELECT * FROM employees WHERE first_name LIKE '_$_%' ESCAPE $;
4.查询员工编号在100-120之间的员工信息
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
SELECT * FROM employees WHERE employee_id>=100 AND employee_id<=110;5.IN的使用方式:查询工种编号在AD_VP 和AD_PRES IT_PROG的一个信息
SELECT * FROM employees WHERE job_id IN('AD_VP','AD_PRES','IT_PROG');6.IS NULL 的使用:查询没有奖金的员工名和奖金率
SELECT first_name,manager_id FROM employees WHERE commission_pct IS NULL;7.IS NOT NULL 的使用:查询有奖金的员工名和奖金率
SELECT first_name,manager_id FROM employees WHERE commission_pct IS NOT NULL;4.排序查询
1.基本语法:
如下:
select 查询列表 from 表名【where 筛选条件】order by 排序的字段或表达式;
特点:
1、asc代表的是升序,可以省略(ascend)
desc代表的是降序(descend)2、order by子句可以支持 单个字段、别名、表达式、函数、多个字段
3、order by子句在查询语句的最后面,除了limit子句
2.基本案例:
(1)查询员工信息,要求工资 大于6000的从低到高。 查询员工信息,要求id从高到低
SELECT * FROM employees WHERE salary>6000 ORDER BY salary ASC;(2)按年薪的高低显示员工的信息和年薪:两种方式按别名和不用别名
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 ASC;(3)按姓名的长度显示员工的姓名和工资 按LENGTH函数排序
SELECT first_name,salary,LENGTH(first_name) 姓名长度 FROM employees ORDER BY 姓名长度 ASC;(4)查询员工信息,要求先按工资升序,再按员工编号降序排序
SELECT * FROM employees ORDER BY salary ASC,employee_id DESC;(5)查询邮箱中包含e的员工信息,并按邮箱的字节数排序,再按部门号排序。
SELECT *,LENGTH(email) FROM employees WHERE email LIKE '%e%' ORDER BY LENGTH(email) DESC, employee_id ASC;5.查询常见函数
1.LENGTH表示字节长度
SELECT LENGTH('abcd');2.拼接字符串 CONCAT
SELECT *,CONCAT(first_name,'_',last_name) 姓名 FROM employees WHERE salary>6000 ORDER BY salary DESC;3.大小写UPPER LOWER
SELECT UPPER('joHN');
SELECT LOWER('NanCy');SELECT CONCAT(UPPER(first_name),UPPER(last_name)) AS 大写的名字 FROM employees;
4.索引函数SUBSTRING SUBSTR
SELECT SUBSTR('学习my sql数据库的全过程',5);
SELECT SUBSTR('学习my sql数据库的全过程',5,7);SELECT CONCAT(UPPER(SUBSTR(first_name,1,2)),LOWER(SUBSTR(first_name,3)),'_',LOWER(last_name)) AS 姓名 FROM employees;
5.instr 返回字串的第一次索引
SELECT INSTR('六个月学习java的时间','时间') AS out_put;
6.replace替换函数
SELECT REPLACE('六个月学习java的时间','java','python');
7.trim 去除函数:第一个去除空格,第二个去除重复部分
SELECT TRIM(' 六个月学习java的时间 ') AS 说明;
SELECT TRIM('aa' FROM 'aaaa六个月学习java的时间aaaaaaa') AS 说明;8.lpad左填充,用指定的字符填充左边的长度
SELECT LPAD('一天学习java的时间',15,'天') AS 说明;9.rpad右填充,用指定的字符填充右边的长度
SELECT RPAD('学习的时间里',10,'aa');10.数学函数:ROUND 四舍五入
SELECT ROUND(1.66);
SELECT ROUND(2.888,2);11.数学函数:CEIL向上取整 FLOOR向下取整
SELECT CEIL(4.33);
SELECT FLOOR(7.99);12.数学函数:TRUNCATE 截断函数
SELECT TRUNCATE(99.223,2);13.数学函数:MOD 取余函数
SELECT MOD(38.2,2);14.日期函数:获取当前日期+时间,日期,时间
SELECT NOW();
SELECT CURTIME();
SELECT CURDATE();15.日期函数:可以获取指定的部分,年月日等
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT YEAR('1999-2-12');16.日期函数:STR_TO_DATE 字符转变为特定的日期形式
SELECT STR_TO_DATE('2008-10-15','%Y-%c-%d') AS out_date;
SELECT STR_TO_DATE(hiredate,'%Y-%c-%d') AS 工作日期 FROM employees;17.日期函数:DATE_FORMAT 日期转变为字符
SELECT DATE_FORMAT(NOW(),'%Y年%c月%d日');
SELECT DATE_FORMAT(hiredate,'%Y年%c月%d日') 入职日期,first_name FROM employees WHERE commission_pct IS NOT NULL;18.流程控制函数 IF
SELECT IF(1>10,2,20);
SELECT last_name,IF(commission_pct IS NULL,'没有奖金','有奖金可以过年') AS 备注 FROM employees;19.count函数 查询部门编号为90的员工个数
SELECT COUNT(*) FROM employees WHERE department_id=90;6.分组查询
1.基本语法:
如下:
select 查询列表
from 表
【where 筛选条件】
group by 分组的字段
【order by 排序的字段】;特点:
1、和分组函数一同查询的字段必须是group by后出现的字段
2、筛选分为两类:分组前筛选和分组后筛选
针对的表 位置 连接的关键字
分组前筛选 原始表 group by前 where
分组后筛选 group by后的结果集 group by后 having2.基本案例:
1.查询每个工种的最高工资
SELECT MAX(salary),job_id FROM employees GROUP BY job_id;2.查询每个位置上的部门个数
SELECT COUNT(*),location_id 部门 FROM departments GROUP BY location_id;3.查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id 部门号 FROM employees WHERE email LIKE '%a%' GROUP BY department_id;4.查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;5.查询哪个部门的员工个数大于5
SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING COUNT(*)>5 ;6.查询每个工种有奖金的员工的最高工资大于12000的工种编号和最高工资。
SELECT MAX(salary),job_id 工种 FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;7.按表达式或函数分组 按员工的姓名长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些?
SELECT COUNT(*),LENGTH(last_name) AS 员工姓名长度
FROM employees GROUP BY LENGTH(last_name)
HAVING COUNT(*)>5;8.查询每个部门每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id FROM employees
GROUP BY department_id,job_id;7.连接查询
1.基本概念
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行
分类:
按年代分类:
sql92标准:仅仅支持内连接
sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
内连接:等值连接 非等值连接 自连接
外连接: 左外连接 右外连接 全外连接
交叉连接
2.基本案例1.查询女生名和对应的男生名
SELECT NAME,boyName FROM boys,beauty WHERE boys.`id`=beauty.`boyfriend_id`;
2.查询员工名和对应的部门名
SELECT CONCAT(first_name,last_name) 姓名,department_name AS 部门名
FROM employees,departmentsWHERE employees.`department_id`=departments.`department_id`;
3.为表起别名,案例 查询员工名,工种号,工种名
SELECT e.`last_name`,e.`job_id`,j.`job_title`
FROM employees e,jobs j
WHERE e.`job_id`=j.`job_id`;4.
查询有奖金的员工名和部门名
SELECT employees.`last_name`,departments.`department_name`
FROM employees ,departments
WHERE employees.`department_id`=departments.`department_id`
AND employees.`commission_pct` IS NOT NULL;5.查询有奖金的每个部门的部门名和部门的领导编号和该部门的员工最低工资
SELECT MIN(e.`salary`),d.`department_name`,d.`manager_id`
FROM employees e,departments d
WHERE e.`department_id`=d.`department_id`
AND e.`commission_pct` IS NOT NULL
GROUP BY e.`department_id`,d.`manager_id`;6.查寻城市名中第二个字符为o的部门名和城市名,注意:LIKE模糊查询中的_和''
SELECT d.`department_name`,city
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
AND city LIKE '_o%';7.查询每个城市的部门个数
SELECT COUNT(*),l.`city`
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
GROUP BY l.`city`;8.查询每个工种的工种名和员工的个数,并且按员工个数降序
SELECT COUNT(*) 员工个数,j.job_title
FROM jobs j,employees e
WHERE j.`job_id`=e.`job_id`
GROUP BY j.`job_title`
ORDER BY COUNT(*) DESC;9.三表连接 查询员工名、部门名和所在的城市,且城市名包含s
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`
AND city LIKE '%s%';3. sql99语法
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】分类:
内连接(★):inner
外连接
左外(★):left 【outer】
右外(★):right 【outer】
全外:full【outer】
交叉连接:cross1.内连接
select 查询列表 from 表1 别名 inner join 表2 别名 on 连接条件;
案例(等值连接):查询员工名、部门名
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`;案例:查询名字中包含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的城市名和部门个数
SELECT COUNT(*) 部门个数,city
FROM locations l
INNER JOIN departments d
ON d.`location_id`=l.`location_id`
GROUP BY city
HAVING COUNT(*)>3;2.外连接
应用场景:用于查询一个表中有,另一个表没有的记录
特点:
1)、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录
2)、左外连接,left join左边的是主表
右外连接,right join右边的是主表
3)、左外和右外交换两个表的顺序,可以实现同样的效果
4)、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的案例:查询哪个城市没有部门
SELECT l.`city`
FROM locations l
LEFT OUTER JOIN departments d
ON l.`location_id`=d.`location_id`;
WHERE d.`department_id` IS NULL;案例:查询哪个部门没有员工
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;案例:查询编号大于3的女神的男神信息
SELECT b.* ,be.`id`,be.`name`
FROM boys b
RIGHT OUTER JOIN beauty be
ON b.`id`=be.`boyfriend_id`
WHERE be.`id`>3;4.三个join对比
操作符名称 描述 INNER JOIN ( JOIN ) 如果表中有至少一个匹配,则返回行 LEFT JOIN 不论右表是否有匹配,都会返回左表的所有行 RIGHT JOIN 不论左表是否有匹配,都会返回右表的所有行 5.#多表联查你要关注什么?:
#1.关注用到哪些表(from和join的后面的)
#2.这些表的共同字段(on的后面的)
#3.条件(where的后面的)
#4.你最后需要查询来的结果(select 的后面的)
#5.最后检查共同字段涉及到哪些表,两个的无需检查 如果多个就要看是不是要都给他连接起来,不然的话可能会出现条件遗漏
8.分页查询
LIMIT
公式 limit (curPage-1)*pageSize,pageSize
三.DML数据操作语言
1.INSERT命令
INSERT INTO 表名 [ ( 字段1, 字段2, 字段3, … ) ] VALUES ( '值1', '值2', '值3', …)2.UPDATE命令
UPDATE 表名 SET column_name = value [ , column_name2 = value2, …. ] [ WHERE condition ]; 3.DELETE命令
DELETE FROM 表名 [ WHERE condition ];4.TRUNCATE命令
TRUNCATE [TABLE] table_nameDELETE与TRUNCATE区别
相同 都能删除数据、不删除表结构,但TRUNCATE 速度更快 不同 使用TRUNCATE TABLE重新设置AUTO_INCREMENT计数器 使用TRUNCATE TABLE不会对事务有影响
四.数据库设计
数据库设计步骤
收集信息 与该系统有关人员进行交流、座谈,充分了解用户需求,理解数据库需要完成的任务
标识实体 (Entity)
标识数据库要管理的关键对象或实体,实体一般是名词
标识每个实体的属性(Attribute)
标识实体之间的关系(Relationship)
三大范式
第一范式的目标是确保每列的原子性
第二范式要求每个表只描述一件事情
第三范式如果一个关系满足2NF,并且除了主键以外的其他列都不传递依赖于主键列
五.索引恢复备份
MySQL的事务处理
事务就是将一组SQL语句放在同一批次内去执行 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
事务必须具备以下四个属性
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
改变自动提交模式
MySQL中默认是自动提交
SET AUTOCOMMIT = 0; # 关闭自动提交模式 SET AUTOCOMMIT = 1; # 开启自动提交模式事务实现方法
START TRANSACTION或者begin 开始一个事务,标记事务的起始点 COMMIT 提交一个事务给数据库 ROLLBACK 将事务回滚,数据回到本次事务的初始状态 SET AUTOCOMMIT = 1; 开启MySQL数据库的自动提交
数据库索引
作用
提高查询速度 确保数据的唯一性 可以加速表和表之间的连接,实现表与表之间的参照完整性 使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间 全文检索字段进行搜索优化
索引:索引是一种数据结构
分类
主键索引(PRIMARY KEY)
作用
某一个属性或属性的组合能唯一标识一条记录
特点
最常见的索引类型 确保数据记录的唯一性 确定特定数据记录在数据库中的位置
唯一索引(UNIQUE)
作用
避免同一个表中某数据列中的值重复
常规索引(INDEX)
作用
快速定位特定数据
index和key关键字都可设置常规索引 应加在查找条件的字段 不宜添加太多常规索引,影响数据的插入、删除和修改操作
全文索引(FULLTEXT)
一般不用
管理索引
创建索引
CREATE INDEX index_name ON table_name (column_name)
create index studentnameindex on student (studentname)
ALERT TABLE 表名 ADD 索引类型(数据列名)删除索引
DROP INDEX 索引名 ON 表名 ALTER TABLE 表名 DROP INDEX 索引名 ALTER TABLE 表名 DROP PRIMARY KEY查看索引
SHOW INDEX(或KEYS) FROM 表名准则
索引不是越多越好 不要对经常变动的数据加索引 小数据量的表建议不要加索引 索引一般应加在查找条件的字段
分析SQL语句的执行性能
EXPLAIN 表名 (DESC 表名) EXPLAIN SELECT语句1、id:这是SELECT的查询序列号
2、select_type:select_type就是select的类型,可以有以下几种:
SIMPLE:简单SELECT(不使用UNION或子查询等)
PRIMARY:最外面的SELECT
UNION:UNION中的第二个或后面的SELECT语句
DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULT:UNION的结果。
SUBQUERY:子查询中的第一个SELECT
DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
DERIVED:导出表的SELECT(FROM子句的子查询)
3、table:显示这一行的数据是关于哪张表的
4、type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一。
结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
5、possible_keys:列指出MySQL能使用哪个索引在该表中找到行
6、key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL
7、key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好
8、ref:显示使用哪个列或常数与key一起从表中选择行。
9、rows:显示MySQL认为它执行查询时必须检查的行数。
10、Extra:包含MySQL解决查询的详细信息,也是关键参考项之一。
添加正确的索引
在WHERE、ORDER BY 子句中经常使用的字段 字段的值是多个(例如性别字段则不适合) 字段内容不是经常变化的 经常变化的字段,添加索引反而降低性能 不宜过多添加索引 每添加一条索引都会占用磁盘空间
MySQL的备份与恢复
请用工具