ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQL底子篇快速记忆和查询 [打印本页]

作者: 海哥    时间: 2024-5-13 14:46
标题: MySQL底子篇快速记忆和查询
查询

  1. SELECT   标识选择哪些列
  2. FROM     标识从哪个表中选择
复制代码
去重(Distinct)

在SELECT语句中使用关键字DISTINCT去除重复行
  1. SELECT DISTINCT department_id
  2. FROM   employees;
复制代码
过滤(Where)

语法:
  1. SELECT 字段1,字段2
  2. FROM 表名
  3. WHERE 过滤条件
复制代码
排序(Order by)

使用 ORDER BY 子句排序
ORDER BY 子句在SELECT语句的结尾。
  1. SELECT last_name, department_id, salary
  2. FROM   employees
  3. ORDER BY department_id, salary DESC;
复制代码
分页(Limit)

格式:
  1. LIMIT [位置偏移量,] 行数
复制代码
第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数“行数”指示返回的记录条数。
操纵数据库
  1. CREATE DATABASE 数据库名 IF NOT EXISTS ;  #创建
  2. SHOW DATABASES; #查看,加上括号是查看当前
  3. USE DATABASE; #使用/切换数据库
  4. ALTER DATABASE 数据库名 CHARACTER SET 字符集;  #修改数据库
  5. DROP DATABASE IF EXISTS 数据库名; #删除数据库
复制代码
操纵表

创建表(create)
  1. CREATE TABLE [IF NOT EXISTS] 表名(
  2.         字段1, 数据类型 [约束条件] [默认值],
  3.         字段2, 数据类型 [约束条件] [默认值],
  4.         字段3, 数据类型 [约束条件] [默认值],
  5.         ……
  6.         [表约束条件]
  7. );
复制代码
AUTO_INCREMENT: 自增
边创建边插入
  1. CREATE TABLE dept80
  2. AS
  3. SELECT  employee_id, last_name, salary*12 ANNSAL, hire_date
  4. FROM    employees
  5. WHERE   department_id = 80;
复制代码
查看表(show)
  1. SHOW CREATE TABLE 表名
复制代码
修改表内容(alter)
  1. ALTER TABLE 表名 ADD 字段名 字段类型 【FIRST|AFTER 字段名】;  #追加一个列
  2. ALTER TABLE 表名 MODIFY  字段名1 字段类型 【DEFAULT 默认值】【FIRST|AFTER 字段名2】;  #修改一个列
  3. ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;#重命名一个列
  4. ALTER TABLE 表名 DROP 字段名 #删除一个列
复制代码
重定名表(rename)
  1. RENAME TABLE 列名 TO 列名1;#方式一
  2. ALTER table 列名 RENAME 列名1;#方式二
复制代码
删除表(drop)
  1. DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];
复制代码
清空表(truncate,delete)
  1. TRUNCATE TABLE 表名;
  2. DELETE FROM table_name WHERE condition;
复制代码
束缚

束缚主要有五种,其中唯一束缚和外键束缚的删除通常必要通过查找并删除相应的束缚名,而主键束缚、自增束缚、默认值束缚可以通过对相应列的属性举行重置来实现。
唯一束缚(unique)

建表时
  1. create table 表名称(
  2.         字段名  数据类型,
  3.     字段名  数据类型  unique,  
  4.     字段名  数据类型  unique key,
  5.     字段名  数据类型
  6. );
  7. create table 表名称(
  8.         字段名  数据类型,
  9.     字段名  数据类型,  
  10.     字段名  数据类型,
  11.     [constraint 约束名] unique key(字段名)
  12. );
复制代码
建表后指定唯一键束缚
  1. #字段列表中如果是一个字段,表示该列的值唯一。如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的
  2. #方式1:
  3. alter table 表名称 add unique key(字段列表);
复制代码
  1. #方式2:
  2. alter table 表名称 modify 字段名 字段类型 unique;
复制代码
复合唯一束缚
  1. create table 表名称(
  2.         字段名  数据类型,
  3.     字段名  数据类型,  
  4.     字段名  数据类型,
  5.     unique key(字段列表) #字段列表中写的是多个字段名,多个字段名用逗号分隔,表示那么是复合唯一,即多个字段的组合是唯一的
  6. );
复制代码
删除唯一束缚
  1. SELECT * FROM information_schema.table_constraints WHERE table_name = '表名'; #查看都有哪些约束
复制代码
  1. ALTER TABLE USER
  2. DROP INDEX uk_name_pwd;
复制代码
外键束缚(Foreign key)

