Mysql增删改(查高级用法)

进入mysql 命令行: mysql -uroot –p
查看所有数据库: show databases;
创建数据库: create database wg charset utf8;
删除数据库: drop database wg;
选择数据库: use databases;
查看所有表: show tables;
查看创建数据库的语句:show create database databasename;
查看创建表的语句:show create table tablename;
查看表结构:desc tablename;

增:
mysql> use wg;
mysql> create table students( id int auto_increment primary key,name varchar(10) not null,sex varchar(12),address varchar(50),phone int not null unique);
#自增长 auto_increment
#非空 not null
#默认值 default ‘xx’
#唯一 unique
#指定字符集 charset
#主键 primary key
mysql> create table scores(id int auto_increment primary key,s_id int not null,grade float not null);
数据:
mysql> insert into student (id,name,sex,phone) values(122,’wg’,’男’,’110’);
mysql> insert into students values(111,’wg’,’121’,’dd’) ;

删:
mysql> drop table tablename;
mysql> truncate tablename; 快速删除表数据,自增长id从头在来,快速,从磁盘直接删除,不可恢复
mysql> delete from student; 删除整个表的数据,自增长继续
mysql> alter table wg drop name; 删除wg表的name字段
Mysql> create user wg@’localhost(本地)/%(远程)’identified by ‘123’;创建本地/远程用户密码为123
set password for root@’localhost’=password(‘123’);修改root用户密码

改:
mysql> alter table oldtable rename newtable; 改表名
mysql> alter table scores modify s_id varchar(20);在这里插入图片描述
在这里插入图片描述
mysql> alter table scores change s_id scoresss varchar(16); 修改表结构
在这里插入图片描述
mysql> alter table scores add age float after id; 新增字段的位置(age放在了ID后面)
在这里插入图片描述
mysql> update student set age=18;不指定条件,修改所有
mysql> update student set age=18 where name=‘wg’;只修改网工

查:
mysql> show create table tablename; 查看新建表语句
mysql> desc tablename; 查看表结构
mysql> show tables; 查看所有表
mysql> select * from students limit 5;查询5条
mysql> select * from students limit 1,5;从第几条开始,下面的n条
mysql> SELECT * from students where sex=‘男’; #指定条件
mysql> SELECT * from students where sex=‘男’ and age>10; #多个条件,必须同时满足
mysql> SELECT * from students where sex=‘男’ or sex=‘未知’ ; #多个条件,有一个满足即可
mysql> SELECT * from students where sex !=‘男’; #<>也是不等于

mysql> SELECT * FROM students where addr like ‘%东京%’;#模糊匹配,%代表的是通配符,必须得用like

mysql> SELECT * from students a where a.stu_name like ‘姚_’;#_通配符表示任意一个单字符,姚字后面只能跟一个字

mysql> SELECT a.stu_name ‘学生名称’,a.phone ‘学生电话’ from students as a where a.stu_name=‘姚远’;#给表起别名,as可以省略

SELECT * from students a where a.money BETWEEN 1000 and 10000;#在什么什么之间的数据

SELECT * from students ORDER BY money desc; #order by xxx desc,根据哪个字段继续排序,默认是升序,降序是desc,升序asc

SELECT * from students a where a.addr = ‘’ or a.addr is null; #查询字段为空的数据

SELECT DISTINCT a.money from students a ;#去重
SELECT COUNT(*) ‘学生人数’ from students where sex=‘女’; #统计行数

SELECT MAX(a.money) 钱最多 from students a; #最大值
SELECT min(money) 钱最少 from students;#最小值
SELECT AVG(a.money) 平均多少钱 from students a; #平均数
SELECT sum(a.money) 总共多少钱 from students a;#总和

分页查询: limit
limit 后的参数:第一个表示 起始位置(下标从0开始),第二个参数是显示的个数(表示本次基于起始位置显示多少个)
select * from t_hero limit 0,3
结合where条件:只显示state不为null 的结果
select * from t_hero where state is not null limit 0,20

连接查询: 将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接)。

连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表.

连接查询: join, 使用方式: 左表 join 右表;左表: 在join关键字左边的表;右表: 在join关键字右边的表

连接查询分类:SQL中将连接查询分成四类: 内连接,外连接,自然连接和交叉连接

交叉连接:交叉连接: cross join, 从一张表中循环取出每一条记录, 每条记录都去另外一张表进行匹配: 匹配一定保留(没有条件匹配), 而连接本身字段就会增加(保留),最终形成的结果叫做: 笛卡尔积。但是基本不会用到(反正我是从没有用过)

基本语法: 左表 cross join 右表 或 from 左表,右表;
在这里插入图片描述
在这里插入图片描述
内连接: [inner] join, 从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段; on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)

字段别名以及表别名的使用: 在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分, 而表名太长, 通常可以使用别名.

内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果(笛卡尔积)

内连接还可以使用where代替on关键字,但效率差很多。
在这里插入图片描述
在这里插入图片描述
外连接: 以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL.

外连接分为两种: 是以某张表为主: 有主表

left join: 左外连接(左连接), 以左表为主表

right join: 右外连接(右连接), 以右表为主表

基本语法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;
在这里插入图片描述
在这里插入图片描述
联合查询
联合查询:将多次查询(多条select语句), 在记录上进行拼接(字段不会增加)

基本语法:多条select语句构成: 每一条select语句获取的字段数必须严格一致(但是字段类型无关)

Select 语句1

Union [union选项]

Select语句2…

Union选项: 与select选项一样有两个

All: 保留所有(不管重复)

Distinct: 去重(整个重复): 默认的
在这里插入图片描述
在这里插入图片描述
联合查询只要求字段一样, 跟数据类型无关
在这里插入图片描述
联合查询的意义:

  1. 查询同一张表,但是需求不同: 如查询学生信息, 男生身高升序, 女生身高降序.

  2. 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.

Order by使用

在联合查询中: order by不能直接使用,需要对查询语句使用括号才行;另外,要orderby生效: 必须搭配limit: limit使用限定的最大数即可.
在这里插入图片描述
子查询
子查询: 查询是在某个查询结果之上进行的.(一条select语句内部包含了另外一条select语句).

子查询分类

子查询有两种分类方式: 按位置分类;和按结果分类

按位置分类: 子查询(select语句)在外部查询(select语句)中出现的位置

From子查询: 子查询跟在from之后

Where子查询: 子查询出现where条件中

Exists子查询: 子查询出现在exists里面

按结果分类: 根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)

标量子查询: 子查询得到的结果是一行一列

列子查询: 子查询得到的结果是一列多行

行子查询: 子查询得到的结果是多列一行(多行多列) (1,2,3出现的位置都是在where之后)

表子查询: 子查询得到的结果是多行多列(出现的位置是在from之后)

标量子查询
需求: 找到分类为科技的所有文章标题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
列子查询

这个时候我就想起以前面试的情形,当时有一道题,给我一个表,让我找出语文和数学都及格人的名字。表是这样的:
在这里插入图片描述
在这里插入图片描述
行子查询

行子查询: 返回的结果可以是多行多列(一行多列)
需求:找出年龄最大且身高最高的人
在这里插入图片描述
方案一:
在这里插入图片描述
方案二:
在这里插入图片描述
表子查询

表子查询: 子查询返回的结果是多行多列的二维表: 子查询返回的结果是当做二维表来使用
需求:找出每个人最好的成绩
在这里插入图片描述
在这里插入图片描述
Exists子查询

Exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表), exists是接在where之后: exists返回的结果只有0和1.
需求:如果存在的话身高大于2米的人,列出表中所有数据
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值