首页 > 数据库 >mysql常用语法

mysql常用语法

时间:2024-07-25 15:51:35浏览次数:16  
标签:... 常用 -- 查询 语法 mysql WHERE id SELECT

  • MySQL约束

image-20240423135122970

注释

-- 单行注释
/*多行注释*/
# 井号注释

MySQL命令执行顺序

FROM > ON > JOIN WHERE > GROUP BY > HAVING + 聚合函数 > SELECT > ORDER BY > LIMIT

数据库设计——DDL

show databases;	-- 查看当前所有的数据库
use [数据库名];	-- 打开指定的数据库
show tables;	-- 查看所有的表
describe/desc [表名];	-- 显示表的信息
create database [数据库名];	-- 创建一个数据库,不容许重名
select database();	-- 查看当前操作的数据库
exit	-- 退出连接

数据库

/*创建数据库*/
CREATE DATABASE [if not exists] db_name
CHARACTER SET gbk
COLLATE gbk_chinese_ci;

/*修改数据库*/
ALTER DATABASE db_name
[CHARACTER SET gbk]	-- 可选
[COLLATE gbk_chinese_ci];	-- 可选

/*删除数据库*/
DROP DATABASE [if exists] db_name;

  • CREATE 创建表
/*基本格式*/
CREATE TABLE [if not exists] tb_name(
	字段名 字段类型 [约束] [auto_increment] [comment "备注"],
 	stu_code char(10) not null primary key,
 	name 	  char(10) not null,
 	gender   tinyint(1) not null
)CHARACTER SET 字符集 COLLATE 校对规则 ENGINE 引擎;

/*复制其他表*/
CREATE TABLE stu1 LIKE stu2;  
或  CREATE TABLE stu1 AS (SELECT * FROM stu2);
-- 后者仅复制表的数据
  • ALTER 修改表
/*基本格式*/
ALTER TABLE t_name ['选项'];	-- 若要同时进行多个操作,只需将每个选项用','隔开

/*选项:*/
-- 1.插入新列,FIRST|AFTER用于指明新列插入的位置
ADD 列定义1 [FIRST|AFTER 列名],
ADD 列定义2 [FIRST|AFTER 列名],
...	;
-- 2.更改表中某列的默认值或删除默认值,花括号不用写
ALTER 列名 SET DEFAULT 默认值; 或 DROP DEFAULT;
-- 3.更改列名,必须指定类型
CHANGE oldname newname 类型 [FIRST|AFTER 列名],
CHANGE ...;
-- 4.修改列属性
MODIFY 列定义1 [FIRST|AFTER 列名],
MODIFY ...;
-- 5.删除列
DROP 列名;
-- 6.表重命名
RENAME 新表名; {不用ALTER:RENAME TABLE 旧表名 TO 新表名;}
-- 7.按某列排序
ORDER BY 列名;

数据库操作语句——DML

  • INSERT 插入一个新记录到表里面
/*往表中插入单条或多条记录(不指定字段默认包含全部字段)*/
INSERT INTO 表名[(字段列表)] VALUES
(属性1,属性2...属性n),
(...);

-- 将'表1'数据插入'表2'中
INSERT INTO 表2 SELECT * FROM 表1;
  • UPDATE 修改基本表中的记录
/*基本格式*/
UPDATE [LOW_PRIORITY] [IGNORE] 表名
SET 字段1=expr1 [,字段2=expr2 ...]
[WHERE 条件]	-- 不加条件默认修改所有记录
[ORDER BY ...]
[LIMIT row_count];

  • DELETE 删除基本表中的记录
/*基本格式*/
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM 表名
[WHERE 条件]
[ORDER BY ...]
[LIMIT row_count];

/*清除所有记录*/
DELETE FROM 表名; | TRUNCATE TABLE 表名;

数据库查询语句——DQL

/*基本格式*/
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2][,...]]}	-- 要查询的字段
FROM tb_name [as table_alias]
[left | right | inner join table_name2]  -- 联合查询
[WHERE ...]  -- 指定结果需满足的条件
[GROUP BY ...]  -- 指定结果按照哪几个字段来分组
[HAVING]  -- 过滤分组后的记录必须满足的次要条件
[ORDER BY 字段 排序方式, ...]  -- 排序查询
[LIMIT {[offset,]row_count | row_countOFFSET offset}]; -- 分页查询
image-20230311155022176
  • 1、单表查询