限定某个表的某个字段的引用完备性。
好比:员工表的员工所在部门的选择,必须在部门表能找到对应的部分。
(1)建表时
  1. create table 主表名称(
  2.         字段1  数据类型  primary key,
  3.     字段2  数据类型
  4. );
  5. create table 从表名称(
  6.         字段1  数据类型  primary key,
  7.     字段2  数据类型,
  8.     [CONSTRAINT <外键约束名称>] FOREIGN KEY(从表的某个字段) references 主表名(被参考字段)
  9. );
  10. -- FOREIGN KEY: 在表级指定子表中的列
  11. -- REFERENCES: 标示在父表中的列
复制代码
  1. create table dept( #主表
  2.         did int primary key,                #部门编号
  3.     dname varchar(50)                        #部门名称
  4. );
  5. create table emp(#从表
  6.         eid int primary key,  #员工编号
  7.     ename varchar(5),     #员工姓名
  8.     deptid int,                                #员工所在的部门
  9.     foreign key (deptid) references dept(did)   #在从表中指定外键约束
  10.     #emp表的deptid和和dept表的did的数据类型一致,意义都是表示部门的编号
  11. );
  12. 说明:
  13. (1)主表dept必须先创建成功,然后才能创建emp表,指定外键成功。
  14. (2)删除表时,先删除从表emp,再删除主表dept
复制代码
(2)建表后
一样平常情况下,表与表的关联都是提前设计好了的,因此,会在创建表的时候就把外键束缚定义好。不过,如果必要修改表的设计(好比添加新的字段,增加新的关联关系),但没有预先定义外键束缚,那么,就要用修改表的方式来增补定义。
格式:
  1. ALTER TABLE 从表名 ADD [CONSTRAINT 约束名] FOREIGN KEY (从表的字段) REFERENCES 主表名(被引用字段) [on update xx][on delete xx];
复制代码
举例:
  1. alter table emp add foreign key (deptid) references dept(did);
复制代码
删除
  1. SELECT * FROM information_schema.table_constraints WHERE table_name = 'emp';#先查找约束名
  2. alter table emp drop foreign key emp_ibfk_1;#再删除
复制代码
主键束缚(primary)

用来唯一标识表中的一行记录。相称于唯一束缚+非空束缚的组合,主键束缚列不允许重复,也不允许出现空值。
实现方法和上述unique类似,将关键词改为primary
  1. create table temp(
  2.         id int primary key,
  3.     name varchar(20)
  4. );
复制代码
删除主键束缚
  1. alter table 表名称 drop primary key;
复制代码
自增束缚(auto_increment)
  1. create table employee(
  2.         eid int primary key auto_increment,
  3.     ename varchar(20)
  4. );
复制代码
删除
  1. #alter table 表名称 modify 字段名 数据类型 auto_increment;#给这个字段增加自增约束
  2. alter table 表名称 modify 字段名 数据类型; #去掉auto_increment相当于删除
复制代码
默认值束缚(Default)

给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。
  1. create table 表名称(
  2.         字段名  数据类型  primary key,
  3.     字段名  数据类型  unique key not null,  
  4.     字段名  数据类型  unique key,
  5.     字段名  数据类型  not null default 默认值,
  6. );
  7. create table 表名称(
  8.         字段名  数据类型 default 默认值 ,
  9.     字段名  数据类型 not null default 默认值,  
  10.     字段名  数据类型 not null default 默认值,
  11.     primary key(字段名),
  12.     unique key(字段名)
  13. );
复制代码
删除
  1. alter table 表名称 modify 字段名 数据类型 ;#删除默认值约束,也不保留非空约束
  2. alter table 表名称 modify 字段名 数据类型  not null; #删除默认值约束,保留非空约束
复制代码
操纵数据

插入数据(insert)
  1. INSERT INTO 表名 VALUES (value1,value2,....);
  2. INSERT INTO 表名(column1 [, column2, …, columnn]) VALUES (value1 [,value2, …, valuen]);#指定字段
  3. INSERT INTO table_name
  4. VALUES
  5. (value1 [,value2, …, valuen]),
  6. (value1 [,value2, …, valuen]),
  7. ……
  8. (value1 [,value2, …, valuen]);#同时插入多条
复制代码
值列表中必要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。
插入查询效果:
  1. INSERT INTO 目标表名
  2. (tar_column1 [, tar_column2, …, tar_columnn])
  3. SELECT
  4. (src_column1 [, src_column2, …, src_columnn])
  5. FROM 源表名
  6. [WHERE condition]
复制代码
更新数据(update)
  1. UPDATE table_name
  2. SET column1=value1, column2=value2, … , column=valuen
  3. [WHERE condition]
复制代码
删除数据(delete)
  1. DELETE FROM table_name [WHERE <condition>];
