MYSQL的所有基础操作
MYSQL的基础操作
客户端和数据库的最基本操作
1.如果没配置好环境的打开方式,打开mysql自带的客户端使用
配置好了的话直接使用cmd输入mysql -root -p然后就可以登录客户端
mysql -u root -p2.查看当前数据库的版本select version();
3.展示所有的数据库:show databases;//注意databases是复数
4.创建数据库:create database [if not exists] database 数据库名 character 字符集编码 collate 排序规则。//使用这个的时候最好是指定字符集和排序规则,因为版本不同的时候不指定会使用默认的容易出事。
5.选择数据库 use 数据库名;
6.查看选择了哪个数据库 select database();
7.删除数据库 drop database[if exist] 数据库名;//删除操作都是比较危险的,容易误删,删除要在三思虑;
8.查看警告的信息 show warnings;
9.退出 quit/ exit
10.如果混乱了不知道该怎么办就使用help就能看到mysql自带的提示工具
-- 查看版本
SELECT VERSION();-- 列出所有数据库
SHOW DATABASES;-- 创建数据库(推荐指定字符集)
CREATE DATABASE IF NOT EXISTS db_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;-- 选择数据库
USE db_name;-- 查看当前使用数据库
SELECT DATABASE();-- 删除数据库
DROP DATABASE IF EXISTS db_name;-- 显示警告信息
SHOW WARNINGS;-- 退出客户端
QUIT; -- 或 EXIT;表操作
所有的表都是存在于数据库的,要使用表要先调用数据库
- 查看数据库中有什么表 show tables//同理tables也是复数;
- 创建一张表 create table 【if not exist】表名(列表/字段名 数据类型 约束, , );//创建表的时候最后一个不需要逗号
- 查看一个表的结构 : desc 表名 (desc也表示大到小的排序);
- 删除表: drop table 【if exist】表名;//删除操作都是很危险的,使用要多思考
-- 查看当前数据库所有表 SHOW TABLES;-- 创建表(含字段约束) CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(20) NOT NULL UNIQUE,age INT CHECK(age > 0),create_time DATETIME DEFAULT CURRENT_TIMESTAMP );-- 查看表结构 DESC users;-- 删除表 DROP TABLE IF EXISTS users;
CRUD增删查改
新增-插入
语法:insert into 表名 (【列名,列名】) values(值,值);
在使用插入的时候要一一对应,前面有几个字段/列名后面的值就要一一对应,如果省略了列名的话就是默认全部都要,值都要写 :
省略写法 : insert into 表名 values ();//全部都要写一个都不能缺
-- 完整插入(需所有字段)
INSERT INTO users VALUES (NULL, 'John', 25, NOW());-- 指定字段插入
INSERT INTO users (username, age) VALUES ('Alice', 30);查询
- 全列查询:select * from 表名// *表示你要返回的数据,这种不加任何条件的查询,在数据量很多的时候会让服务器崩溃。
- 指定列查询 : select 列名/字段 from 表名//一般多使用这种
- 表达式查询:select 表达式 from 表名;
- 别名查询:select 表达式/列名 as 别名 from 表名;//别名包含空格的时候要用 ’ ’ 引起来,as可以省略不写但是我个人不喜欢这种省略的写法;
- 去重查询:select distinct 列名 from 表名;//关键字是distinct 去掉重复
- 排序:select 列名from 表名 order by 列名 asc|desc//关键字是order by,asc是升序排序,desc是降序。
- 条件查询:select 列名 from表名 where 条件 order by 列名 asc|desc;//
关键字就是where里面写的是条件,如果前面指定了别名,那么where里面不可以使用别名排序,这是因为 mysql的执行顺序是先from再where;
- 区间查询:select 列名 from 表名 between 条件 and条件;//等价于:
Select 列名 from 表名 where 开始条件 开始<=值<=结束;
- 模糊查询:select 列名 from 表名 where 列名 like ‘ %值’/‘-值’;//%表示的是可以是无数个也可以是0个 而-一条表示一个,都是属于占位符,在前面表示前面有,后面就表示后面有
- 分页查询:select 列名 from表名 order by 列名 asc|desc limit num;//关键字是num,表示查询前num条数据;
第二种写法 :select 列名 from表名order by 列名 asc|desc limit start,num;//从start开始查询num条数据
第三种写法 :select 列名 from表名 order by列名asc|desc limit num offset start;//在start开始查询num条,offset 就是偏移量
-- 全列查询(慎用)
SELECT * FROM users;-- 指定列查询
SELECT username, age FROM users;-- 条件查询
SELECT * FROM users WHERE age > 20;-- 分页查询
SELECT * FROM users LIMIT 10 OFFSET 5; -- 第6-15条记录更新
语法:update 表名 set 列名 =值 where条件 order by 列名 asc|desc limit num;//
这个操作和删除的危险系数差不多,在不指定条件的情况下更改了全表的数据
-- 条件更新
UPDATE users SET age = 26 WHERE username = 'John';删除
语法: delete from表名 where 条件 order by 列名 asc|desc limit num;//删除操作都是要慎之又重
-- 条件删除
DELETE FROM users WHERE age < 18;数据库约束
- 非空约束 :not null标记一个字段是不是能为空,加了这个就不能为空
- 唯一约束: unique标记一个字段是这个表中唯一的,不能重复,可以是null;
- 主键约束:primary key 标记一个字段既不能是空也要是唯一的,一张表只能有一个主键,但是一个主键可以有多个字段;
- 默认约束: default标记一个字段在没有写入任何数据的时候使用我给的默认字段进行填充;
- 外键约束:foreign key 另外一张表的主键和这张表进行关联,进行增删查改的时候数据库会进行校验;foreign key 字段 references (另外一张表的主键);
- Check约束:写入的信息只能存在于这里 字段 类型 check(条件);
CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,amount DECIMAL(10,2) CHECK(amount > 0),FOREIGN KEY (user_id) REFERENCES users(id) );
表的设计
三大范式
1NF:表中的所有字段都是最精简的不可以再分出去的,每一列都是不可再分的
2NF:要满足第一范式的情况下,消除部分函数依赖,只存在于复合主键之中,例如字段1和字段2依赖字段3,但是字段4和字段5依赖字段6;
3NF:在满足第二范式的情况下,消除传递依赖,(通过某些字段可以推断出其他的)
关系模型
- 一对一模型 :先各自创立一张表,然后在另外一张表中设置一个外键就行
- 一对多模型:先各自创表,然后在多的表中设置一个一的外键
- 多对多模型:各自创表,创多一张关系表
聚合函数
- Count(列名|*|1);//统计结果的条数
- AVG(列) ;求平均值
- Sum(列);//求和,null会被忽略
- Max(列);//最大值
- Min(列);//最小值,这里的null不会出现,不参与
-- 聚合函数 SELECT AVG(age) FROM users;-- 分组查询 SELECT age, COUNT(*) FROM users GROUP BY age;-- 内连接 SELECT u.*, c.class_name FROM users u JOIN classes c ON u.class_id = c.id;-- 左外连接 SELECT u.*, c.class_name FROM users u LEFT JOIN classes c ON u.class_id = c.id;
Group by 分组查询
对某一个字段进行分组查询
Select 字段,聚合函数 from表名group by 字段;
Having子句
配合group by使用,主要的作用就是对临时表进行过滤效果是和where 一样的
联合查询/表链接查询(面试重点)
内连接:
语法:
Select * from table1 ,table2 where连接条件;
Select * from table1 join table2 on 连接条件;
Select * from table1 inner join table2 on连接条件;
表连接的解题思路:
- 确定需要用到几个表;
- 取他们的笛卡尔积;//这一步相当于进行了全排列
- 通过连接条件过滤掉无用的数据
- 加入查询条件进行查找
- 精简需要的数据
外链接
a.左外连接:select * from table1 left join table2 on 条件;
左外连接就是以join左边的表为基准,会展示左表的所有数据,如果右表中没有对应的数据就会全部使用null;
b.右外连接:select * from table1 right join table2 on 条件
右外连接对应就是以jion的右边为基准,展示右表的全部数据左表中没有的话就全部使用null代替;
自连接
Select * emp e1, emp e2 where条件;
看似简单其实不然,使用自连接主要就是因为没办法进行的比较,所以通过自连接把它转为列来比较,这里也是需要多加练习;
子查询
单行子查询:select * from table where Id= (select Id from table2 where 条件);//这个只需要注意在where后面的条件要和你查询的条件一样就行;
多行子查询:select * from table where Id in (select Id from table2 where 条件);//多行子查询其实就是返回的值可能是一个集合,所有用in来表示后面返回的是一个集合;
合并查询
Select * from table1 union select * from table2;
单纯的union会有一个去重的效果,他不会显示重复出现的数据
Select * from table1 unionall select* from table2;
Unionall会全部的展示出来并没有去重的效果
在使用联合查询的时候需要注意一下,mysql并不对最终的结果做校验,也就是如果两个表的字段不同,会导致显示出来的东西是很奇怪的;
Mysql语句的执行顺序
Select distinct id,name avg(age) from student join class on student.class_id = class.id where class_id = 1 group by student.id having avg(age) >0 order by student.id limit 100;
From à join àonàwhereàgroup byàhavingàselectàdistinctàorder byàlimit;
