MySQL必会知识-----知识点整理大全

第一章 MySQL简介

1.1 客户机-服务器软件

  • MySQL是一种数据库管理系统(DBMS),MySQL数据库是基于客户机-服务器的数据库,客户机将用户的请求传输给服务器,通过服务器完成数据的添加、删除、更新等功能实现。

第二章 MySQL的使用(USE、SHOW)

2.1 USE关键字

  • USE关键字用来选择要进行操作的数据库,使用该语句不返回任何结果
  • 使用方法:USE+数据库名称
    例如:USE UserDatabase

2.2 SHOW关键字

  • SHOW关键字用于显示数据库、表、列、用户、权限等信息
  • 返回数据库列表: SHOW DATABASES
  • 返回数据库内的表列表:SHOW TABLES
  • 显示customers表的表列:show columns from customers;MySQL中使用 describe 作为show columns from的快捷方式,及describe customers是等价的。

自动增量:MySQL可以自动的为每个行分配下一个可用编号,不用在添加一行时手动分配唯一值(这样做必须记住最后一次使用的值),这个功能就叫做自动增量。

第三章 检索数据(SELECT、DISTINCT、LIMIT)

  • 多条SQL语句必须以分号(;)分隔。
  • SQL语句不区分大小写,但是为了使代码更便于调试和阅读,通常将SQL关键字使用大写,而对所有的列和表使用小写
  • 空格的使用:在处理SQL语句时,所有的空格都会被忽略,通过将SQL语句分成多行更易于阅读

3.1 SELECT子句

select语句用于从一个或多个表中检索信息
1、从account表中检索列名为name的列

select name from account;

2、检索表中的所有列

select * from account;

在该代码中 *表示通配符 ,使用通配符最大的有点是能检测出名字未知的列

3.2 DISTINCT关键字用于指示MySQL语句只返回不同值

当时用SELECT关键字查询某一列时,可能出现重复数值的列表,此时可以使用DISTINCT关键字指示MySQL只返回不同的值

SELECT DISTINCT dep_id FROM emp; 

在这里插入图片描述
输出结果:
在这里插入图片描述

3.3 LIMIT关键字用于限制结果

SELECT name FROM emp LIMIT 3;
SELECT name FROM emp LIMIT 3,2;

LIMIT m:后面只带一个值时,表示选取列的前m行作为返回结果。
LIMIT m,n:后面带两个值时,表示从m行开始的n行作为返回结果。

3.4 使用完全限定的表名(同时使用表名和列字)

SELECT emp.name FROM db1.emp;

emp.name:emp表中的name列
db1.emp:db1数据库中的emp表
该语句即表示从db1数据库中的emp表检索列名为name的列。

第四章 排序检索数据(ORDER BY、DESC)

SQL语句在返回某个数据库表的单个列时并没有特定的排序,通过ORDER BY子句,将检索出的数据进行排序。

4.1 ORDER BY子句

ORDER BY子句可以选择一个或多个列的名字,并由此对输出进行排序。

SELECT name FROM emp ORDER BY name;

当name为英文时,该语句指示MySQL将name列按照name的字母顺序进行排序输出。

SELECT name FROM emp ORDER BY CONVERT(name USING gbk);

在使用MySQL对包含中文的字段进行排序和查找时,对汉字的排序和查找结果往往都是错误的,存储姓名的字段采用的是UTF-8字符集,需要在排序的时候对字段转码为gbk,对应的代码是ORDER BY convert(name using gbk) ,从而实现对中文字段的排序

SELECT name,age,dep_id FROM emp ORDER BY dep_id,age;

该语法表示按照dep_id和age队列的结果对name,age,dep_id三个列进行排序,首先先按照dep_id进行排序,当dep_id相同时按age进行排序,输出结果如下:

在这里插入图片描述

4.2 DESC关键字用于降序排序

数据排序的默认排序为升序排序(从A到Z),当使用ORDER BY 对数据进行降序排序时,必须指定DESC关键字,DESC关键字只对其前面的列名起作用。与 DESC相反的升序关键字是ASC,一般不使用,因为升序是默认的。

SELECT age FROM emp ORDER BY age DESC;