复制代码
盘算列(Always as)
  1. CREATE TABLE tb1(
  2. id INT,
  3. a INT,
  4. b INT,
  5. c INT GENERATED ALWAYS AS (a + b) VIRTUAL
  6. );#创建时计算
  7. ALTER TABLE tb1 MODIFY c INT GENERATED ALWAYS AS (a + b) VIRTUAL;#修改时计算
复制代码
流程控制

IF: 条件语句
LOOP:一样平常用于实现简单的"死"循环
WHILE:先判定后执行
REPEAT:先执行后判定,无条件至少执行一次
LEAVE:用于跳出循环(break)
ITERATE: 用于返回开始处继续循环(continue)
游标: 遍历选出的列表,每次使用按顺序提供一行的值(迭代器)
触发器:由事件来触发某个操纵,这些事件包括INSERT、UPDATE、DELETE事件
IF
  1. IF 表达式1 THEN 操作1
  2. [ELSEIF 表达式2 THEN 操作2]……
  3. [ELSE 操作N]
  4. END IF
复制代码
Case
  1. CASE 表达式
  2. WHEN 值1 THEN 结果1或语句1(如果是语句,需要加分号)
  3. WHEN 值2 THEN 结果2或语句2(如果是语句,需要加分号)
  4. ...
  5. ELSE 结果n或语句n(如果是语句,需要加分号)
  6. END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)
复制代码
LOOP
  1. 加上THEN LEAVE的结构怎么表示
  2. [loop_label:] LOOP
  3. 循环执行的语句
  4. END LOOP [loop_label]
复制代码
WHILE
  1. [while_label:] WHILE 循环条件  DO
  2.         循环体
  3. END WHILE [while_label];
复制代码
REPEAT
  1. [repeat_label:] REPEAT
  2.     循环体的语句
  3. UNTIL 结束循环的条件表达式
  4. END REPEAT [repeat_label]
复制代码
LEAVE
  1. LEAVE 标记名
复制代码
实现跳出循环(break)
ITERATE
  1. ITERATE label
复制代码
游标
  1. DECLARE cursor_name CURSOR FOR select_statement; #声明游标
  2. OPEN cursor_name; #打开游标
  3. FETCH cursor_name INTO var_name [, var_name] ... #使用游标
  4. CLOSE cursor_name;
复制代码
触发器(Trigger)
  1. CREATE TRIGGER 触发器名称
  2. {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
  3. FOR EACH ROW
  4. 触发器执行的语句块;
复制代码
举例:
  1. DELIMITER //
  2. CREATE TRIGGER before_insert
  3. BEFORE INSERT ON test_trigger
  4. FOR EACH ROW
  5. BEGIN
  6.         INSERT INTO test_trigger_log (t_log)
  7.         VALUES('before_insert');
  8. END //
  9. DELIMITER ;
复制代码
查看/删除触发器
  1. SHOW TRIGGERS #查看当前数据库中全部触发器的定义
  2. SHOW CREATE TRIGGER 触发器名 #查看当前数据库中某个触发器的定义
  3. SELECT * FROM information_schema.TRIGGERS; #从系统库information_schema的TRIGGERS表中查询“salary_check_trigger”触发器的信息。
  4. DROP TRIGGER  IF EXISTS 触发器名称;#删除触发器
复制代码
视图

创建视图(Create)
  1. CREATE VIEW 视图名称
  2. AS 查询语句
复制代码
修改视图(Alter)

方式1:使用CREATE OR REPLACE VIEW 子句修改视图
  1. CREATE OR REPLACE VIEW empvu80
  2. (id_number, name, sal, department_id)
  3. AS
  4. SELECT  employee_id, first_name || ' ' || last_name, salary, department_id
  5. FROM employees
  6. WHERE department_id = 80;
复制代码
说明:CREATE VIEW 子句中各列的别名应和子查询中各列相对应。
方式2:ALTER VIEW
修改视图的语法是:
  1. ALTER VIEW 视图名称
  2. AS
  3. 查询语句
复制代码
删除视图(Drop)

变量、存储过程与函数

变量(@)

系统变量
  1. #查看所有全局变量
  2. SHOW GLOBAL VARIABLES;
  3. #查看所有会话变量
  4. SHOW SESSION VARIABLES;
  5. SHOW VARIABLES;
  6. #查看满足条件的部分系统变量。
  7. SHOW GLOBAL VARIABLES LIKE '%标识符%';
  8. #查看满足条件的部分会话变量
  9. SHOW SESSION VARIABLES LIKE '%标识符%';
  10. #查看指定的系统变量的值
  11. SELECT @@global.变量名;
  12. #查看指定的会话变量的值
  13. SELECT @@session.变量名;
  14. #或者
  15. SELECT @@变量名;
复制代码
举例:
  1. SHOW GLOBAL VARIABLES LIKE 'admin_%';
复制代码
有些时候,数据库管理员必要修改系统变量的默认值,以便修改当前会话或者MySQL服务实例的属性、特征。具体方法:
方式1:修改MySQL配置文件,继而修改MySQL系统变量的值(该方法必要重启MySQL服务)
方式2:在MySQL服务运行期间,使用“set”命令重新设置系统变量的值
  1. #为某个系统变量赋值
  2. #方式1:
  3. SET @@global.变量名=变量值;
  4. #方式2:
  5. SET GLOBAL 变量名=变量值;
  6. 为某个会话变量赋值
  7. #方式1:
  8. SET @@session.变量名=变量值;
  9. #方式2:
  10. SET SESSION 变量名=变量值;
复制代码
用户变量
  1. #方式1:“=”或“:=”
  2. SET @用户变量 = 值;
  3. SET @用户变量 := 值;
  4. #方式2:“:=” 或 INTO关键字
  5. SELECT @用户变量 := 表达式 [FROM 等子句];
  6. SELECT 表达式 INTO @用户变量  [FROM 等子句];
  7. SELECT @用户变量#查看用户变量的值 (查看、比较、运算等)
复制代码
局部变量
定义:可以使用DECLARE语句定义一个局部变量
作用域:仅仅在定义它的 BEGIN ... END 中有效
位置:只能放在 BEGIN ... END 中,而且只能放在第一句
  1. BEGIN
  2.         #声明局部变量
  3.         DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值];
  4.         DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值];
  5.         #为局部变量赋值
  6.         SET 变量名1 = 值;
  7.         SELECT 值 INTO 变量名2 [FROM 子句];
  8.         #查看局部变量的值
  9.         SELECT 变量1,变量2,变量3;
  10. END