SELECT 字段1,字段2,..,字段n FROM 表1;
/*查询整张表的记录*/
SELECT * FROM 表名;
/*别名--字段和表均可起别名,给表起别名可以方便SELECT语句的编写*/
SELECT studentkey AS 学号,name AS 姓名 FROM stu AS 学生表;
/*聚合函数*/
SELECT COUNT(*) AS 学生人数 FROM stu;	-- C OUNT()不计入条件值为NULL的记录
  • 条件查询——WHERE子句

关于WHERE的条件语句:image-20230311223218133

/*逻辑判断*/
AND--&& OR--||,NOT和!不能直接替换

SELECT 属性列表 FROM 表名 
WHERE [筛选条件];
例1:使用聚合函数,查询表score中101课程的最高分和最低分(成绩字段--result,编号字段--courseid)
SELECT MAX(result),MIN(result) FROM score
WHERE courseid='101';
/*模式匹配符`%`和`_`,通常与LIKE搭配使用*/
% 可以指代多个字符
_ 则只能指代一个字符
例子:查询名字倒数第二个字为d的同学
SELECT `StudentNo`,`StudentName` FROM student
WHERE `StudentName` LIKE '%d_';

/*NULL值判断,如果符合则返回true,否则返回false*/
WHERE 字段 IS NULL
WHERE 字段 IS NOT NULL

/*枚举查询 IN,NOT IN*/
- IN (属性1,属性2...属性n):查找字段值在属性表中匹配的记录
- NOT IN (...):查找与属性表中不匹配的记录
【注】:枚举查询优化较差,通常使用其他语句代替
  • 3、分组查询——GROUP BY子句
/*PS: 分组之后SELECT返回的字段主要包含两类:
	a. 分组的字段
	b. 聚合函数
*/
例1:使用HAVING子句,查找平均成绩在85分以上的学生的学号和平均成绩
SELECT studentkey,AVG(result) FROM score
GROUP BY studentkey
HAVING AVG(result)>=85;
-- 关于WHERE和HAVING子句:HAVING用于分组后再筛选,而WHERE用于分组前查询

image-20240423164135381

  • 4、排序查询
/*
asc 升序
desc 降序
指定查询的结果按一个或多个条件排序,默认升序,并且当前面字段相同时,才会根据后面的字段排序
*/
SELECT *|字段 FROM 表名
ORDER BY 字段1 排序方式, ...;
  • 5、分页查询
/*
:指定查询的记录从哪条至哪条
- 不包含起始索引,起始索引默认从0开始
- 每页的起始索引 = (查询页号 - 1) * 每页记录数
*/
SELECT 字段列表 FROM 表名
LIMIT 起始索引,每页记录数;
  • 6、MySQL中的流程控制

image-20240423171644963

/*if语句*/
select if(gender=1,'男性员工','女性员工') '性别',count(*) from tb_emp
group by gender;

/*case-when-else-end语句*/
select (case job
           when 1 then '班主任'
           when 2 then '讲师'
           when 3 then '学工主管'
           when 4 then '教导主任'
           else 'null' end) as 职位,count(*)
from tb_emp
group by job;

连接查询(多表关联查询)

t1 m n t2 m n
i1 1 a j1 2 b
i2 2 b j2 3 c
i3 3 c j3 4 d
  • 常用格式

image-20240424164704516

SELECT 字段列表|* FROM 表1 {INNER | LEFT | RIGHT} JOIN 表2
ON 表1.字段x=表2.字段y
WHERE 筛选条件;	# where用于连接查询后再筛选
  • 1、内连接--INNER JOIN

image-20240424164744600

-- 最后返回的结果是两张表同时存在的数据行数,只存在于单张表的数据行并不会返回
例1: SELECT * FROM t1 INNER JOIN t2 ON t1.m=t2.m;
->返回结果:2 | b、3 | c
  • 2、外连接
/*外连接之左外连接--LEFT JOIN*/
# 以JOIN左边的表为'主表',右边的为'从表',返回的数据行数以left表为行数,拼接右表中匹配的字段
# 对于左表中的数据行,当右表无匹配时,通常以NULL填充
例2: SELECT * FROM t1 LEFT JOIN t2 ON t1.m=t2.m;
->返回结果:i2|j1 ; i3|j2 ; i1|NULL

/*外连接之右外连接--RIGHT JOIN*/
# 以JOIN右边的表为主表,左边的为从表
例3: SELECT * FROM t1 RIGHT JOIN t2 ON t1.m=t2.m;
->返回结果:i2|j1 ; i3|j2 ; NULL|j3
  • 3、自连接
