一、什么是MySQL

  MySQL 是一款安全、跨平台、高效的,并与 PHP、Java 等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的 MySQL AB 公司开发、发布并支持,由 MySQL 的初始开发人员 David Axmark 和 Michael Monty Widenius 于 1995 年建立的。

  MySQL 的象征符号是一只名为 Sakila 的海豚,代表着 MySQL 数据库的速度、能力、精确和优秀本质。 目前 MySQL 被广泛地应用在 Internet 上的中小型网站中。

  由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,使得很多公司都采用 MySQL 数据库以降低成本。

  MySQL 数据库可以称得上是目前运行速度最快的 SQL 语言数据库之一。除了具有许多其他数据库所不具备的功能外,MySQL 数据库还是一种完全免费的产品,用户可以直接通过网络下载 MySQL 数据库,而不必支付任何费用。

二、MySQL的约束

  约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。

  MYSQL中,常用的几种约束:

约束类型

主键

 外键 

唯一 

非空

自增

默认值

关键字

 primary key

 foreign key

 unique 

not null

auto_increment 

default

 

1、主键约束 primary key

  主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。

  每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

# 建表时插入主键
create table temp
( 
    id int primary key,
    name varchar(20)
);
# 删除主键约束
alter table temp drop primary key;
# 添加主键约束
alter table temp add primary key(id,name);
# 修改主键约束
alter  table temp modify id int primary key;

2、外键约束 foreign key

  外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系

-- 主表
create table temp
(
    id int primary key,
    name varchar(20)
);
-- 副表
create table temp2
(
    id int,
    name varchar(20),
    classes_id int,foreign key(id) references temp(id)
);

3、 唯一约束unique

  唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。

  唯一约束不允许出现重复的值,但是可以为多个null。

  同一个表可以有多个唯一约束,多个列组合的约束。

  在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。

  唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。

-- 创建表时设置,表示用户名、密码不能重复
create table temp
(
    id int not null ,
    name varchar(20),
    password varchar(10),
    unique(name,password)
);
-- 或
create table temp
(
    id int unique not null ,
    name varchar(20) unique,
    password varchar(10),
);

-- 添加唯一约束
alter table temp add unique (name, password);
-- 修改唯一约束
alter table temp modify name varchar(25) unique;
-- 删除约束
alter table temp drop index name;

4、非空约束 not null  与  默认值 default

  非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。

Null类型特征:

  所有的类型的值都可以是null,包括int、float 等数据类型

-- 创建table表,ID 为非空约束,name 为非空约束 且默认值为abc
create table temp
(
           id int not null,
           name varchar(255) not null default  'abc',
           sex char null
);

-- 增加非空约束
alter table temp modify sex varchar(2) not null;
-- 取消非空约束
alter table temp modify sex varchar(2) null;
-- 取消非空约束,增加默认值
alter table temp modify sex varchar(2) default 'abc' null;

三、MySQL 数据类型

  MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

1、数值类型

类型

大小

范围(有符号)

范围(无符号)

用途

TINYINT

1 byte

(-128,127)

(0,255)

小整数值

SMALLINT

2 bytes

(-32 768,32 767)

(0,65 535)

大整数值

MEDIUMINT

3 bytes

(-8 388 608,8 388 607)

(0,16 777 215)

大整数值

INT或INTEGER

4 bytes

(-2 147 483 648,2 147 483 647)

(0,4 294 967 295)

大整数值

BIGINT

8 bytes

(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)

(0,18 446 744 073 709 551 615)

极大整数值

FLOAT

4 bytes

(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)

0,(1.175 494 351 E-38,3.402 823 466 E+38)

单精度
浮点数值

DOUBLE

8 bytes