复制代码
存储过程(Procedure)

关键字调用语法返回值应用场景存储过程PROCEDURECALL 存储过程()理解为有0个或多个一样平常用于更新存储函数FUNCTIONSELECT 函数()只能是一个一样平常用于查询效果为一个值并返回时此外,存储函数可以放在查询语句中使用,存储过程不行。反之,存储过程的功能更增强大,包括能够执行对表的操纵(好比创建表,删除表等)和事务操纵,这些功能是存储函数不具备的。
语法:
  1. DELIMITER $  #为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符。
  2. CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名  参数类型,...)
  3. [characteristics ...]
  4. BEGIN
  5.         sql语句1;
  6.         sql语句2;
  7. END $
复制代码
类似于Java中的方法:
  1. 修饰符 返回类型 方法名(参数类型 参数名,...){
  2.         方法体;
  3. }
复制代码
束缚条件
characteristics 表示创建存储过程时指定的对存储过程的束缚条件,其取值信息如下:
  1. LANGUAGE SQL
  2. | [NOT] DETERMINISTIC
  3. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  4. | SQL SECURITY { DEFINER | INVOKER }
  5. | COMMENT 'string'
复制代码
调用
存储过程有多种调用方法。存储过程必须使用CALL语句调用,并且存储过程和数据库干系,如果要执行其他数据库中的存储过程,必要指定数据库名称,例如CALL dbname.procname。
  1. CALL 存储过程名(实参列表)
复制代码
1、调用in模式的参数:
  1. CALL sp1('值');
复制代码
2、调用out模式的参数:
  1. SET @name;
  2. CALL sp1(@name);
  3. SELECT @name;
复制代码
3、调用inout模式的参数:
  1. SET @name=值;
  2. CALL sp1(@name);
  3. SELECT @name;
复制代码
存储函数(Function)

语法格式:
  1. CREATE FUNCTION 函数名(参数名 参数类型,...)
  2. RETURNS 返回值类型
  3. [characteristics ...]
  4. BEGIN
  5.         函数体   #函数体中肯定有 RETURN 语句
  6. END
复制代码
调用:
  1. SET @dept_id = 50;
  2. SELECT count_by_id(@dept_id);
复制代码
处理程序(Condition,handler)

定义条件是事先定义程序执行过程中可能遇到的题目,处理程序定义了在遇到题目时应当采取的处理方式,并且保证存储过程或函数在遇到告诫或错误时能继续执行。这样可以增强存储程序处理题目标本领,克制程序异常制止运行。
定义条件使用DECLARE语句,语法格式如下:
  1. DECLARE 错误名称 CONDITION FOR 错误码(或错误条件)
复制代码
可以为SQL执行过程中发生的某种类型的错误定义特殊的处理程序。定义处理程序时,使用DECLARE语句的语法如下:
  1. DECLARE 处理方式 HANDLER FOR 错误类型 处理语句
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4