mysql

第一次总结(初步了解适合新手)

update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; -- 修改用户密码flush privileges;  -- 刷新权限-- 所有语句都是用  ;  结尾
select version() cuse 数据库   -- 切换数据库
show tables; -- 查看数据库中所有的表
desribe 表名; -- 显示数据库中所有表的信息SELECT user FROM mysql.user  -- c

数据库 CRUD 增删改查

DDL 定义

DML 操作

DQL 查询

DCL 控制

操作数据库

创建数据库

EXISTS 存在

CREATE DATABASE IF NOT EXISTS WESTOS;

删除数据库

DROP DATABASE [IF EXISTS] WESTOS;

USE DATABASE;

SHOW DATABASE;

数据的列类型

数值

  • tinyint 1

  • smallint 2

  • mediumint 3

  • int 4

  • bigint 8

  • float 4

  • double 8

  • decimal 金融计算

字符串

char 字符串固定大小 0~255

varchar 可变字符串 0~65535

tinytest 微型文本 2^8-1

text 文本串 2^16-1

文本日期

年year
月month
日day
时hour
分branch
秒second

data YYYY-MM-DD 日期格式

time HH: mm: ss 时间格式

datatime YYYY-MM-DD-HH:mm:ss

timestamp 时间戳 19701.1 到现在的时间

null

数据库的字段属性

Unsigned [ʌnˈsaɪnd] 未签名

  • 无符号的整数
  • 声明了该列不能声明为负数

zerofill

  • 0填充的
  • 不足的位数,使用0填充 int(3) -> 5 -> 005

自增 Self increasing

  • 通常用来设计唯一主键 index 必须是整数

    • AUTO_INCREMENT 自增
    • PRIMARY KEY 主键

非空 NULL not null

  • NULL

默认

  • 设置默认的值
  • sex

ENGINE=INNODB DEFAULT CHARSET=UTF8;

引擎 = innodb

EXISTS 存在

COMMENT 备注

PRIMARY KEY 主键

AUTO_INCREMENT 自增

CHARSET 字符集

操作表

    CREATE TABLE `school` (`ID` int NOT NULL AUTO_INCREMENT COMMENT '学号',`NAME` varchar(39) NOT NULL DEFAULT '匿名' COMMENT '名字',`PWD` varchar(29) NOT NULL DEFAULT '123456' COMMENT '密码',`AGE` varchar(2) NOT NULL DEFAULT '女' COMMENT '性别',`BIRTHDAY` datetime NOT NULL COMMENT '生日',`ADDRESS` varchar(100) NOT NULL COMMENT '住址',`EMAIL` char(1) NOT NULL COMMENT '邮箱',PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE [IF NOT EXISTI] ·表名·(`字段名` 列类型 [属性] [索引] [注释],)[表类型] [字符集设置][注释]

修改删除表

修改

SHOW CREATE DATABLES 查看建数据库语句SHOW CREATE TABLE 表名  查看建表语句DESC 表名   显示表结构-- MODIFY 修改字段约束
-- CHANGE 字段重命名ALTER TABLE 表名 MODIFY 列名 类型;
ALTER TABLE school MODIFY NAME VARCHAR(15);ALTER TABLE 表名 CHANGE 列字 新名字 类型;
ALTER TABLE SCHOOL CHANGE NAME1 NAME VARCHAR(10);-- 删除表的字段: ALTER TABLE 表名 DROP 字段名
ALTER TABLE SCHOOL DROP NAME;-- 增加字段
alter table stu add address varchar(50);

删除

-- 删除表
DROP TABLE [IF EXISTS] 表名
DROP TABLE IF EXISTS  SCHOOL

DML操作数据

  • INSERT 添加
  • UPDATE 修改
  • DELETE 删除

添加

-- 插入语句
-- INSERT INTO 表名([字段名1,字段名2,字段3]) VALUES ('值1'),('值2')INSERT INTO `STUDENT`(`NAME`) VALUE('李四'); INSERT INTO `student`(`NAME`,`PWD`,`SEX`) VALUES ('店小二','1234','20')

修改

-- update 修改谁  (条件) set原来的值=新值
UPDATE `STUDENT` SET `NAME`='法外狂徒' WHERE id=1;
-- 不指定条件的情况下,会改动所有表
UPDATE `STUDENT` SET `NAME`='张三';

删除

-- DELETE
DELETE FROM `STUDENT` WHERE ID=1;

DQL查询数据

查询操作都用 SELEXT /选择

-- SELECT 字段 FROM 表
-- 查询全部
SELECT * FROM STUDENT
-- 查询指定字段
SELECT `NAME` FROM STUDENT
-- 别名
SELECT `NAME` AS 名字, `SEX` AS 性别 FROM STUDENT AS S
-- 函数
SELECT CONCAT('姓名:',NAME) AS 新名字 FROM STUDENT
-- 去重
SELECT DISTINCT `NAME` FROM  STUDENT

安全模式

在mysql中,如果在update和delete没有加上where条件,数据将会全部修改。

SET SQL_SAFE_UPDATES = 1;
SET SQL_SAFE_UPDATES = 0;

WHERE

检索数据中符合条件的值

搜索条件由一个或者多个表达式组成!结果布尔值

逻辑运算符

运算符 描述
and && 逻辑与
or || 逻辑或
NOT ! 逻辑非

尽量使用英文字母

-- 查询考试成绩在95~100分之间
SELECT ACHIEVEMENT FROM STUDENT WHERE ACHIEVEMENT >=95 AND ACHIEVEMENT <=100;SELECT 列名 FROM 表名 WHERE 列名 >=95 AND 列名 <= 100;-- 模糊查询
SELECT ID,PWD FROM STUDENT WHERE PWD BETWEEN 95 AND 100

模糊查询 比较运算符

运算符
IS NULL A IS NULL
IS NOT NULL A IS NOT NULL
BETWEEN BETWEEN B AND C 在A和B之间,结果为真
LIKE A LIKE B 如果A 匹配 B,结果为真
IN A IN (A1, A2, A3) A 在 A1,A2,A3 之间,结果为真
SELECT `ID` FROM STUDENT WHERE `ADDRESS` IN ('安徽'。’河南);

七种表jion

1、左连接
select * from a left join b on a.id = b.id
2、右连接
select * from a right join b on a.id = b.id
3、左连接之后去除共有部分
select * from a left join b on a.id = b.id where b.id is null
4、内连接
select * from a inner join b on a.id = b.id
5、右连接之后去除共有部分
select * from a right join b on a.id = b.id where a.id is null
6、全连接
select * from a left join b on a.id = b.id union select * from a right join b on a.id = b.id
由于mysql不支持全连接写法,所以使用上面的sql语句替代下面的全连接sql语句:
select * from a FULL OUTER JOIN b on a.id = b.id(mysql不支持)
7、全连接之后去除共有部分
select * from a left join b on a.id = b.id where b.id is null union select * from a right join b on a.id = b.id where a.id is null
由于mysql不支持全连接写法,所以使用上面的sql语句替代下面的全连接sql语句:
select * from a FULL OUTER JOIN b on a.id = b.id where a.id is null or b.id is null(mysql不支持)

约束

约束条件 说明
PRIMARY KEY 主键约束用于唯一标识对应的记录 字段名 数据类型 primary key;
id int primary key,
FOREIGN KEY 外键约束 – 在创建数据表时语法如下:
CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)
– 将创建数据表创号后语法如下:
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)
NOT NULL 非空约束 字段名 数据类型 NOT NULL;
UNIQUE 唯一性约束 字段名 数据类型 UNIQUE;
DEFAULT 默认值约束,用于设置字段的默认值 字段名 数据类型 DEFAULT 默认值;