(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

双精度
浮点数值

DECIMAL

对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2

依赖于M和D的值

依赖于M和D的值

小数值

CREATE TABLE IF NOT EXISTS `user`
(
    a TINYINT NOT NULL, 
    b SMALLINT NOT NULL,
    c MEDIUMINT NOT NULL,
    d INT NOT NULL,
    e BIGINT NOT NULL,
    f FLOAT NOT NULL,
    g DOUBLE NOT NULL
);

 

2、时间和日期类型

数值类型

字节数

  取值范围

日期格式

零值

YEAR

1

1901~2155

1901~2155

0000

DATE

3

1000-01-01~9999-12-31

YYYY-MM-DD

0000-00-00

TIME

3

-838:59:59~ 838:59:59

HH:MM:SS

00:00:00

DATETIME

8

1000-01-01 00:00:00~9999-12-31 23:59:59

YYYY-MM-DD HH:MM:SS

0000-00-00 00:00:00

TIMESTAMP

4

1970-01-01 00:00:01~2038-01-19 03:14:07

YYYY-MM-DD HH:MM:SS

0000-00-00 00:00:00

CREATE TABLE IF NOT EXISTS `user`
(
    a DATE NOT NULL,
    b TIME NOT NULL,
    c YEAR NOT NULL,
    d INT NOT NULL,
    e DATETIME NOT NULL,
    f TIMESTAMP NOT NULL
);

 

3、字符串类型

类型

大小

用途

CHAR

0-255 bytes

定长字符串

VARCHAR

0-65535 bytes

变长字符串(variable变量)

TINYBLOB

0-255 bytes

不超过 255 个字符的二进制字符串(101010101)

TINYTEXT

0-255 bytes

短文本字符串

BLOB

0-65 535 bytes

二进制形式的长文本数据

TEXT

0-65 535 bytes

长文本数据

MEDIUMBLOB

0-16 777 215 bytes

二进制形式的中等长度文本数据

MEDIUMTEXT

0-16 777 215 bytes

中等长度文本数据

LONGBLOB

0-4 294 967 295 bytes

二进制形式的极大文本数据

LONGTEXT

0-4 294 967 295 bytes

极大文本数据

 

CREATE TABLE IF NOT EXISTS `user`
(
    a CHAR NOT NULL,
    b VARCHAR NOT NULL,
    c TINYBLOB NOT NULL,
    d TINYTEXT NOT NULL,
    e BLOB NOT NULL,
    f TEXT NOT NULL
);

四、MySQL基础语法

1.建库建表,添加字段

#查询库
SHOW DATABASES;
#创建库
CREATE DATABASE IF NOT EXISTS jdbc DEFAULT CHARSET utf8;
#指定库
USE jdbc;
#创建表
CREATE TABLE IF NOT EXISTS student(sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),sgender VARCHAR(10),sage INT);

2、增删改语法

  2.1、插入:在MySQL通过INSERT语句向数据表中插入数据。

#插入数据 
# 语法1 
-- INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
INSERT INTO student(sname,sgender,sage)VALUES("张三","男","18");
# 语法2 在该方式中:(字段名1,字段名2,…)是可选的,它用于指定插人的字段名;(值 1,值 2,…),(值 1,值 2,…)表示要插人的记录,该记录可有多条并且每条记录之间用逗号隔开。
-- INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...),(值 1,值 2,...);
INSERT INTO student(sname,sgender,sage)VALUES("张三","男","18"),("李四","女","20");
#添加表字段
ALTER TABLE student ADD tel VARCHAR(20);

  2.2、删除:在MySQL通过DELETE语句删除数据表中的数据。

#删除库
-- DROP DATABASE 数据库名;
#删除表
-- DROP TABLE 表名;
#删除数据
-- DELETE FROM 表名 [WHERE 条件表达式];
# 如删除学生表中名字为李四的学生
DELETE FROM student WHERE sname="李四";

  2.3、修改:在MySQL通过UPDATE语句更新数据表中的数据。

# update语法
--UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 条件表达式];
# 修改学生表中id等于2的学生姓名为王五(修改单条数据)
UPDATE student SET sname='王五' WHERE id=2;
# 修改学生表中所有学生年龄修改为18(修改全部数据)
UPDATE student SET age=18;

3、基本查询:在MySQL通过SELECT语句更新数据表中的数据。

  3.1、查询所有字段

-- 全表查询
SELECT * FROM student;

  3.2、查询指定字段

-- 字段查询
SELECT sname FROM student;

  3.3、指定条件查询(where)

-- 条件查询
SELECT * FROM student WHERE sage=18;

  3.4、查询后进行分组(group by)

