MYSQL入门语法全解
什么是库?库事用来存放N张表的。
什么是表?表类似于Excel,可以用来存放数据。
什么是字段?类似于Excel中的表头。
数据类型:字符串(varchar)
整数(tinyint 、int、bigint)
小数(float)
日期(date、datetime )
什么是数据?文本、视频、图像、音频等
创建数据库:
CREATE DATABASE 库名;
注:创建库时指定编码
CREATE DATABASE 库名 character set 编码名
删除指定数据库:
DROP DATABASE 库名;
创建表:
CREATE TABLE 表名(先写变量名,再写数据类型)
因为先创建database再创建table,所以选中某一个数据库:USE 库名;
现在来一个例子:
CREATE TABLE python成绩(
(字段1)姓名 varchar(20);
(字段2)班级 varchar(20);
(字段3)Python成绩 bigint(20);
)
删除指定表:
DROP TABLE 表名;
数据库的核心 增、删、改、查
在指定表中添加数据
方法一:
INSET INTO 表名 (字段1、字段2····)
VALUSES(值1、值2·····)
方法二:
INSET INTO 表名 SET 字段名1=字段值1·····
删除数据
DELETE FROM 表名 WHERE 条件
eg:DELETE FROM 成绩表 WHERE 姓名=‘李四’
在MySQL中常用运算符:(= > >= < <= !=)需放在where之后
查询数据
SELECT 字段1,字段2、、、、FROM 表名 WHERE 条件
查看全部字段:SELECT *FROM 表名
eg:SELECT 姓名 FROM python成绩表 WHERE 成绩>=70;
注:查询时,可通过AS给某一字段取别名其中AS也可省略
eg:SELECT 姓名 AS 名字 FROM python成绩表 WHERE 成绩>=70;
eg:SELECT 姓名 名字 FROM python成绩表 WHERE 成绩>=70;
MYSQL中常见的逻辑运算符:与and、或or、非not
eg:SELECT 姓名 名字 FROM python成绩表 WHERE 成绩>=70 AND 班级=“1班”;
修改语法:
UPDATE 表名 SET 字段名=值······ WHERE=条件;
DDL/DQL/DML三者的区别:
数据库的查询语言: (DQL ,DATABASE QUERY LANGUAGE)
SELECT
数据库的定义语言:(DDL ,DATABASE DEFINED LANGUAGE)
CREATE DATABASE ;DROP DATABASE
数据库的操作语言:(DML ,DATABASE MANGELANGUAGE)
UPDATE INSERT DELETE
注:修改指定库的编码
ALTER DATABASE 库名 CHARACTER SET 新编码
查询表结构:DESC 表名
打印某张表的创建信息:SHOW TABLE 表名
修改表:
(1)对已经存在的表进行重命名
RENAME TABLE 旧表名 TO 新表名
(2)往已经存在的表中添加字段信息
ALTER TABLE 表名 ADD 字段名 数据类型
(3)删除某张表中的字段信息
ALTER TABLE 表名 DROP 被删除的字段
(4)对表中的字段进行重命名
ALTER TABLE 表名 CHANGE 旧字段 新字段
(5)修改字段类型的长度
ALTER TABLE 表名 CHANGE 字段名、字段名长度
还原备份文件的数据:
方法一:先进入MySQL环境 →创建一个库→在此库下还原数据
方法二:通过sqlyog 图形化工具:
选中需要备份的数据库→右键→备份/导出→转储到sql
MYSQL中常见的数据类型:
varchar 、 float、 int 、bigint 、date、test
默认值:DEFAULT '默认值'
非空:NOT NULL (此字段为必须填写)
自动增长:AUTO_INCREMENT (尽量作用在int)
主键:PRIMARY KEY (不能够重复使用,一张表只有一个字段可用)
唯一键:UNIQUE (被其修饰的数据不可重复)
注:(1)以上数据类型都放在字段的后面;
(2)DELETE可以删除整张表,但是删除数据后自增列不会从1开始 ,使用TRUNCATE删除数据后,如果字段是自增的, 则重新从1开始,这里推荐使用TRUNCATE来删除数据
(3)习惯上自动增长放在主键之前,两者配合使用
排序问题(order by)
降序:SELECT*FROM 表名 ORDER BY 字段 DESC
升序:SELECT*FROM 表名 ORDER BY 字段 ASC
注:排序时字段类型可以是数值类型(int float),也可以是varchar 类型,但其对应的字段存放的是中文,则不能排序,是英文则可以。
聚合函数:
在MYSQL中函数使用 SELECT调用:
SELECT 函数名 字段 FROM 表名
最大值函数: MAX(字段)
最小值函数:MIN(字段)
求平均数函数:AVG(字段)
求和:SUM(字段)
统计记录:COUNT(字段)
注:如果字段的值为NULL,则不能统计在内,为解决上述问题,在统计某一张表中的所有数据时,最好使用COUNT(*)。
常用函数:
第一类时间函数:
(1)NOW( ):获取当前时间,包括年月日时分秒
SELECT NOW( ) AS 当前时间;
(2)CURTIME( ):只获取时分秒
SELECT CURTIME ( ) AS 当前时间;
(3)CURDATE( ):只获取年月日
CURD SELECT CURDATE( ) AS 当前时间;
数学函数:
向上取舍:
SELECT CEIL (2.3); →→结果为3
向下取舍:
SELECT FLOOR (2.3); →→结果为2
随机数 RAND( ):
不用接受参数返回的是0-1之间的小数
SELECT RAND( );
获取一个随机的4位数字,没有小数
SELECT RAND ( )*1000
查询:
同时查询多条记录:IN (数据1,数据2·····)
eg:获取id=1 2 4 的相关数据
SELECT *FROM 表名 WHERE id IN (1,2,4)
分组查询:GROUP BY 分类字段
eg:查询goods表中商品的种类
SELECT goodcategory FROM 表名 GROUP BY goodcategory
注:查询goods表中是否有种类为衣服的类型,如果查询语句中使用了GROUP BY则后面的条件需要使用HAVING关键字
eg:SELECT goodcategory FROM 表名 GROUP BY goodcategory HAVING goodcategor="数码"
分页:LIMIT 起始下标每页显示的数据量
eg:goods表中有7条记录每页显示3条总共3页
第一页数据:SELECT *FROM goods LIMIT 0,3;
第二页数据:SELECT *FROM goods LIMIT 3,3;
第三页数据:SELECT *FROM goods LIMIT 6,3;
总结:SELECT *FROM goods LIMIT (pageNO-1)*pagesize,pagesize
复制某一张指定的表以及表的数据:
CREATE TABLE 表名
SELECT *FROM 复制的表名
时间的格式函数:DATETIME
DATE FORMAT(%Y年%m月%d日%H:%i:%s
子查询:同时查询多张表
SELECT*FROM 表1,表2,······表n WHERE 条件
多表查询:☆☆☆
这俩假设有两张表一张是部门表(dept),一张是员工表(empty)
(1)查询部门下所有的员工
SELECT 字段1,字段n······FROM 表1,表2,表n·····WHERE 条件
eg:SELECT d.deptname, p.empname FROM dept.d, emp.p WHERE d.id=p.deptID
(2)查询部门编号=1的部门下的所有员工
eg:SELECT*FROM emp WHERE deptID=1
(3)找出开发部中所有的员工名,薪水,部门名
eg:SELECT d.deptname,e.empname,e.salary FROM dept d,emp e WHERE d,id=d.deptID AND d,deptname="开发部"
(4)找出开发部和测试部所有员工名、薪水、部门名
第一种方法
SELECT·····同(3) AND d,deptname in ('开发部','测试部')
第二种方法
SELECT·····同(3) AND (d.deptanme='开发部',OR d.deptname='测试部')
第三种方法(UNION)
SELECT d.deptname,e.empname ,e.salary FROM dept d,empe e WHERE d.id=e.demptID AND d.deptname=开发部"
UNION
SELECT d.deptname,e.empname ,e.salary FROM dept d,empe e WHERE d.id=e.demptID AND d.deptname='测试部’
UNION UNION ALL:可以将两个查询语句的结果进行合并,合并的前提是两个查询语句的数据结构一样
UNION:可以自动去重
UNION ALL: 不可以自动去重
多表查询语法:
语法1:SELECT*FROM 表1,表2·······WHERE 条件
语法2:通过连接关键词
内连接 左外连接
外连接 右外连接
内连接: 表1 INNER JOIN 表2 ON 条件
eg:查询所有部门中的所有员工
SELECT *FROM dept d INNER JOIN emp e ON d.id=e.deptid
外连接:外连接分为左外连接和右外连接
左外连接:LEFT JOIN 左外连接当条件不满足时以左边的表1为准
右外连接:RIGHT JOIN
模糊查询:%为占位符,LIKE
eg:SELECT *FROM book WHERE B-name LIKE '%王'
(查询以王结尾的名字,反之“王%为查询以王开头的名字”)
视图:在真实表上面构建一个虚表
创建语法:CREATE VIEW 视图名 AS 查询语句
删除语法:DROP VIEW 视图名
查询:SELECT *FROM 视图名 WHERE 条件
删除某条数据:DELETE
添加数据:INSERT INTO 视图名·······
修改数据:UPDATE 视图名 SET
视图的应用场景:金融行业、保险、财务等行业
数据库建模:powerDesigner 软件
file → new model→ physicaldate model
事务:多组操作要么全部成功要么全部失败(银行转账)
四大特性:
原子性:同一个事务中,多组操作不能分割必须是一个整体
一致性:事务操作前与操作后总量保持一致
隔离性:多个事务之间互不干扰
持久性:数据一旦进入到库/表中就永久存在
开启事务:START TRANSACTION
回滚事务:如果事务提交后不能够成功(失败后用ROLLBACK即可重新开启事务)
提交事务:COMMITED
在这四个性质中,隔离性有四种级别(分别由低到高)
read uncommited read comminted repeatable serializable
查看MySQL中的事务隔离级别:
SELECT @@tx-ISOLATION
修改MySQL默认的隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别
不同的隔离级别会引发不同的问题:
(1).当MySQL事务的级别为read uncommited时会引发脏读:一个事务可以读取另一个事务未提交的数据
如何解决脏读问题?
可以将是数据库的隔离级别改为read comminted
(2)..当MySQL事务的级别为read comminted时会出现不可重复读:在同一个事务中多次读取结果不一致
如何不可重复读解决?
将事务的隔离性改为 repeatable
(3).当MySQL事务的级别为 repeatable 时会出现虚读(幻读)
存储过程:SQL语句的一组集合
语法:
CREATE PROCEDURE 存储过程名 (参数名1 参数类型1,参数名2 参数类型2,参数名n 参数类型n······)
BEGIN
代码块;
END
eg:书写一个加薪的过程
DELIMITER//
CREATE PROCEDURE AddSalary (money float,id.d BIGINT)
BEGIN
UPDATE emp SET salary=salary+money
WHERE id=idd;
END//
DELIMITER;
调用存储过程: CALL (存储过程名)
删除存储过程:DROP PROCEDURE 存储过程名
带返回值的存储过程:
DELIMITER//
CREATE PROCEDURE 存储过程名 (IN参数名1 参数类型1,IN参数名2 参数类型2,IN参数名n 参数类型n······,OUT 参数 参数类型)
BEGIN
代码块;
END
DELIMITER;
调用存储过程: CALL (存储过程名)
查询:SELECT @ result
MySQL数据库高级部分之存储过程
创建存储过程的基本语法规则:
DELIMITER//
CREATE PROCEDURE 存储过程名 (IN参数名1 参数类型1,IN参数名2 参数类型2,IN参数名n 参数类型n······,OUT 参数 参数类型)
BEGIN
代码块;
END
DELIMITER;
删除数据过程:
DROP PROCEDURE (IF EXISTS ) 存储过称
调用数据过程:
CALL 存储过程名 ( 参数1,······参数n);
带if的存储过程:
eg:加薪的过程,传递两个参数 id ,m
DELIMITER//
CREATE PROCEDURE AddSalary (idd BIGINT , m FLOAT)
BEGIN
IF m>0 THEN
UPDATE users SET money=money+ m
WHERE id=idd;
END IF;
END//
DELIMITER;
带if ····else 的存储过程
DELIMITER//
CREATE PROCEDURE AddSalary (idd BIGINT , m FLOAT)
BEGIN
IF m>0 THEN
UPDATE users SET money=money+ m
WHERE id=idd;
END IF;
END//
DELIMITER;
带 if else if 语句的存储过程
DELIMITER//
CREATE PROCEDURE BuyCar (money FLOAT)
BEGIN
IF money>500 THEN
SELECT "买保时捷" AS "买啥";
ELSEIF money>300 THEN
SELECT "买宝马" AS "买啥";
ELSE IF money>100 THEN
SELECT "买奥迪" AS "买啥";
ELSE money>500 THEN
SELECT "买保时捷" AS "买啥";
END IF;
END//
DELIMITER;
查询结果:CALL BuyCar (500)
CASE 语句:
DELIMITER//
CREATE PROCEDURE Pro_case(i,int)
BEGIN
CASE i
WHERE I THEN
SELECT"星期一" AS "日期";
WHERE 2 THEN
SELECT"星期二" AS "日期";
ELSE
SELECT "今天是周几?" AS "日期";
ENDCASE;
END//
DELIMITER;
查询结果:CALL Procase(3);
WHILE 循环:
eg:如果i=100,则往users表中插入100条数据
DELIMITER//
CREATE PROCEDURE pro_while(IN I int);
BEGIN
DECLARE a INT DEFAULT 1;
WHILE a<=i DO
INSERT INTO "users" SET username="test" ,momey=100;
SET a=a+1;
ENDWHILE;
END//
DELIMITER;
调用:
CALL Pro_while(1);
查:
SELECT COUNT(*) FROM users;
删:
TRUNCATE TSBLE users;
eg:如果 i=100,则计算1-100的和,并返回结果
DELIMITER//
CREATE PROCEDURE pro_while(IN i INT ,OUT total INT )
BEGIN
DECLARE a INT DEFAULT 1;
SET total =0;
WHILE a <=i DO
SET total=total+a;
ENDWHILE;
END//
DELIMITER;
CALL "pro_while (100,@aaa);
SELECT @aaa;
LOOP循环:
语法:
CREATE PROCEDURE 存储过程名()
BEGIN
LOOP循环别名:LOOP
循环体;
LEAVE LOOP 循环别名
ENDLOOP;
END;
eg:通过loop循环往users表中添加100条记录,当数据添加到21条时终止循环
DELIMITER//
CREATE PROCEDURE pro_loop( )
BEGIN
DECLARE i INT DEFAULT 0;
LOOP_TEST:LOOP
INSERT INTO "users" SET username=”admin” money=200;
SET i=i+1;
IF i =100 THEN
LEAVE LOOP_TEST;
ENDLOOP;
END//
DELIMITER;
CALL "pro_loop"( );
大结局