删除外键

alter table 从表名 drop foreign key 外键名;

关于外键约束需要注意的细节

1、从表里的外键通常为主表的主键
2、从表里外键的数据类型必须与主表中主键的数据类型一致
3、主表发生变化时应注意主表与从表的数据一致性问题

连表查询

1、Union

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。
当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
注意:使用UNION时,两张表查询的结果有相同数量的列、列类型相似。

Paste_Image.png

1)基本UNION查询,查询学校教师、学生的总的信息表,包括ID和姓名

SELECT ID,Name FROM Students
UNION
SELECT ID,Name FROM Teachers

2)带条件的UNION查询,也可以查询同一张表,查询年龄为18,23岁的学生信息

SELECT ID,Name FROM Student WHERE Age=18
UNION
SELECT ID,Name FROM Student WHERE Age=23

当然,这可以使用IN或者OR很容易实现,这里只是点到,以后遇到复杂查询,相信你会用到。
3)查询教师学生全部姓名
因为UNION只会选择不同的值,如果学生中和教师中有重名的情况,这就需要UNION ALL

SELECT Name FROM Students
UNION ALL
SELECT Name FROM Teachers

2、INNER JOIN(内连接)

INNER JOIN(内连接),也成为自然连接
作用:根据两个或多个表中的列之间的关系,从这些表中查询数据。
注意: 内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
重点:内连接,只查匹配行。
语法:(INNER可省略)

SELECT fieldlist FROM table1 [INNER] join table2 ON table1.column=table2.column

Paste_Image.png

实例:查询学生信息,包括ID,姓名、专业名称

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students INNER JOIN MajorsON Students.MajorID = Majors.ID

结果:

Paste_Image.png

根据结果可以清晰看到,确实只有匹配的行。学生Lucy的信息丢失了。

但是,inner join也会产生重复数据。如果将Majors表的主键约束去掉,可以插入重复的ID,如:

DELETE FROM Majors
INSERT INTO Majors(ID,Name) VALUES(10,'English')
INSERT INTO Majors(ID,Name) VALUES(10,'Computer')

继续执行上面的关联语句,结果为:

Paste_Image.png

RIGHT JOIN 结果与INNER JOIN一样。
后续我们会深入研究JOIN的具体原理。

3、外连接

与内连接相比,即使没有匹配行,也会返回一个表的全集。
外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULL OUTER JOIN。通常我们省略outer 这个关键字。写成:LEFT/RIGHT/FULL JOIN。
重点:至少有一方保留全集,没有匹配行用NULL代替。
1)LEFT OUTER JOIN,简称LEFT JOIN,左外连接(左连接)
结果集保留左表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入NULL值。
依然沿用内链接的例子
(1)使用左连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN MajorsON Students.MajorID = Majors.ID

Paste_Image.png

** 结论:**
通过结果,我们可以看到左连接包含了第一张表的所有信息,在第二张表中如果没有匹配项,则用NULL代替。

2)RIGHT JOIN(right outer join)右外连接(右连接)
右外连接保留了第二个表的所有行,但只包含第一个表与第二个表匹配的行。第一个表相应空行被入NULL值。
右连接与左连接思想类似。只是第二张保留全集,如果第一张表中没有匹配项,用NULL代替
依然沿用内链接的例子,只是改为右连接
(1)使用右连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students RIGHT JOIN MajorsON Students.MajorID = Majors.ID

Paste_Image.png

通过结果可以看到,包含了第二张表Majors的全集,Computer在Students表中没有匹配项,就用NULL代替。
3)FULL JOIN (FULL OUTER JOIN,全外连接)
全外连接,简称:全连接。会把两个表所有的行都显示在结果表中
1)使用全连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。

SELECT Students.ID,Students.Name,Majors.Name AS MajorNameFROM Students FULL JOIN MajorsON Students.MajorID = Majors.ID

Paste_Image.png

包含了两张表的所有记录,没有记录丢失,没有匹配的行用NULL代替。

4、CROSS JOIN(交叉连接)

交叉连接。交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。
简单查询两张表组合,这是求笛卡儿积,效率最低。
笛卡儿积:笛卡尔乘积,也叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。
1)交叉连接查询学生的信息,其中包括学生ID,学生姓名和专业名称。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors

Paste_Image.png

2)查询多表,其实也是笛卡儿积,与CROSS JOIN等价,以下查询同上述结果一样。
这个可能很常见,但是大家一定要注意了,这样就查询了两张表中所有组合的全集。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students,Majors

3)加了查询条件
注意:在使用CROSS JOIN关键字交叉连接表时,因为生成的是两个表的笛卡尔积,因而不能使用ON关键字,只能在WHERE子句中定义搜索条件。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
WHERE Students.MajorID = Majors.ID

Paste_Image.png

查询结果与INNER JOIN一样,但是其效率就慢很多了。

5.全部示例脚本

CREATE DATABASE TestDBUSE TestDB------------------------------------------
--创建相关表
IF OBJECT_ID('Students','U') IS NOT NULL
DROP TABLE Students
--学生信息表
CREATE TABLE Students(
ID int primary key not null,
Name nvarchar(50),
Age int,
City nvarchar(50),
MajorID int
)--专业信息表
IF OBJECT_ID('Majors','U') IS NOT NULL
DROP TABLE MajorsCREATE TABLE Majors(
ID int primary key not null,
Name nvarchar(50)
)--教师信息表
IF OBJECT_ID('Teachers','U') IS NOT NULL
DROP TABLE Teachers
CREATE TABLE Teachers(ID int primary key not null,Name nvarchar(20) not null
)--预置数据
DELETE FROM Students
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)DELETE FROM Majors
INSERT INTO Majors(ID,Name) VALUES(10,'English')
INSERT INTO Majors(ID,Name) VALUES(12,'Computer')DELETE FROM Teachers
INSERT INTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
INSERT INTO Teachers(ID,Name) VALUES(102,'Lucy')SELECT ID,Name FROM Students
UNION
SELECT ID,Name FROM TeachersSELECT ID,Name FROM Students
UNION ALL
SELECT ID,Name FROM Teachers--内连接
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students INNER JOIN Majors
ON Students.MajorID = Majors.ID--左连接
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN Majors
ON Students.MajorID = Majors.ID--右连接
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN Majors
ON Students.MajorID = Majors.ID--全连接
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students FULL JOIN Majors
ON Students.MajorID = Majors.ID--交叉连接
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors--交叉连接
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
WHERE Students.MajorID = Majors.ID--一次查询多表
SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students,Majors

事务