例子:使用ORDER BY 和LIMIT关键字组合找出最高或最低值
升序排列,取第一个元素,即最小值
降序排列,取第一个元素,即最大值

SELECT age FROM emp ORDER BY age LIMIT 1;
SELECT age FROM emp ORDER BY age DESC LIMIT 1;

第五章 过滤数据(WHERE、AND、OR、IN、NOT)

在SELECT语句中WHERE子句通过指定搜索条件实现数据的过滤,WHERE子句在表名(FROM之后)给出,当ORDER BY 和 WHERE子句同时使用时,应让ORDER BY位于WHERE之后,否则将产生错误

5.1 使用WHERE子句

查找年龄小于30岁的人

SELECT name,age FROM emp WHERE age<30;

5.2 WHERE子句操作符

操作符说明
=等于
<>不等于
!=不等于
<小于
>大于
<=小于等于
>=大于等于
BETWEEN指定位于两个值之间

检查单个值:

SELECT name,age From emp WHERE name='王五';

检查不匹配:

SELECT name,age FROM EMP WHERE name!='张三';

检查范围内元素:

SELECT name,age FROM emp WHERE age BETWEEN 20 AND 30;

空值检查:

SELECT name,age FROM emp WHERE age IS NULL;

5.3 组合WHERE子句,AND操作符和OR操作符

当指定多个搜索条件时,通过AND子句或OR子句对搜索条件进行拼接。

  • AND子句:检索出的结果需要满足所有指定条件
  • OR子句:检索出的结果只需要满足任意一条条件即可
SELECT name,age,dep_id FROM emp WHERE dep_id=1 AND age<=30;

输出结果:
在这里插入图片描述

SELECT name,age,dep_id FROM emp WHERE dep_id=1 OR age<=30;

输出结果:
在这里插入图片描述
通过将AND和OR操作符进行结合,可以实现复杂和高级的过滤。需要注意的是:SQL在处理OR操作符前,优先处理AND操作符,因此在使用具有AND和OR操作符的WHERE子句时,应该使用圆括号明确地分组操作符,避免由于执行的优先级原因而导致过滤错误!!!

5.4 IN操作符

IN操作符用来指定条件范围,对范围中的每个条件都可以进行匹配。IN的功能与OR相当,但执行一般比OR更快,IN的最大优点是可以包含其他SELECT语句,能够更动态的建立WHERE子句

SELECT name,age,dep_id FROM emp WHERE dep_id IN (1,2) ORDER BY dep_id,age;

5.5 NOT操作符

NOT操作符用于否定它之后所跟的任何条件

SELECT name,age,dep_id FROM emp WHERE dep_id NOT IN (1,2) ORDER BY dep_id,age;

第六章 用通配符进行过滤(LIKE)

6.1 LIKE操作符

为了在搜索子句中使用通配符,必须使用LIKE操作符指示MySQL后面跟的是通配符匹配而不是直接相等匹配

两种通配符:

  • 百分号 %:%表示任何字符出现任何次数,百分号也可以匹配0个字符
  • 下划线 _ :_ 表示单个的任何字符

找到姓张的所有人员:

SELECT name,age,dep_id FROM emp WHERE NAME LIKE '张%';

张%、%张%、%张三种通配符表达的区别

  • 张%:匹配以张开头的所有数据
  • %张%:表示匹配任何位置包含张的数据
  • %张:匹配以张结尾的所有数据

通配符在使用时虽然带来了便捷,但是不要过度使用通配符,使用通配符所花费的时间比其它搜索方式更长。

第七章 使用正则表达式进行搜索(REGEXP)

7.1 REGEXP关键字

REGEXP关键字后面跟的是正则表达式

SELECT name,age,dep_id FROM emp WHERE age REGEXP '.4';
  • . 是正则表达式语言中的一个特殊字符,表示匹配任意一个字符。

7.2 进行OR匹配

OR 可以用 | 表示
查找年龄为22或24的所有人数据信息

SELECT name,age,dep_id FROM emp WHERE age REGEXP '22|24';

7.3 匹配几个字符之一

SELECT name,age,dep_id FROM emp WHERE age REGEXP '[23]4';