-- 查询语句 (group by分组)按照性别进行分组
SELECT * FROM cs_user GROUP BY gender;

  3.5、查询后进行去重(distinct)

-- 查询语句 (distinct去重)
SELECT DISTINCT age FROM cs_user;

  3.6、查询后进行排序(order by)排序默认正序  DESC倒叙

-- order by排序默认正序  DESC倒叙
SELECT * FROM cs_user ORDER BY age DESC;

  3.7、对查询数量进行条数限制(limit限制条数)

-- limit限制条数
SELECT * FROM  cs_user LIMIT 2,2;

  3.8、补充其他常用函数(max,min,count,avg)

-- 函数max,min,count,avg
SELECT COUNT(*) AS 总数,MAX(age) AS 最大年龄,MIN(age) AS 最小年龄,AVG(age) AS 平均年龄 FROM cs_user;

4、关联查询

  4.1、内链接查询

    内连接(Inner Join)又称简单连接或自然连接,是一种非常常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较并列出与连接条件匹配的数据行,组合成新的 记录。也就是说在内连接查询中只有满足条件的记录才能出现在查询结果中。

-- 语法:SELECT 查询字段1,查询字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段=表2.关系字段
-- 内连接 ....inner join...on 这里的w表示别名 相当于 websites as w
 SELECT * FROM websites w INNER JOIN access_log a ON w.id=a.site_id;

  4.2、左链接查询

    左连接的结果包括LEFT JOIN子句中指定的左表的所有记录,以及所有满足连接条件的记录。如果左表的某条记录在右表中不存在则在右表中显示为空。

-- 左连接 left join...on
SELECT * FROM websites w LEFT JOIN access_log a ON w.id=a.site_id;

  4.3、右链接查询

    右连接的结果包括RIGHT JOIN子句中指定的右表的所有记录,以及所有满足连接条件的记录。如果右表的某条记录在左表中没有匹配,则左表将返回空值。

-- 右连接 right join...on
SELECT * FROM websites w RIGHT JOIN access_log a ON w.id=a.site_id;

  4.4、联合查询union

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。(自动去重),如果不想去重的话就在union后面加上all

    请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

-- union
SELECT id,NAME FROM websites
UNION ALL
SELECT aid,DATE FROM access_log;

  4.5、全链接查询=左连接 union 右连接

-- 全连接=左连接 union 右连接
SELECT * FROM w12ebsites w LEFT JOIN access_log a ON w.id=a.site_id
UNION
SELECT * FROM websites w RIGHT JOIN access_log a ON w.id=a.site_id;

5、子查询 

  子查询是指一个查询语句嵌套在另一个查询语句内部的查询;该查询语句可以嵌套在一个 SELECT、SELECT…INTO、INSERT…INTO等语句中。

  在执行查询时,首先会执行子查询中的语句,再将返回的结果作为外层查询的过滤条件。在子査询中通常可以使用比较运算符和IN、EXISTS、ANY、ALL等关键字。

  5.1、带比较运算符的子查询

--查询工资大于王强工资的员工信息。思路:第一步,先查询王强的工资,第二步,通过 where子句,进行筛选
SELECT *FROM emp wHERE salary >= (
  SELECT salary FROM emp wHERE emp_name = ‘王强’
);
--查询部门与张建国的部门相同,工资大于孙岩工资的员工信息。
SELECT*FROM emp
wHERE dept_id = (
    SELECT dept_id FROM emp WHERE emp_name =‘张建国"
AND salary >(
    SELECT salary FROM emp wHERE emp_name =‘孙岩’
);

  5.2、IN关键字,用于判断某个记录的值,是否在指定的集合中如果字段的值在集合中,则满足条件,该字段所在的记录将会被查询出来。

--查询孙姓员工所在部门的全部员工信息。
SELECT *FROM emp
WHERE dept_id IN(
    SELECT dept_id FROM emp wHERE emp_name LIKE‘孙%
);

  5.3、EXISTS关键字后面的参数可以是任意一个子查询, 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会 执行

  5.4、ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。

  5.5、ALL关键字与ANY有点类似,只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。