-- MySQL 总是默认开启事务自动提交
SET AUTOCOMMIT = 0  -- 开启
SET AUTOCOMMIT = 1  -- 关闭-- 手动处理事务
SET AUTOCOMMINT = 0 -- 开启-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这个之后的SQL 都在同一个事务INSERT XX
INSERT XX-- 提交:持久化
COMMIT
-- 回滚:回到原来的样子(失败)
ROLLBACK
-- 事务结束
SET AUTOCOMMIT = -1 -- 开启自动提交
-- 保存
SAVEPOINT -- 保存点名 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点

JDBC

package jdbc.test1;import java.sql.*;// 第一个 JDBC 程序
public class JdbcFirstDemo01 {public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1.加载驱动Class.forName("com.mysql.jdbc.Driver");  // 固定写法// 2.用户信息和 URLString url = "jdbc:mysql://localhost:3306/db_users?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT";String username = "root";String password = "123456";// 3.连接成功,数据库对象  代表数据库Connection connection = DriverManager.getConnection(url, username, password);// 4.执行 SQL 的对象  createStatement Statement statement = connection.createStatement();// 5.执行 SQL 的对象去执行 SQL,可能存在结果,查看返回结果String str = "SELECT * FROM STUDENT;";ResultSet resultSet = statement.executeQuery(str);while (resultSet.next()) {System.out.println("id=" + resultSet.getObject("ID"));System.out.println("NAME=" + resultSet.getObject("NAME"));System.out.println("pwd=" + resultSet.getObject("pwd"));System.out.println("SEX=" + resultSet.getObject("SEX"));System.out.println("BIRTHDAY=" + resultSet.getObject("BIRTHDAY"));System.out.println("ADRESS=" + resultSet.getObject("ADRESS"));System.out.println("EMAIL=" + resultSet.getObject("EMAIL"));}// 6.释放连接resultSet.close();statement.close();connection.close();}
}
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_users?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
username = root
password=123456

1.注册驱动

2.连接数据库 DriverManager

3.获得执行sql 的对象 Statement

4.获取但会对象集

5.释放连接

DriverManager

Connection connection = DriverManager.getConnection(url, username, password);
// connection  代表数据库
// 设置数据库自动提交
// 提交事务
// 数据回滚connection.rollback();connection.commit();connection.setAutoCommit();

Statement

Statement statement = connection.createStatement();statement.executeQuery();   // 查询操作返回 ResultSetstatement.execute();       // 执行控制 SQLstatement.executeUpdate(); // 更新,插入,删除 ,返回一个受影响的行数statement.executeBatch();   多个 SQL

ResultSet

获取指定数据类型

resultSet.getArray();
resultSet.getObject();
resultSet.getBoolean();
resultSet.getInt();
resultSet.getDate();

遍历,指针

resultSet.next()  // 指针 遍历resultSet.beforeFirst();  // 移动到最后面
resultSet.afterLast();    // 移动到最前面
resultSet.next();       // 移动到下一个数据
resultSet.previous();   // 移动到前一行
resultSet.absolute();  // 移动到指定行

URL 协议 ;//主机地址:端口号/数据库?参数1&参数2

连接池

DBCP

c3p0

pool

druild

我的分类:

一、对数据库操作(database)

二、对表操作(table)

三、对数据操作

一、对数据库操作(database)

CREATE 增

CREATE 增CREATE DATABASE 库名

DROP 删

DROP 删DROP DATABASE 库名

SHOW 查看

SHOW 查看SHOW DATABASES SHOW CREATE DATABLES 查看建数据库语句
USE 定位/使用/切换USE DATABASE 库名

二、对表操作(table)

增CREATE

CREATECREATE TABLES 表名

删DROP

DROPDROP TABLES 表名-- 删除表DROP TABLE [IF EXISTS] 表名DROP TABLE IF EXISTS  SCHOOL

改ALTER

ALTER-- MODIFY 修改字段约束-- CHANGE 字段重命名ALTER TABLE 表名 MODIFY 列名 类型;ALTER TABLE school MODIFY NAME VARCHAR(15);ALTER TABLE 表名 CHANGE 列字 新名字 类型;ALTER TABLE SCHOOL CHANGE NAME1 NAME VARCHAR(10);-- 删除表的字段: ALTER TABLE 表名 DROP 字段名ALTER TABLE SCHOOL DROP NAME;-- 增加字段alter table stu add address varchar(50);修改表:
(1)修改表的名称呢
alter table 表名 rename to 新的名字;
demo:
alter table ta1 rename to ta0;
(2)添加一个新字段
alter table 表名 add 新字段 字段的类型;
demo:
alter table ta0 add unames varchar(20);
(3)修改字段:
alter table 表名  change 旧得字段  新的字段 字段的数据类型;
alter table ta0 change unames uname varchar(20);
(4)修改字段的类型:
alter table 表名  modify  字段  字段的新类型
demo:
alter table ta0 modify uname int;

查看SHOW

SHOWSHOW CREATE TABLE 表名  查看建表语句EXPLAIN SELECT * FROM APP_USER WHERE `NAME` = '用户123';show tables from mytestdb

三、对数据操作

增INSERT

INSERT-- 插入语句-- INSERT INTO 表名([字段名1,字段名2,字段3]) VALUES ('值1'),('值2')INSERT INTO `STUDENT`(`NAME`) VALUE('李四'); INSERT INTO `student`(`NAME`,`PWD`,`SEX`) VALUES ('店小二','1234','20')

删DELETE

DELETE-- DELETEDELETE FROM `STUDENT` WHERE ID=1;

改UPDATE

UPDATE-- update 修改谁  (条件) set原来的值=新值UPDATE `STUDENT` SET `NAME`='法外狂徒' WHERE id=1; -- 不指定条件的情况下,会改动所有表UPDATE `STUDENT` SET `NAME`='张三';-- 加密UPDATE STUDENT SET PWD=MD5(PWD) WHERE ID=1;

查询SELECT

SELECT-- SELECT 字段 FROM 表-- 查询全部SELECT * FROM STUDENT-- 查询指定字段SELECT `NAME` FROM STUDENT-- 别名SELECT `NAME` AS 名字, `SEX` AS 性别 FROM STUDENT AS S-- 函数SELECT CONCAT('姓名:',NAME) AS 新名字 FROM STUDENT-- 去重SELECT DISTINCT `NAME` FROM  STUDENT

查看DESC

DESCDESC 表名   显示表结构

核心总结

一、对数据库操作(database)

create、drop、show

二、对表操作(table)

create、drop、alter、show

三、对数据操作

insert、delete、update、select、desc

为第二次笔记做准备

1.查询记录

select*from 表名 [where 条件];eg:select*from students;//查询 students 表中所有记录,所有字段的值都显示出来select field1,field2,...fieldn... from 表名 [where 条件];eg:select id,name,age from students;//查询 students 表中所有记录, 只显示出 id,name,age三个字段的值

1.“*”表示将所有的字段都显示出来

2.用逗号分割,列出需要显示的字段

2.去重

select distinct 字段 from 表名;eg: select distinct name from students;//查询名字不相同的学生;select distinct name,age from students;//查询名字和年龄同时不同的学生1.distinct必须放在最开头2.distinct只能使用需要去重的字段进行操作。  ----也就是说我sidtinct了name,age两个字段,我后面想根据id进行排序,是不可以的,因为只能name,age两个字段进行操作.3.distinct去重多个字段时,含义是:几个字段 同时重复 时才会被 过滤。