正则表达式:[23]4,表示匹配23或24。[]是另一种形式的OR语句

7.4 匹配范围

SELECT name,age,dep_id FROM emp WHERE age REGEXP '2[3-9]' ORDER BY age;

正则表达式:2[3-9],表示匹配年龄为23-29的所有数据

7.4 匹配特殊字符

在正则表达式中, . 表示任意一个字符,当要找出包含 . 字符的值时,不能直接对特殊字符进行匹配,以下面代码为例:

SELECT name,age,dep_id FROM emp WHERE age REGEXP '.' ORDER BY age;

该代码会输出所有数据,并未实现包含 . 字符的检出

为了匹配特殊字符,必须用\为前导。如:\-表示查找包含-的字符;\.表示查找包含.的所有字符。这种处理就是所谓的转义,通过转义实现特殊字符的匹配
查找字符中包含 . 的正确语句应该如下:

SELECT name,age,dep_id FROM emp WHERE age REGEXP '\\.' ORDER BY age;

7.5 匹配字符类

预定义字符集被称为字符类
在这里插入图片描述

7.6 匹配多个实例

正则表达式重复元字符可以完成多个实例的匹配
在这里插入图片描述

重复元字符、特殊字符匹配、范围匹配的使用:

SELECT name,age,dep_id FROM emp WHERE dep_id REGEXP '\\([0-9] sticks?\\)' ORDER BY dep_id;

正则表达式:\\([0-9] sticks?\\)
\用于匹配特殊字符,\(-------------->匹配( ;\)----------------->匹配)
[0-9]表示匹配范围0-9的数字
sticks?表示字符s可以出以一次或0次出现,sticks和stick都是匹配的
举几个个匹配的例子:(3 stick)、(3 sticks)、(5 stick)等

字符类、重复元字符的使用:

SELECT name,age,dep_id FROM emp WHERE dep_id REGEXP '[[:digit:]]{4}' ORDER BY dep_id;

正则表达式:[[:digit:]]{4},该语句就表示匹配连在一起的任意4位数字
[:digit:]:表示0-9任意数字,等同[0-9]
{4}:表示前面的字符出现4次

等同于:

SELECT name,age,dep_id FROM emp WHERE dep_id REGEXP '[0-9][0-9][0-9][0-9]' ORDER BY dep_id;

7.7 定位符

当要寻找以某个元素开始或结尾的所有输出结果时,就需要使用定位符对查找元素进行定位查找。
在这里插入图片描述

SELECT name,age,dep_id FROM emp WHERE dep_id REGEXP '^[0-9//.]' ORDER BY dep_id;