自连接即自己和自己连接,相当于和另一张副本表连接
SELECT a.`courseid` AS '父课程',b.`courseid` AS '子课程'
FROM course AS a,course AS b
WHERE a.`courseid`=b.`pid`;

子查询

  • 单行子查询
=等于,>大于,>=大于等于,<小于,<=小于等于,!=|<>不等于
-- 查找薪水大于所有员工平均薪水的员工
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > (
    SELECT AVG(salary) FROM employees);

/*子查询返回结果为单行多列*/
-- 查询tb_emp表中'入职日期'、'岗位'都与'张三'相同的员工信息
SELECT * FROM tb_emp WHERE (entrydate,job)=
(select entrydate,job FROM tb_emp WHERE name="张三")
  • 多行子查询

image-20240424173443936

/*
[NOT] IN: [不]等于子查询返回值中的任意一个
ANY: 需与单行比较操作符一起使用,表示至少或任一
ALL: 需与单行比较操作符一起使用,表示与子查询的所有值进行比较
*/
-- 例1: 返回其它job id中比job id为'IT_PROG’部门任一工资低的员工的员工号姓名、job id以及salary
select last_name,job_id,salary
from employees
where salary < any (
    select salary from employees where job_id = 'IT_PROG'
) and job_id <> 'IT_PROG';

-- 例2:将子查询作为一张'临时表'使用
查询入职日期是"2006-01-01"之后的员工信息,及其部门名称
select e.*,d.name from 
(select * from tb_emp where entrydate > '2006-01-01') e, tb_dept d where e.dept_id=d.id;

事务

/*一个事务是一组操作,要么一起成功,要么一起失败,当一个事务中的某次执行失败时,可以通过回滚来恢复数据,当事务执行失败时,不会影响原表中的数据,操作的结果只会作用于当前界面内的副本,保持了事务的一致性*/
begin ;
delete from tb_dept where name='学工部';
delete from tb_emp where id=1;
select * from tb_dept;
commit ;

rollback ;
  • 四大特性

image-20240425135335579

数据库的优化——索引

索引(index)是帮助数据库高效获取数据数据结构,使用空间来换时间,同时也降低了增删改的效率

  • 索引结构

默认是B+树(多路平衡搜索树)结构组织的索引

/*主键、唯一约束都会默认创建一个索引,主键索引是性能最高的*/
-- 创建索引
create [unique] index 索引名 on 表名(字段1,...)
-- 查看索引
show index from 表名
-- 删除索引
drop index 索引名 on 表名
# 限定查询 LIMIT
- LIMIT n;	//只返回查询结果的前n行记录
- LIMIT offset,length;		//返回从下标为offset处开始查询,往后的length行记录

- 分页查询公式: LIMIT (pageCount-1)*rowsCount,rowsCount;
pageCount:页码	rowsCount:每页数据行数

## 联合查询 UNION和UNION ALL
UNION-- 自动去除重复行
UNION ALL-- 不去除重复行
【注】:使用UNION时上下 SELECT子句中字段数必须相同

## 唯一 UNIQUE
约束字段值不可重复,但 NULL 值不受约束

## 主键 PRIMARY KEY
 唯一+非空:主键修饰的字段不可为空
 CREATE TABLE t1
 (id int NOT NULL PRIMARY KEY,
  ...
 );		或者
 CREATE TABLE t1
 (id int NOT NULL,
  ...,
  PRIMARY KEY(id)	/*写在字段声明语句的后面*/
 );
 
 ## 自增长 AUTO_INCREMENT
 /*
 1.使用auto_increment的字段必须是一个键:UNIQUE | PRIMARY KEY
 2.自增长值默认从1开始
 3.auto_increment修饰字段可以显式指定字段值,只要满足唯一非空约束即可,且如果字段值>自增长值,则直接将字段值赋值给当前自增长值
 4.使用delete删除记录并不会影响自增长值
 5.使用'TRUNCATE 表名;'可以删除整表记录,并重置自增长计数器
 */
 CREATE TABLE t1(
 id int(11) NOT NULL UNIQUE|PRIMARY KEY AUTO_INCREMENT,
 ...
 );
 
 ## 外键
 /*外键可连接两张表,从而使两张表中的同一个字段同步,进行约束*/
 常用格式:
 CREATE TABLE t1(
     ...,
     CONSTRAINT 外键名 FOREIGN KEY(cuorseid) cuorseid REFERENCES t2(id),	
     -- 字段1为当前表中作为外键约束的数据
     -- 选择作为外键约束的主表t2的字段id
     ...
 );
 【注】