3.条件查询

select 字段 from 表名 where 条件;eg:select * from student where sex='男' and age>20; //查询性别是男,并且年龄大于20岁的人。where后面的条件可以用>、<、>=、<=、!=等多种比较运算符,多个条件之间可以用or、and等逻辑运算符

4.排序和限制

排序
select * from 表名 [where 条件] [ order by  field1 [desc/asc],field2 [desc/asc]... ];eg:select *from student order by age desc;//查询学生表并按年龄降序排列。1.desc 降序排列,asc 升序排列
2.order by 后面可以跟多个不同的排序字段,每个排序字段都可以有不同的排序顺序。
3.如果排序字段的值一样,则相同的字段按照第二个排序字段进行排序。
4.如果只有一个排序字段,则字段相同的记录将会无序排列。
限制
select ... [limit 起始偏移量,行数];eg:select * from student order by mark desc limit 5;//取出成绩前五名的学生(省略了起始偏移量,此时默认为0)1.默认情况下,起始偏移量为0,只写记录行数就可以。

5.聚合

select 字段 fun_name from 表名 [where 条件] [group by field1,field2...] [with rollup] [having 条件];eg:1.fun_name 表示要做的聚合操作,也就是说聚合函数,常用的有 : sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。
2.group by关键字 表示要进行分类聚合的字段。比如要按照部门分类统计员工数量,部门就应该写在group by 后面。
3.with rollup 是可选语法,表明是否对分类聚合后的结果进行再汇总
4.having 关键字表示对分类后的结果再进行条件过滤。

6.表连接

表连接分为内连接外连接

他们之间最主要的区别:内连接仅选出两张表中互相匹配的记录,外连接会选出其他不匹配的记录。

外连接 分为左连接右连接

**左连接:**包含所有左边表中的记录,甚至是右边表中没有和他匹配的记录。

**右连接:**包含所有右边表中的记录,甚至是右边表中没有和他匹配的记录。

笔记二次整理 (适合动手练习)

语法

DQL

select单独总结

DML

增 INSERT

INSERT 语句有两种语法形式,分别是 INSERT…VALUES 语句和 INSERT…SET 语句。

1) INSERT…VALUES语句

INSERT VALUES 的语法格式为:

INSERT INTO <表名> [ <列名1> [ , … <列名n>] ] VALUES (值1) [… , (值n) ];

语法说明如下。

  • <表名>:指定被操作的表名。
  • <列名>:指定需要插入数据的列名。若向表中的所有列插入数据,则全部的列名均可以省略,直接采用 INSERT<表名>VALUES(…) 即可。
  • VALUESVALUE 子句:该子句包含要插入的数据清单。数据清单中数据的顺序要和列的顺序相对应。

2) INSERT…SET语句

语法格式为:

INSERT INTO <表名> SET <列名1> = <值1>, <列名2> = <值2>, …

此语句用于直接给表中的某些列指定对应的列值,即要插入的数据的列名在 SET 子句中指定,col_name 为指定的列名,等号后面为指定的数据,而对于未指定的列,列值会指定为该列的默认值。

由 INSERT 语句的两种形式可以看出:

  • 使用 INSERT…VALUES 语句可以向表中插入一行数据,也可以插入多行数据;
  • 使用 INSERT…SET 语句可以指定插入行中每列的值,也可以指定部分列的值;
  • INSERT…SELECT 语句向表中插入其他表的数据。
  • 采用 INSERT…SET 语句可以向表中插入部分列的值,这种方式更为灵活;
  • INSERT…VALUES 语句可以一次插入多条数据。

在 MySQL 中,用单条 INSERT 语句处理多个插入要比使用多条 INSERT 语句更快。

当使用单条 INSERT 语句插入多行数据的时候,只需要将每行数据用圆括号括起来即可。

删 DELETE

删除单个表中的数据

DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]

语法说明如下:

  • <表名>:指定要删除数据的表名。
  • ORDER BY 子句:可选项。表示删除时,表中各行将按照子句中指定的顺序进行删除。
  • WHERE 子句:可选项。表示为删除操作限定删除条件,若省略该子句,则代表删除该表中的所有行。
  • LIMIT 子句:可选项。用于告知服务器在控制命令被返回到客户端前被删除行的最大值。

改UPDATE

使用 UPDATE 语句修改单个表,语法格式为:

UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ] [ORDER BY 子句] [LIMIT 子句]

语法说明如下:

  • <表名>:用于指定要更新的表名称。
  • SET 子句:用于指定表中要修改的列名及其列值。其中,每个指定的列值可以是表达式,也可以是该列对应的默认值。如果指定的是默认值,可用关键字 DEFAULT 表示列值。
  • WHERE 子句:可选项。用于限定表中要修改的行。若不指定,则修改表中所有的行。
  • ORDER BY 子句:可选项。用于限定表中的行被修改的次序。
  • LIMIT 子句:可选项。用于限定被修改的行数。

注意:修改一行数据的多个列值时,SET 子句的每个值用逗号分开即可。

DDL

增CREATE DATABASE

语法格式如下:

CREATE DATABASE [IF NOT EXISTS] <数据库名>[[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];

[ ]中的内容是可选的。语法说明如下:

  • <数据库名>:创建数据库的名称。MySQL 的数据存储区将以目录方式表示 MySQL 数据库,因此数据库名称必须符合操作系统的文件夹命名规则,不能以数字开头,尽量要有实际意义。注意在 MySQL 中不区分大小写。
  • IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才能执行操作。此选项可以用来避免数据库已经存在而重复创建的错误。
  • [DEFAULT] CHARACTER SET:指定数据库的字符集。指定字符集的目的是为了避免在数据库中存储的数据出现乱码的情况。如果在创建数据库时不指定字符集,那么就使用系统的默认字符集。
  • [DEFAULT] COLLATE:指定字符集的默认校对规则。

MySQL 的字符集(CHARACTER)和校对规则(COLLATION)是两个不同的概念。字符集是用来定义 MySQL 存储字符串的方式,校对规则定义了比较字符串的方式。后面我们会单独讲解 MySQL 的字符集和校对规则。

删DORP

使用 DROP TABLE 语句可以删除一个或多个数据表,语法格式如下:

DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 …]

对语法格式的说明如下:

  • 表名1, 表名2, 表名3 ...表示要被删除的数据表的名称。DROP TABLE 可以同时删除多个表,只要将表名依次写在后面,相互之间用逗号隔开即可。
  • IF EXISTS 用于在删除数据表之前判断该表是否存在。如果不加 IF EXISTS,当数据表不存在时 MySQL 将提示错误,中断 SQL 语句的执行;加上 IF EXISTS 后,当数据表不存在时 SQL 语句可以顺利执行,但是会发出警告(warning)。