正则表达式:^[0-9//.],表示匹配以数字0-9或 . 开始的所有数据信息。

第八章 创建计算字段(Concat()函数、RTrim()函数、AS关键字)

8.1 拼接字段

在MySQL的SELECT语句中,使用Concat()函数来拼接两个列。Concat()需要一个或多个指定的串,各个串之间用逗号分隔。

SELECT Concat(fname,'(',price,'元',')') FROM t_fruit
ORDER BY CONVERT(fname USING gbk),price;

其输出为:
在这里插入图片描述

RTrim()函数:用于去掉值右边的所有空格,通过使用RTrim(),对输出结果进行整理

SELECT Concat(RTrim(fname),'(',RTrim(price),'元',')') FROM t_fruit
ORDER BY CONVERT(fname USING gbk),price;

8.2 AS关键字

别名:是一个字段或值的替换名,别名用AS关键字赋予。表别名只在查询中执行,与列别名不一样,表别名不返回到客户机

SELECT Concat(RTrim(fname),'(',RTrim(price),'元',')') AS fruit_imformation 
FROM t_fruit ORDER BY CONVERT(fname USING gbk),price;

在这里插入图片描述
在MySQL中可以使用算术操作符对字段之间进行计算,算术操作符包含:+、- 、* 、\

SELECT fname,price,fcount,price*fcount AS totalprice FROM t_fruit 
ORDER BY CONVERT(fname USING gbk),price; 

第九章 使用数据处理函数 (文本处理函数、时间处理函数、数值处理函数、聚集函数)

9.1文本处理函数

  • RTrim()函数:去掉串右边的空格
  • LTrim()函数:去掉串左边的空格
  • Upper()函数:将文本转化为大写
  • Lower()函数:将串转化为小写
  • Length()函数:返回串的长度
  • Locate()函数:找出串的一个子串
  • Soundex()函数:返回发音类似的值
  • SubString()函数:返回子串的字符
SELECT username,Upper(username) as name_upcase from tb_user 
ORDER BY id;

9.2 日期和时间处理函数

日期和时间采用相应的数据类型和特殊的格式存储,一遍能快速和有效地排序和过滤,并节省物理存储空间
在这里插入图片描述
MySQL使用的日期格式,不管是插入或者更新表值还是使用WHERE进行过滤,日期的格式必须为:yyyy-mm-dd

SELECT id,num FROM orders WHERE order_data='2005-09-01';

使用该语法查找对应订单信息并不可靠,其原因是order_data的数据类型为datatime,该类型不仅存储了日期还存储了时间。比如当order_data值为2005-09-01 11:30:23时,该语法进行查询就无法进行匹配。为此,必须使用DATA()函数,提取列的日期部分进行比较更为可靠

SELECT id,num FROM orders WHERE DATA(order_data)='2005-09-01';

除了DATA()函数可以提起日期部分外,Time()函数可以用于提取时间部分

9.3 数值处理函数

在这里插入图片描述

9.4 聚集函数

聚集函数:运行在行组上,计算和返回单个值的函数

1、AVG()函数:求列均值,列名必须作为函数参数给出

SELECT AVG(price) AS avg_price FROM products;

2、COUNT()函数:用于计数,统计表中行的数目或符合特定条件行的数目
两种使用方式:

  • COUNT(*):行数目统计,不管表列中是空值还是非空值
  • COUNT(column):对特定列中具有值的行进行计数,忽略null值
SELECT COUNT(email) AS num_cust FROM customers;

对具有电子邮件的客户进行计数。

3、MAX函数:寻找指定列中的最大值,列名必须作为函数参数给出

SELECT MAX(price) AS max_price FROM products;

MAX()函数在寻找最大值时忽略null值的行,后面的MIN()函数、SUM()函数也一样

4、MIN()函数:寻找指定列最小值,指定列的列名作为函数参数传入

SELECT MIN(price) AS min_price FROM products;

5、SUM()函数:用来返回指定列值的和,指定列名作为参数传入

SELECT SUM(price) AS sum_price FROM products;

6、聚集不同值,使用DISTINCT筛选出不同值进行计算

SELECT AVG(DISTINCT price) AS avg_price FROM products; 

7、组合聚集函数

SELECT COUNT(*) AS numbers,
	MIN(price) AS min_price,
	MAX(price) AS max_price,
	AVG(price) AS avg_price FROM products;

第十章 分组数据 (GROUP BY子句、HAVING)

10.1 创建分组(GROUP BY)

分组是在SELECT语句的GROUP BY子句中建立的,如下

SELECT dep_id,COUNT(*) AS numbers FROM emp GROUP BY dep_id;

在这里插入图片描述
查询结果:
在这里插入图片描述
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之间

10.1 过滤分组(HAVING)

where过滤指定的是行而不是分组,且WHERE没有分组的概念。因此使用HAVING实现过滤分组。
HAVING用于实现过滤分组,WHERE只能实现过滤

SELECT dep_id,COUNT(*) AS numbers FROM emp 
GROUP BY dep_id HAVING COUNT(*)>2;

第十一章 使用子查询

子查询的概念:嵌套在其他查询中的查询成为子查询,子查询总是由内向外进行处理。
例子如下:

SELECT name FROM emp WHERE dep_id 
IN(SELECT dep_id FROM emp WHERE age>30);

先查询年龄大于30的dep_id在dep_id范围内的所有人名称

11.1 相关子查询

在这里插入图片描述
红色框中表示从orders表中统计订单顾客id与顾客表中顾客id的匹配次数(对于某一个顾客来说其顾客id是固定的,但在订单表同同一个顾客可以有多次订单)

相关子查询:涉及外部查询的子查询,由于列名可能存在多义性,因此对不同表之间进行查询时需要使用表名.列名这种语法对对其限定。

如果不使用完全限定的列名会出现以下情况:
在这里插入图片描述
其原因是cust_id进行了orders表中的自身比较,其返回值是表中的订单总数。

第十二章 联结表

SQL 最强大的功能之一就是能在数据检索查询的执行中联结表。关系表的设计就是要保证把信息分成多个表,一类数据一个表。

以供应商表和产品表为例:

  • 供应商表包含所有供应商信息,每个供应商占一行,每个供应商都具有唯一的标识。此标识称为主键,主键可以是供应商ID或者其他任意唯一值。
  • 产品表只存储产品信息,它除了存储供应商的ID(主键)外不存储其他供应商信息。供应商表的主键又叫做产品表的外键,通过这种方法将供应商表和产品表进行关联,利用供应商ID就能从供应商表中找出相应供应商的详细信息。

12.1 创建联结

创建联结的方式:规定要联结的所有表以及它们联结的方式
例子:

SELECT name,age,dep_name,addr FROM emp,dept 
WHERE emp.dep_id=dept.id ORDER BY dep_id,age;

dept表
在这里插入图片描述
emp表:
在这里插入图片描述
输出结果:
在这里插入图片描述

该SELECT语句中联结了emp表和dept表,emp.dep_id=dept.id为联结条件,通过WHERE子句指示MySQL匹配emp表中的dep_id和dept表中的id。
注意:写成 emp.dep_id形式的好处是可以有效避免不同表中相同列名匹配而导致的错误。

笛卡尔积:若对两个表进行联结而不设立联结条件的表关系返回结果为笛卡尔积,即检索出的行数是第一个表中的行数乘第二个表的行数。

SELECT name,age,dep_name,addr FROM emp,dept ORDER BY dep_id,age;

笛卡尔积输出效果:
在这里插入图片描述
在对表进行联结时,应保证有WHERE子句(联结条件),同时应保证WHERE子句的正确性。

12.2 内部联结(最常用联结形式)

12.1中所使用的方法为等值联结,它基于两个表之间的相等测试,这种联结也值内部联结的方法之一

内部联结的两种格式:
select 字段列表 from 表1,表2… where 条件;

SELECT name,age,dep_name,addr FROM emp,dept 
WHERE emp.dep_id=dept.id ORDER BY dep_id,age;

select 字段列表 from 表1 [inner] join 表2 on 条件;

SELECT name,age,dep_name,addr FROM
emp INNER JOIN dept ON emp.dep_id=dept.id;

两种方式得到的输出结果是一致的,第二种方法中两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定。联结条件用特定的ON子句

多表联结案例:

SELECT emp.name,age,dep_name,addr,money 
FROM emp,dept,account 
WHERE emp.dep_id=dept.id AND emp.name=account.name;

12.3 自联结

假设某物品(ID为DTNTR)存在问题,因此想知道生产该物品的供应厂商生产的其他物品是否有问题。
操作步骤:先通过物品ID找到供应商;在通过供应商找到其生产的所有物品
1、使用子查询

SELECT prod_id,prod_name FROM products 
WHERE vend_id=(SELECT vend_id FROM products WHERE prod_id='DTNTR')

2、使用自联结查询

SELECT p1.prod_id,p1.prod_name FROM products AS p1,products AS p2
WHERE p1.vend_id = p2.vend_id 
AND p2.vend_id='DTNTR';

自联结用于单表内部的多次查询,其中 products AS p1,p1为表别名,该查询语句中products有两个表别名。

12.4 自然联结

标准的联结返回的所有数据存在出现相同列出现多次的情况,自然联结可以排除多次出现,使得每个列只返回一次。

自然联结一般通过对表使用通配符(*),对所有其他表的列使用明确的子集来完成。

SELECT c.*,o.order_num,o>order_date,oi.price,oi.prod_id 
FROM customers AS c,orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id='FB'

12.5 外部联结

外部联结分为:左外部联结和右外部联结

左外部联结:
select 字段列表 from 表1 left [outer] join 表2 on 条件;

SELECT name,age,dep_name,addr FROM emp LEFT OUTER JOIN dept ON emp.dep_id=dept.id;

右外部联结:
select 字段列表 from 表1 right [outer] join 表2 on 条件;

SELECT name,age,dep_name,addr FROM emp RIGHT OUTER JOIN dept ON emp.dep_id=dept.id;

内部联结与外部联结的区别:
与内部联结关联两个表中的行不同的是,外部联结还包括没有关联行的行。在使用OUTER JOIN语法时必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,选择右边表的所有行)(LEFT指出的是OUTER JOIN左边的表,选择左边表的所有行)