# 外键约束有利有弊
# 优势:
#       1. 添加数据有条件约束,防止添加错误
#       2. 删除数据有条件约束,防止误删
# 劣势:
#       1. 整个数据库成为一坨,操作不便
#       2. 外键约束会降低【数据库】的性能
#       3. 羁绊过多,耦合度太高了

# 心中有外键思想,数据库无外键约束
 

标签:...,常用,--,查询,语法,mysql,WHERE,id,SELECT
From: https://www.cnblogs.com/six-years/p/18323368

相关文章

  • Mysql常用函数
    1、FIND_IN_SETFIND_IN_SET()是一个MySQL中的字符串函数,用于在一个由逗号分隔的字符串列表中查找指定字符串的位置。如果找到了指定的字符串,FIND_IN_SET()将返回该字符串在列表中的位置(索引值)。如果没有找到,它将返回0。其语法如下:FIND_IN_SET(str,strlist)str:......
  • Mybatis常用动态标签
    MyBatis动态SQL标签指南MyBatis提供了一组动态SQL处理功能,允许在运行时构建SQL语句。这非常有用,因为你可以根据不同的条件组合查询。下面是常用的动态SQL标签及其使用方法。<if>标签作用:根据表达式的结果决定是否包含某个SQL片段。属性:test属性用于设置判......
  • Java基础语法
    Java基础语法目录Java基础语法1.关键字和保留字关键字(Keywords)保留字(ReservedWords)2.标识符2.1.命名规则1.标识符的组成2.标识符的首字符3.标识符的命名限制4.命名风格5.其他建议6.示例2.2.驼峰命名法大驼峰命名法(UpperCamelCase)小驼峰命名法(lowerCamelCase)注意事项2.3.变......
  • C语言【面试】常用知识点总结之常用易错易混点解析
    第二部分:程序代码评价或者找错有符号整型和无符号整型混合运算时,有符号型自动转换成无符号型,运算的结果是无符号的。如果参与运算的数据类型不同,会自动转化为同一类再运算,这就是自动转换自动转换的规则如下:1.当参与运算的数据的类型不同时,编译系统会自动先将他们转换成......
  • 信息收集:网络空间测绘FOFA,查询语法最全使用方法(图文解析)
    前言经小绿书粉丝投稿,特意搜集了一些fofa的使用教程和一些高级用法什么是FOFA?官网描述:FOFA-网络空间资产搜索引擎是华顺信安推出的一款通过对全球网络对外开放服务的资产进行主动或被动方式探测、抓取、存储,分析整理不同种类的网络空间资产指纹信息(规则),并对符合规则的资产......
  • Mysql 函数 (进阶介绍 八)
    目录MySQLCURTIME()函数定义和用法语法实例MySQLDATE()函数定义和用法语法实例MySQLEXTRACT()函数定义和用法语法实例MySQL字符串连接CONCAT()函数使用方法:MySQL字符串截取SUBSTRING()函数 使用方法:MySQL数学函数使用方法:mysqlsubstr()函数截......
  • 常用端口申请IP SSL实现https教程
    在网络安全和数据保护方面,使用HTTPS协议来保护网站和应用程序的通信变得至关重要。一般情况下,HTTPS证书是基于域名签发的。但是,有时候我们可能需要为IP地址申请HTTPS证书,在一些特殊场景下确保通信的安全性。IPSSL证书也是SSL证书的一种,因其是颁发给IP地址使用的,所以我们......
  • Linux常用命令总结
    基础命令文件管理命令cata.txt#显示文本文件的内容cat-na.txt#显示文本文件的内容(并显示行号)cat-Aa.txt#显示文本文件的内容(含不可见字符)head/tail-na.txt#查看指定文件的头部/尾部内容less/more-na.txt#以分页方式查看长文件od-xa.txt#以十六进......
  • markdown的基本语法
    markdown的使用说明一、标题语法:#(一级标题)##(二级标题)###(三级标题)......代码:#这是一级标题##这是二级标题效果:这是一级标题这是二级标题快捷键:Ctrl+数字1~6可以快速将选中的文本调成对应级别的标题Ctrl+0可以快速将选中的文本调成普通文本C......
  • 一文了解MySQL索引机制
    接触MySQL数据库的小伙伴一定避不开索引,索引的出现是为了提高数据查询的效率,就像书的目录一样。某一个SQL查询比较慢,你第一时间想到的就是“给某个字段加个索引吧”,那么索引是什么?是如何工作的呢?一起静下心来,耐心看完这篇文章吧,干货不啰嗦,相信你一定会有所收获。一、索引模型模......