两点注意:

  • 用户必须拥有执行 DROP TABLE 命令的权限,否则数据表不会被删除。

  • 表被删除时,用户在该表上的权限不会自动删除。

  • 使用 DROP TABLE 语句可以删除一个或多个数据表,语法格式如下:

    DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 …]

    对语法格式的说明如下:

    • 表名1, 表名2, 表名3 ...表示要被删除的数据表的名称。DROP TABLE 可以同时删除多个表,只要将表名依次写在后面,相互之间用逗号隔开即可。
    • IF EXISTS 用于在删除数据表之前判断该表是否存在。如果不加 IF EXISTS,当数据表不存在时 MySQL 将提示错误,中断 SQL 语句的执行;加上 IF EXISTS 后,当数据表不存在时 SQL 语句可以顺利执行,但是会发出警告(warning)。

    两点注意:

    • 用户必须拥有执行 DROP TABLE 命令的权限,否则数据表不会被删除。
    • 表被删除时,用户在该表上的权限不会自动删除。

改 ALTER TABLE

ALTER TABLE <表名> [修改选项]

  • { ADD COLUMN <列名> <类型>
  • CHANGE COLUMN <旧列名> <新列名> <新列类型>
  • ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
  • MODIFY COLUMN <列名> <类型>
  • DROP COLUMN <列名>
  • RENAME TO <新表名> }

添加字段

ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST|AFTER 已存在的字段名];

修改字段数据类型

ALTER TABLE <表名> MODIFY <字段名> <数据类型>

删除字段

ALTER TABLE <表名> DROP <字段名>;

修改字段名称

ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;

修改表名

ALTER TABLE <旧表名> RENAME [TO] <新表名>;

增删改总结

-- 总结
insert into t_student (sname, classno) value (1,"asd");
insert into t_student set sname="王五", classno=1;delete from t_student where sno=4;delete from t_student;
truncate table t_student;update t_student
set sno = 3
where sno = 5;create table t_test(id int(2) primary key auto_increment not null comment 'id',sex varchar(2) not null default "男",constraint keai foreign key (id) references t_class (cname)
);drop table if exists t_class;alter table t_class add primary key (cname);
alter table t_student add constraint askeai foreign key (sno) references t_class (cname);
alter table t_student drop foreign key askeai;
alter table t_student modify classno int(2);
alter table t_student add ak int(1) not null comment '无';

函数

单行函数

1.字符串函数

函数 描述
CONCAT(str1, str2, ···, strn) 将str1、str2···strn拼接成一个新的字符串
INSERT(str, index, n, newstr) 将字符串str从第index位置开始的n个字符替换成字符串newstr
LENGTH(str) 获取字符串str的长度
LOWER(str) 将字符串str中的每个字符转换为小写
UPPER(str) 将字符串str中的每个字符转换为大写
LEFT(str, n) 获取字符串str最左边的n个字符
RIGHT(str, n) 获取字符串str最右边的n个字符
LPAD(str, n, pad) 使用字符串pad在str的最左边进行填充,直到长度为n个字符为止
RPAD(str, n, pad) 使用字符串pad在str的最右边进行填充,直到长度为n个字符为止
LTRIM(str) 去除字符串str左侧的空格
RTRIM(str) 去除字符串str右侧的空格
TRIM(str) 去除字符串str左右两侧的空格
REPLACE(str,oldstr,newstr) 用字符串newstr替换字符串str中所有的子字符串oldstr
REVERSE(str) 将字符串str中的字符逆序
STRCMP(str1, str2) 比较字符串str1和str2的大小
SUBSTRING(str,index,n) 获取从字符串str的index位置开始的n个字符

2.数值函数 (Math)

函数 描述
ABS(num) 返回num的绝对值
CEIL(num) 返回大于num的最小整数(向上取整)
FLOOR(num) 返回小于num的最大整数(向下取整)
MOD(num1, num2) 返回num1/num2的余数(取模)
PI() 返回圆周率的值
POW(num,n)/POWER(num, n) 返回num的n次方
RAND(num) 返回0~1之间的随机数
ROUND(num, n) 返回x四舍五入后的值,该值保留到小数点后n位
TRUNCATE(num, n) 返回num被舍去至小数点后n位的值

3.日期与时间函数

CURDATE() 返回当前日期
CURTIME() 返回当前时间
NOW() 返回当前日期和时间
SYSDATE() 返回该函数执行时的日期和时间
DAYOFYEAR(date) 返回日期date为一年中的第几天
WEEK(date)/WEEKOFYEAR(date) 返回日期date为一年中的第几周
DATE_FORMAT(date, format) 返回按字符串format格式化后的日期date
DATE_ADD(date,INTERVAL expr unit)/ADDDATE(date, INTERVAL expr unit) 返回date加上一个时间间隔后的新时间值
DATE_SUB(date, INTERVAL expr unit)/SUBDATE(date, INTERVAL expr unit) 返回date减去一个时间间隔后的新时间值
DATEDIFF(date1, date2) 返回起始日期date1与结束日期date2之间的间隔天数

4.流程函数( IF SWITCH)

间隔类型 描述
IF(condition, t, f) 如果条件condition为真,则返回t,否则返回f
IFNULL(value1, value2) 如果value1不为null,则返回value1,否则返回value2
NULLIF(value1, value2) 如果value1等于value2,则返回null,否则返回value1
CASE value WHEN [value1] THEN result1 [WHEN [value2] THEN result2 …] [ELSE result] END 如果value等于value1,则返回result1,···,否则返回result
CASE WHEN [condition1] THEN result1 [WHEN [condition2] THEN result2 …] [ELSE result] END 如果条件condition1为真,则返回result1,···,否则返回result

5.JSON函数

函数 描述
JSON_APPEND() 在JSON文档中追加数据
JSON_INSERT () 在JSON文档中插入数据
JSON_REPLACE () 替换JSON文档中的数据
JSON_REMOVE () 从JSON文档的指定位置移除数据
JSON_CONTAINS() 判断JSON文档中是否包含某个数据
JSON_SEARCH() 查找JSON文档中给定字符串的路径

6.其他函数

函数 描述
DATABASE() 返回当前数据库名
VERSION() 返回当前MySQL的版本号
USER() 返回当前登录的用户名
INET_ATON(IP) 返回IP地址的数字表示
INET_NTOA 返回数字代表的IP地址
PASSWORD(str) 实现对字符串str的加密操作
FORMAT(num, n) 实现对数字num的格式化操作,保留n位小数
CONVERT(data, type) 实现将数据data转换成type类型的操作

多行函数

函数 描述
COUNT() 统计表中记录的数目
SUM() 计算指定字段值的总和
AVG() 计算指定字段值的平均值
MAX() 统计指定字段值的最大值
MIN() 统计指定字段值的最小值
lower() 字符串转换成小写
upper() 字符串转换成大写

select总结