举个例子:
emp表:
在这里插入图片描述
dept表:
在这里插入图片描述
在表中李连杰的dep_id为4在dept表中没有与其匹配的项

在使用内部联结时,输出结果不包含不匹配项,代码与结果如下:

SELECT name,age,dep_name,addr FROM emp INNER JOIN dept ON emp.dep_id=dept.id;

在这里插入图片描述
在使用外部联结时,代码与输出结果如下:
左外部联结,选择左边表中的所有行

SELECT name,age,dep_name,addr 
FROM emp LEFT OUTER JOIN dept ON emp.dep_id=dept.id;

在这里插入图片描述

第十三章 组合查询(UNION关键字)

使用组合查询的情况:

  • 在单个查询中从不同的表返回类似结构的数据
  • 对单个表执行多个查询,按单个查询返回数据

13.1 UNION关键字

UNION 可以组合多条SELECT执行语句,每条SELECT执行语句之间用UNION间隔开来,并把输出结果组合成单个查询结果集。
UNION从查询结果集中自动去除了重复的行,如果要保留重复的行可使用UNION ALL

输出年小于27 和部门id为1和2的员工合集:

SELECT name,age FROM emp WHERE age<27 UNION SELECT name,age FROM emp WHERE dep_id IN (1,2);

等价于:

