终端常用命令
退出exit
启动net start mysql
登录mysql -uroot -proot
目录
1.SQL通用语法
(1)可以单行多行书写,以分号结尾
(2)不区分大小写
(3)注释:
单行注释: -- 注释内容(两个横杠和一个空格);#注释内容
多行注释:/*注释*/
2.SQL分类
(1)DDL:
操作数据库,表等
操作数据库:
①查询:
show databases;
②创建
create database 数据库名称; create database if not exists 数据库名称;
③删除
drop database 数据库名称; drop database if not exists 数据库名称;
④使用数据库
查看当前使用的数据库:
select database();
使用数据库:
use 数据库名称;
操作数据表:
①查询表
·查询当前数据库下所有表名称 show tables;
·查询表结构
desc 表名称;
②创建表
Create table 表名( 字段名1 数据类型1, 字段名2 数据类型2, .... 字段名n 数据类型n );
注意:最后一行末尾,不能加逗号
③删除表
drop table 表名; drop table if exists 表名;
④修改表
-- 修改表名 alter table 表名 rename to 新的表名; -- 添加一列 alter table 表名 add 列名 数据类型; -- 修改数据类型 alter table 表名 modify 列名 数据类型; -- 删除列 alter table 表名 drop 列名;
(2)DML:
对表中数据进行查询
基础查询
1.查询多个字段
Select 列名 from 表名; Select * from;(查询所有列的数据)
2.去除重复记录
Select distinct 列名 from 表名;
3.起别名
As :
条件查询(where)
Select 列名 from 表名 where 条件列表;
条件:
- null值的比较不能使用= !=,需要使用is null,is not null
- <>或!= 不等于 between....and....在某个范围之内
- Like 占位符 模糊查询
-- 查询名字中包含婕的信息 select * from stu where name like ‘%婕%’; -- 查询名字中第二个字婕的信息 select * from stu where name like ‘-婕%’;
排序查询(order by)
- 排序查询语句
Select 列名 from 表名 order by 排序字段名1[排序方式],排序字段名2[排序方式]...;
排序方式:
·ASC:升序排列
·DESC:降序排列
注意:如果有多个排序条件,当前的条件值一样时,才会根据第二条件进行排序
聚合函数
- 聚合函数分类
Count(列名) 统计数量
max(列名) min(列名) sum(列名) avg(列名)
- 聚合函数语法:
Select 聚合函数名(列名) from 表;
注意:null值不参与所有聚合函数运算
分组查询(group by)
- 分组查询语法
Select 列名 from 表名 [where 分组前提条件] group by 分组字段名 [having 分组后条件过滤];
注意:分组后,查询字段为聚合函数和分组了的字段,查询其他字段没有意义。
2.Where 和having 区别:
- Where是分组前的限定,不满足where条件的不参与分组,having是分组后对结果进行过滤。
- Where不可以对聚合函数进行判断,having 可以。
执行顺序:where>聚合函数>having
例:查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的
Select sex,avg(math),count(*) from stu where >70 group by sex having count(*)>2;
分页查询(limit)
分页查询语法
Select 字段列表 from 表名 limit 起始索引,查询条目数;
计算公式:起始索引=(当前页面-1)*每页显示的条数
例:
每页显示3条数据,查询第一页数据
Select * from 表名 limit 0,3;
每页显示3条数据,查询第二页数据
Select * from 表名 limit 3,3;
每页显示3条数据,查询第三页数据
Select * from 表名 limit 6,3;
Tips:
- 分页查询limit是MySQL的方言
- Oracle分页查询使用rownumber
- sqlserver 分页查询使用top
(3)DCL:
对数据库进行权限控制
约束
非空约束 not null
唯一约束 UNIQUE
主键约束 PRIMARY KEY 非空且唯一
检查约束 CHECK 列中值满足某一条件
默认约束 DEFAULT 未指定值采用默认值
外键约束 FOREIGN KEY 两个表的数据建立连接
Tip:MySQL不支持检查约束
例:
CREATE TABLE emp( id int PRIMARY key,-- 主键 ename VARCHAR (50)NOT NULL UNIQUE,-- 非空且唯一 joindate DATE NOT NULL, salary DOUBLE (7,2) NOT NULL, bonus DOUBLE(7,2) DEFAULT 0 -- 若为空时,奖金默认为0 );
外键约束
语法:
1.添加约束
①建表时添加约束
Create table 表名( 列名 数据类型, ...... [CONSISTENT] [外键名称] FOREIGN key(外键列名) REFERENCES 主表(主表列名) );
②建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN key(外键列名) REFERENCES 主表(主表列名);
2.删除约束
ALTER TABLE 表名 drop FOREIGN key 外键名称;
3.数据库设计
- 一对一
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一
- 一对多
实现方式:在多的一方建立外键关联的一方主键
- 多对多
实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
多表查询
(1)内连接
内连接查询语法
①隐式内连接
SELECT 字段列表 FROM 表1,表2 ...WHERE 条件;
例:查询emp的name,bonus,dname
SELECT
emp. NAME,
emp.bonus,
demp.dname
FROM
emp,
dept
WHERE
emp.dep_id = dept.did;
②显式内连接
SELECT 字段列表 FROM 表1[inner] JOIN 表2 ON 条件;
例SELECT
*
FROM
emp
INNER JOIN dept ON emp.dep_id = dept.did;
内连接相当于查询AB交集数据
(2)外连接
左外连接:相当于查询A表所有数据和交集部分数据
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
左外连接:相当于查询B表所有数据和交集部分数据
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
子查询
(1)查询中嵌套查询
- 单行单列:作为条件值,使用=! <>等进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询);
- 多行单列:作为条件值,使用in进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 in (子查询);
- 多行多列:作为虚拟表
SELECT 字段列表 FROM (子查询) WHERE 条件;
例:
查询入职日期是’2011-11-11’之后的员工信息和部门信息
SELECT * FROM emp WHERE join_date > '2011-11-11';
SELECT * FROM (SELECT * FROM emp WHERE join_date > '2011-11-11') t1,dept WHERE t1.dep_id =dept.did;
4.事务
数据库的事务是一种机制,一个操作序列,包含了一组数据库操作命令
把所有命令作为一个整体一起向系统进行提交或撤销请求
--开启事务
BEGIN;
或
START TRANSACTION;
--提交事务
COMMIT;
--回滚事务:回到开启事务之前
ROLLBACK;
MYSQL会自动提交事务
事务的四大特征
ACID
- 原子性(atomicity):事务是不可分割的最小操作单位,要么同时成功,要么同时失败
- 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
- 隔离性(Isolation):多个事务之间,操作的可见性
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的