select * from emp;
select EMPNO,ENAME,SAL from emp;
select * from emp where SAL>2000;
select EMPNO,ENAME from emp where SAL > 1000;
select EMPNO as 员工编号 from emp;
select EMPNO 员工编号 from emp;
select EMPNO 员工编号, ENAME 姓名, SAL 工资 from emp;
select EMPNO '员工 编号' from emp;
select EMPNO,ENAME,SAL,JOB,MGR,HIREDATE,SAL+1000 as 涨薪后,COMM,DEPTNO from emp;
select EMPNO,ENAME,SAL,JOB,MGR,HIREDATE,SAL+EMP.COMM , COMM,DEPTNO from emp;
-- 去重
select JOB from emp;
select distinct JOB from emp;
select JOB,DEPTNO from emp;
select distinct JOB,DEPTNO from emp;
-- 排序
select * from emp order by SAL; -- 默认升序
select * from emp order by SAL asc ;
select * from emp order by SAL desc ;
select * from emp order by SAL asc ,DEPTNO desc ;
-- where 过滤
select * from emp;
select * from emp where DEPTNO = 10;
select * from emp where DEPTNO >= 10;
select * from emp where DEPTNO != 10;
select * from emp where JOB = 'clerk';
select * from emp where JOB = 'CLERK';
select * from emp where HIREDATE > '1981-12-25';
-- 逻辑运算符 and AND运算符是组合两个或多个布尔表达式的逻辑运算符
select * from emp where SAL > 1000 and sal < 3000;
select * from emp where SAL > 1000 && sal < 3000;
select * from emp where SAL > 1000 and SAL < 3000 order by SAL;
select * from emp where SAL between 1500 and 3000; -- [1500,3000]
-- 逻辑运算符 or
select * from emp where DEPTNO = 10 or DEPTNO = 30;
select * from emp where DEPTNO = 10 || DEPTNO = 30;
select * from emp where DEPTNO in (10,30); --  10 30
select * from emp where DEPTNO in (10,20,30); -- 10 20 30
select * from emp where JOB in ('MANAGER','MANAGER','MANAGER');
-- 模糊查询
select * from emp where ENAME like '%A%';
select * from emp where ENAME like '_A%';
-- 判空
select * from emp where COMM is null;
select * from emp where COMM is not null;
select * from emp;
-- 小括号
select * from emp where JOB = 'SALESMAN' or JOB = 'CLERK' and SAL >= 1500;
select * from emp where JOB = 'SALESMAN' or (JOB = 'CLERK' and SAL >= 1500);
select * from emp where (JOB = 'SALESMAN' or JOB = 'CLERK') and SAL >= 1500;-- 函数
-- 字符串
select ENAME,length(ENAME),substring(ENAME,2,3) from emp;
-- 数值函数
select abs(-5) 绝对值, ceil(5.3) 向上取整, floor(5.8) 向下取整, round(3.14) 四舍五入 from dual; -- dual 伪表
select ceil(sal) from emp;
select 10/3, 10%3, mod(10,3);
-- 日期与时间
select * from emp;
select curdate() 年月日, curtime() 时分秒;
select now();
SELECT DATE_FORMAT(NOW(),'%y-%m-%d %h:%i:%s');
-- 流程相关
select EMPNO,ENAME,SAL,if(SAL>=2500,'高薪','低薪') as '薪资等级' from emp; -- if else
select EMPNO,ENAME,SAL,SAL+ifnull(comm,0) from emp;select EMPNO,ENAME,SAL,if(SAL<=2500,'低薪','高薪') as '薪资等级' from emp;-- case相关:
-- case等值判断
select empno,ename,job,
case jobwhen 'CLERK' then '店员'when 'SALESMAN'  then '销售'when 'MANAGER' then '经理'else '其他'
end '岗位',
SAL from emp;-- case区间判断:
select empno,ename,sal,
casewhen sal<=1000 then 'A'when sal<=2000 then 'B'when sal<=3000 then 'C'else 'D'
end '工资等级',
deptno from emp;select database(),user(),version() from emp;select * from emp;
select * from emp order by SAL desc ;
select COMM from emp;
select max(COMM), min(COMM), count(comm) 记录数, sum(COMM) 求和, avg(COMM) 平均值 from emp;-- 计数
select count(ENAME) from emp;
select count(*) from emp;
select 1 from dual;
select 1 from emp;
select count(1) from emp;-- 分组
select *
from emp;
select DEPTNO,avg(SAL) from emp; -- 字段和多行函数不可以同时使用
select DEPTNO,avg(SAL) from emp group by DEPTNO; -- 除非字段是是分组
select DEPTNO,avg(SAL) from emp group by DEPTNO order by DEPTNO desc ;select JOB,avg(SAL) from emp group by JOB;
select JOB,lower(JOB),avg(SAL) from emp group by JOB;-- 筛选
select * from emp;
select DEPTNO,avg(SAL) from emp group by DEPTNO having avg(SAL)>2000;
select DEPTNO 部门, avg(sal) 平均工资 from emp group by DEPTNO having 平均工资 > 2000 ;
select DEPTNO 部门, avg(sal) 平均工资 from emp group by DEPTNO having 平均工资 > 2000order by 部门;
select JOB,avg(SAL) from emp where JOB != 'MANAGER' GROUP BY JOB;select * from emp;select JOB,min(SAL) from emp group by JOB having min(SAL) < 2000;select DEPTNO,JOB,avg(SAL) from emp group by DEPTNO, JOB having avg(SAL) > 1200 order by DEPTNO;select DEPTNO,count(1),avg(SAL) from emp group by DEPTNO having count(1) < 4;

多表查询

-- 多表查询
-- 交叉连接 cross join
select * from emp cross join dept; -- 14*4 = 56条 笛卡尔乘积 : 没有实际意义,有理论意义
select * from emp join dept; -- cross 可以省略不写,mysql中可以,oracle中不可以-- 自然连接 natural join
-- 优点:自动匹配所有的同名列 ,同名列只展示一次 ,简单
select * from emp natural join dept;
select EMPNO, ENAME, SAL, DNAME, LOC from emp natural join DEPT;
-- 缺点: 查询字段的时候,没有指定字段所属的数据库表,效率低
-- 解决: 指定表名:
select emp.empno,emp.ename,sal,dept.dname,dept.loc,dept.deptno from emp natural join dept;
-- 缺点:表名太长
-- 解决:表起别名
select e.empno,e.ename,e.sal,d.dname,d.loc,d.deptno
from emp e
natural join dept d;
-- 自然连接 natural join 自动匹配表中所有的同名列,但是有时候我们希望只匹配部分同名列
-- 解决:内连接 using子句
select * from emp e inner join dept d using(deptno);
select * from emp join dept using (deptno);
-- using缺点:关联的字段,必须是同名的
-- 解决: 内连接 - on子句:
select * from emp e join DEPT d on (e.ENAME = d.DEPTNO);-- 多表连接查询的类型: 1.交叉连接  cross join  2. 自然连接  natural join
-- 3. 内连接 - using子句   4.内连接 - on子句
-- 综合看:内连接 - on子句
select *
from emp einner join dept don (e.DEPTNO = d.DEPTNO)
where SAL > 3500;-- 条件:
-- 1.筛选条件  where  having
-- 2.连接条件 on,using,natural
-- SQL99语法 :筛选条件和连接条件是分开的

外连接