SELECT name,age FROM emp WHERE age<27 OR dep_id IN (1,2);

UNION的使用规则:

  • 需要在两条及两条SELECT语句以上才能使用
  • 每个查询必须包含相同的列、表达式或聚集函数(各个列不需要以相同的次序列出)
  • 列数据类型必须兼容

13.2 对组合查询结果排序

SELECT语句输出用ORDER BY进行排序,在使用UNION组合查询时,只能使用一条ORDER BY子句,且必须在最后一条SELECT语句之后。

SELECT name,age FROM emp WHERE age<27 UNION SELECT name,age 
FROM emp WHERE dep_id IN (1,2) ORDER BY age;

在这里插入图片描述
排序的方式是根据排序规则先对每条SELECT 语句的输出结果进行排序,最后在进行组合输出。

第十四章 增删改(查之前写过:SELECT)

14.1 插入数据(INSERT)

14.1.1 插入完整行(INSERT)

语法格式:
INSERT INTO 表名(各个字段名称用逗号隔开)VALUE (各个字段名称插入值用逗号隔开);

INSERT INTO emp (id,name,age,dep_id) VALUES('9','周杰伦','44','4');

插入多个行

INSERT INTO emp (id,name,age,dep_id) VALUES('9','周杰伦','44','4'),
('10','林俊杰','34','3');

14.1.2 插入检索出的数据(INSERT)

假设要从另一个表中合并员工列表:
格式:
INSERT INTO 表名(各个字段名称用逗号隔开)SELECT 各个字段名称 FROM 另一个表;

INSERT INTO emp (id,name,age,dep_id) 
SELECT id,name,age,dep_id FROM empnew;

这个例子使用INSERT SELECT从empnew中将所有数据导入emp

14.2 删除数据(DELETE)

DELETE两种使用方式

  • 从表中删除特定行
  • 从表中删除所有行

在使用DELETE时,不要省略WHERE子句,否则就会错误地删除表中所有行

DELETE FROM emp WHERE id='9';

DELETE不需要列名或通配符,其格式为:
DELETE FROM 表名 WHERE 过滤条件;

14.3 修改数据(UPDATE)

UPDATE 的使用由三部分确定

  • 更新的表名
  • 列名和它们的新值
  • 确定要更新行的过滤条件