-- inner join  -- on 子句 显示的是所有的匹配信息
select * from emp e
inner join dept d on (e.DEPTNO = d.DEPTNO);select * from emp;
select * from dept;
-- 问题:
-- 1.40号部分没有员工,没有显示在查询结果中
-- 2.员工scott没有部门,没有显示在查询结果中
-- 外连接:除了显示匹配的数据之外,还可以显示不匹配的数据
-- 左外连接
select * from emp e left outer join DEPT d on e.DEPTNO = d.DEPTNO;
-- 右
select * from emp e right outer join DEPT d on e.DEPTNO = d.DEPTNO;
-- 全外连接
# select * from emp e full outer join dept d on e.deptno = d.deptno ;
-- 解决mysql中不支持全外连接的问题:
select * from emp e left join dept d on e.DEPTNO = d.DEPTNO
union   -- 并集 去重 效率低
select * from emp e2 right join dept d2 on e2.DEPTNO = d2.DEPTNO;select * from emp e left outer join DEPT d on (e.DEPTNO=d.DEPTNO)
union all
select * from emp e2 left outer join DEPT d2 on (e2.DEPTNO=d2.DEPTNO);
-- mysql中对集合操作支持比较弱,只支持并集操作,交集,差集不支持(oracle中支持)
-- outer可以省略不写select * from DEPT;
select * from EMP;
select * from SALGRADE;
select * from bonus;select e.ENAME, e.SAL, e.EMPNO, e.DEPTNO, d.DNAME ,e.*
from emp eright outer join dept d on e.DEPTNO = e.DEPTNOinner join salgrade son e.SALbetween s.LOSALand s.HISAL;-- 员工表:emp:employee 员工   ,mgr :manager上级领导编号,hiredate 入职日期  firedate 解雇日期 ,common:补助
-- 部门表:dept:department 部分 ,loc - location 位置-- 查询员工的编号、姓名、上级编号,上级的姓名
select * from emp 员工表;
select e.EMPNO 员工编号, e.ENAME 员工姓名, e2.MGR 领导编号, e2.ENAME 员工领导姓名from emp einner join emp e2on e.MGR = e2.EMPNO;-- 左外连接:
select e1.empno 员工编号,e1.ename 员工姓名,e1.mgr 领导编号,e2.ename 员工领导姓名
from emp e1
left outer join emp e2
on e1.mgr = e2.empno;

多表查询

-- 多表查询
-- 查询员工的编号,员工姓名,薪水,员工部门编号,部门名称:
select e.empno,e.ename,e.sal,e.deptno,d.dname
from emp e,dept d;
-- 相当于99语法中的cross join ,出现笛卡尔积,没有意义select e.empno,e.ename,e.sal,e.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno;
-- 相当于99语法中的 natural join-- 查询员工的编号,员工姓名,薪水,员工部门编号,部门名称,查询出工资大于2000的员工
select e.empno,e.ename,e.sal,e.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno and e.sal > 2000;
-- 查询员工的名字,岗位,上级编号,上级名称(自连接):
select e1.ename,e1.job,e1.mgr ,e2.ename
from emp e1,emp e2
where e1.mgr = e2.empno;
-- 查询员工的编号、姓名、薪水、部门编号、部门名称、薪水等级
select e.empno,e.ename,e.sal,e.deptno,d.dname,s.grade
from emp e,dept d,salgrade s
where e.deptno = d.deptno and e.sal >= s.losal and e.sal <= s.hisal;
-- 总结:
-- 1.92语法麻烦
-- 2.92语法中 表的连接条件 和  筛选条件  是放在一起的没有分开
-- 3.99语法中提供了更多的查询连接类型:cross,natural,inner,outer
-- 条件:
-- 1.筛选条件  where  having
-- 2.连接条件 on,using,natural
-- SQL99语法 :筛选条件和连接条件是分开的
-- 逻辑运算符  nd  &&  between-and
-- or || in()
# having与where的区别:
# having是在分组后对数据进行过滤
# where是在分组前对数据进行过滤
# having后面可以使用聚合函数
# where后面不可以使用聚合

子查询

-- 子查询
select sal from emp where ename = 'CLARK';  -- 2450
select * from emp where SAL > 2450;
select * from emp where sal > (select sal from emp where ename = 'CLARK');
select ENAME,SAL from emp where SAL > (select avg(sal) from emp);
select ename,sal
from emp
where deptno = (select deptno from emp where ename = 'CLARK')andsal < (select sal from emp where ename = 'CLARK');# 单行子查询
-- 查询工资高于 平均工资的雇员名字和工资。
select ENAME,SAL
from emp where SAL > (select avg(SAL) from emp);
-- 查询和CLARK同一部门且比他工资低的雇员名字和工资。
-- [部门][工资][名字][CLARK]
select ENAME 名字, SAL 工资
from emp where DEPTNO = (select DEPTNO from emp where ENAME = 'CLARK')and SAL < (select SAL from emp where ename = 'CLARK');
-- 查询职务和SCOTT相同,比SCOTT雇佣时间早的雇员信息
--  职务 scott 雇佣时间 雇员信息
select * from emp where JOB = (select JOB from emp where ENAME='SCOTT')and HIREDATE < (select HIREDATE from emp where ENAME = 'SCOTT');
-- 多行子查询
-- 【1】查询【部门20 中 职务 同 部门10 的雇员一样的】雇员信息。
-- 查询雇员信息
select * from emp;
-- 查询部门20中的雇员信息
select * from emp where DEPTNO = 20;
-- 部门10的雇员的职务:
select * from emp where DEPTNO = 10;
-- 查询部门20中职务同部门10的雇员一样的雇员信息
select * from empwhere DEPTNO = 20and JOB in (select JOB from emp where DEPTNO = 10);
select * from empwhere deptno = 20and job = any(select job from emp where deptno = 10);-- 【2】查询工资比所有的“SALESMAN”都高的雇员的编号、名字和工资。
-- 查询雇员的编号、名字和工资
select EMPNO 编号, ENAME 名字, SAL 工资 from emp;
-- “SALESMAN”的工资:
select sal from emp where job = 'SALESMAN';
-- 查询工资比所有的“SALESMAN”都高的雇员的编号、名字和工资。
-- 多行子查询:
select empno,ename,sal from emp
where sal > all(select sal from emp where job = 'SALESMAN');select * from emp;
-- 【3】查询工资低于任意一个“CLERK”的工资的雇员信息。
select SAL from emp where JOB='CLERK';
select * from emp where sal < any(select sal from emp where job='CLERK')
and job != 'CLERK';
-- 单行子查询
select *
from emp where SAL < (select max(SAL) from emp where JOB = 'CLERK')
and JOB != 'CLERK';
# 总结不相关的子查询引入:
# 不相关的子查询:子查询可以独立运行,先运行子查询,再运行外查询。
# 相关子查询:子查询不可以独立运行,并且先运行外查询,再运行子查询-- 【1】查询最高工资的员工  (不相关子查询)
select * from emp where sal = (select max(sal) from emp);
-- 【2】查询本部门最高工资的员工   (相关子查询)
-- 方法1:通过不相关子查询实现
select * from emp where deptno = 10 and sal = (select max(sal) from emp where deptno = 10)
union
select * from emp where deptno = 20 and sal = (select max(sal) from emp where deptno = 20)
union
select * from emp where deptno = 30 and sal = (select max(sal) from emp where deptno = 30);
-- 方法2: 相关子查询
select * from emp e where sal = (select max(sal) from emp where deptno = e.deptno) order by deptno;
-- 【3】查询工资高于其所在岗位的平均工资的那些员工  (相关子查询)
-- 不相关子查询:
select * from emp where job = 'CLERK' and sal >= (select avg(sal) from emp where job = 'CLERK')
union
select * from emp where job = 'PRESIDENT' and sal >= (select avg(sal) from emp where job = 'PRESIDENT');
select * from emp E where SAL > (select avg(SAL) from emp e2 where e2.JOB = e.JOB);

select执行顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJMUBXcE-1656578723581)(C:/Records/mds/images/image-20220629161530461.png)]

索引

-- 索引
-- Primary key 主键索引
-- Unique 唯一索引-- 避免同一个表中某数据列中的值重复
CREATE TABLE `Grade`(
`GradeID` INT(11) AUTO_INCREMENT PRIMARY KEY,
`GradeName` VARCHAR(32) NOT NULL UNIQUE,
);
-- index 常规索引
# 作用 : 快速定位特定数据
create table `result` (-- 省略一些代码index `ind` (`studentNo`,'subjectNo')
);-- 创建后添加
alter table result add index `id` (`studentNo`,'subjectNo');-- FullText 全文索引
# 只能用于MyISAM类型的数据表
# 只能用于CHAR , VARCHAR , TEXT数据列类型
# 适合大型数据集
show index from account;
select * from account;
alter table account add index (cash);# 索引创建
alter table account add index 普通索引 (cash);
show index from account;
alter table account drop index 我的索引;
alter table account add unique 唯一索引 (name);
alter table account add `test` text;
alter table account add fulltext 全文索引 (test);

事务

-- 事务
create database `shop` character set utf8 collate utf8_general_ci;
use shop;
create table `account` (`id` INT(11) NOT NULL AUTO_INCREMENT,`name` VARCHAR(32) NOT NULL,`cash` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;insert into account (name, cash)
values ('A', 2000.00),('B',1000.00);-- 转账实现
SET autocommit = 0;
start transaction;
update account set cash=cash-500 where `name` = 'A';
update account set cash=cash+500 where `name` = `B`;
commit;
select * from account;
set autocommit = 1;# 关闭自动提交->开启事务->操作->提交事务->开启自动提交

三大范式

一、 列不可再分
二、 非主键必须 完全依赖主键(针对联合主键) 一个表中只能保存一种数据
三、 性不依赖于其他非主属性 (如果出现,外键关联)# ER图: 实体关系图

mysql入门(笔记有两次整理,可以直接找自己要找的东西)相关推荐

  1. 【mysql入门笔记01 2022.9.27】

    mysql入门笔记01 2022.9.27 数据库概念 数据库管理系统 关系型数据库(RDBMS) 非关系型数据库(NoSQL) SQL概念 Mysql 版本 Mysql安装 Mysql启动 方式一 ...

  2. MySql入门笔记二~悲催的用户

    这些是当年小弟的MySql学习笔记,木有多么复杂的结构操作,木有多炫丽的语句开发,木有...总之就是木有什么技术含量... 日复一日,彪悍的人生伴随着彪悍的健忘,运维操作为王,好记性不如烂笔头,山水有 ...

  3. 5天学习MYSQL数据库第一天剩余全部笔记(超级详细的mysql入门笔记适合新手反复看加深记忆)

    这是关于五天学习MYSQL数据库的笔记,如果想要观看视频可以访问(视频链接(b站) 或者访问视频链接 之前的笔记已经记到了1.3的mysql基本介绍,接下来主要是: 2.1MySQL服务端框架 一. ...

  4. MySQL入门笔记1

    SQL语句基本用法: 1. SQL语句分类: 1.1 数据定义语言: 简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等.关键字:create,alt ...

  5. Mysql入门笔记(1): python——SQL基本使用

    终于学到数据库操作了,这意味着什么?以后再也不用从文件里读写数据了,过程实在太复杂了~~~为了纪念这个激动人心的时刻,一定要写一篇博客! 使用mysql数据库--增 插入一条数据 首先,还是先解释一下 ...

  6. MySQL入门笔记(五):另存数据为文件(导出数据)

    在select查询数据之后,要把结果数据保存到文件里,则需要另存数据为文件的操作,即导出数据 mysql> select user,host into outfile 'out.csv' fie ...

  7. 阿里云rds for mysql平台介绍_阿里云RDS for MySQL 快速入门——笔记

    1初始化配置 1.1设置白名单 创建RDS实例后,需要设置RDS实例的白名单,以允许外部设备访问该RDS实例.默认的白名单只包含默认IP地址127.0.0.1,表示任何设备均无法访问该RDS实例. 设 ...

  8. js入门笔记整理(二)——操作符

    上一篇:js入门笔记整理 一元操作符 递增 递增分为前置递增和后置递增 前置型--两个加号(++)放在前面 var num = 1;++num; 这个操作其实就是给num加1,上面的列子等效于: va ...

  9. mysql入门到跑路_MySQL 24小时入门笔记(3),插入和删除,删库到跑路

    MySQL 24小时入门笔记 插入 INSERT INSERT用法非常简单.现在我们有表students如下. 列名 类型 约束 id int primary key name char(16) NO ...

最新文章

  1. 2022-2028年成都餐饮业投资分析及前景预测报告
  2. Keras,今天7岁啦!
  3. 中消协:警惕以治病为噱头的保健品虚假宣传行为
  4. 关于“指针的指针”的认识(值传递、指针传递区分)
  5. python计算最大回撤_最大回撤线性算法实现
  6. 用html5开发本地桌面应用,十个使用HTML5开发的精彩应用
  7. 每周荐书:Swift、Java、React(评论送书)
  8. 006 与PHP无关的EXCEL分割字符串
  9. QQ vx 刷屏神器!!
  10. Time——信仰:梦在远方,路在脚下
  11. [ZZ]什么是Google Urchin:了解Urchin与Google Analytics差异
  12. CCF小白刷题之路---201809-1 卖菜(C/C++ 100分)
  13. 个人作品 轻航 - 社区商城系统
  14. 国内的知名产品及其开发语言v0.0.1
  15. Android Studio 之 实现app打开界面透明化效果
  16. 怎么做软件开发,软件开发流程八个步骤
  17. Vbs脚本将本地文件上传到Azure存储账户
  18. canvas实现简单的刮刮乐功能
  19. 使用Guava的RateLimiter做限流
  20. [王鼎杰] 法国为什么是五常之一

热门文章

  1. Aspose.Words利用word样式写入标题及正文(.NET)
  2. 程序员如何度过职业倦怠期?
  3. java数据类型ppt_java - 基本数据类型及操作.ppt
  4. 哪款入耳式蓝牙耳机性价比高?高性价比入耳式蓝牙耳机推荐
  5. 前端图形之:SVG与Canvas(border、clip-path)
  6. windows安装opencv4.1.1过程中ffmpeg、ippicv、face_landmark_model下载出错解决办法
  7. 计算机系程序员必学的十大基础算法
  8. 戴琼海院士:国际经济形势下滑,为何全球却在大力发展人工智能?
  9. rc与deployment的区别
  10. oppok5计算机想要原来的版本,OPPO K5:已经不是性价比机型了?