格式:
UPDATE 表名 SET 修改列名=‘更新值’ WHERE 过滤条件;

UPDATE emp SET age='40' WHERE name='周杰伦';

SET命令用于将更新值赋予被更新的列,然后通过过滤条件对要更新的行进行更新。
更新更多个列:

UPDATE emp SET age='43',dep_id='1' WHERE name='周杰伦';

第十五章 创建表和操作表(创建表、主键、外键、自增、指定默认值引擎的概念、更新删除重命名表)

15.1 创建表

CREATE TABLE students IF NOT EXISTS(
id int NOT NULL AUTO_INCREMENT,
stu_name char(50) NOT NULL,
stu_address char(50) NULL,
stu_email char(50) NULL,
PRIMARY KEY (id)
)ENGINE=InnoDB;

在该语句中

  • PRIMARY KEY 用于指定主键
  • AUTO_INCREMENT 告诉MySQL每增加一行时自动增量。每个表中只允许一个AUTO_INCREMENT 列,且它必须被索引(如:使它成为主键)
  • NOT NULL的作用表示在插入值时,需要对列进行赋值,阻止插入没有值的列。
  • CREATE TABLE用于创建表

在该表中学生姓名和id是必须的所以标识为NOT NULL(不能为空)
在表名后面添加 IF NOT EXISTS可以检查该表是否已经被创建过,并且仅在表名不存在时创建表

15.2 主键介绍

添加主键的两种方式:
语法
方式1:建表时添加唯一约束
create table 表名(
列名 数据类型 primary key auto_increment,

);

方式2:建完表后添唯一约束
alter table 表名 add primary key 字段名;

删除约束:
alter table 表名 drop primary key;

主键使用单个列,则该列中的每一个值都必须是唯一的;主键使用多个列,则这些列的组合值必须是唯一的。

15.3 指定默认值

CREATE TABLE students IF NOT EXISTS(
id int NOT NULL AUTO_INCREMENT,
stu_name char(50) NOT NULL,
stu_address char(50) NULL,
stu_email char(50) NULL,
stu_inschool int NOT NULL DEFAULT 1,
PRIMARY KEY (id)
)ENGINE=InnoDB;

如果在插入行时没有给出值,MySQL允许使用DEFAULT关键字指定默认值,默认在CREATE TABLE 语句的列定义中使用DEFAULT。在开发时大多使用默认值而非NULL。
与大多数的DBMS不一样,MySQL不允许使用函数作为默认值。

15.4 引擎类型

和其他数据库管理系统(DBMS)一样,MySQL有一个具体管理和处理数据的内部引擎。与其他DBMS不同的是,MySQL有多种引擎,全部能执行 CREATE TABLE、SELECT等命令。在MySQL中针对不同任务选择正确的引擎能够获得良好的功能和灵活性。

MySQL通过ENGINE来选择对应的引擎,当该关键字省略时,则使用默认引擎(很可能是MyISAM)

几种重要的引擎

  • InnoDB引擎:该引擎是一个很可靠的事务处理引擎但它不支持全文本搜索
  • MEMODY引擎:在功能上等同于MyISAM,但由于是将数据存储在内存中,速度快,特别适合与临时表
  • MyISAM引擎:是一个性能极高的引擎,它支持全文本搜索但它不支持事务处理

15.4 更新表

使用ALTER TABLE语句对表进行更新

在学生表中添加父母名字的列,在对表信息进行添加列时,必须满足两个条件:选择添加的表存在,必须明确添加列的数据类型

ALTER TABLE students ADD parents_name CHAR(50);

删除父母名字的列

ALTER TABLE students DROP parents_name;

ALTER TABLE 的一种常见用途是定义外键,其格式入下:
alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 主表名称(主表列名称);

另一种创建外键的方法:建表时添加外键约束
create table 表名(
列名 数据类型,

constraint 外键名称 foreign key (外键列名) references 主表(主表列名)

15.5 删除表

格式
DROP TABLE 表名

15.5 重命名表

格式
RENAME TABLE 表名 TO 更新的表名

15.6 主键与外键总结归纳

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值