MySQL必知必会

本文详细介绍了MySQL的各种操作,包括检索数据、排序、过滤、数据处理函数、聚合函数、联结表、子查询和数据的插入、更新、删除等。通过实例演示了如何使用where、order by、limit、like、in、not、group by、having等关键操作,以及正则表达式和全文本搜索。此外,还探讨了创建和操纵表的基本操作,如创建表、更新表结构和删除表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.检索数据

  • SHOW 显示某些信息
    当你不知道有哪些数据库或库里表的信息等时
    如:
  1. show databases; 显示mysql里所有的数据库
    输出:

    2. use world;show tables; 显示数据库world中所有的表,记住要先选定数据库,用鼠标或者use database-name;
    输出:

    3. show columns from city; 显示表city中的所有列,共有5列
    输出:

    每个列是一个字段,返回每一行的字段名、数据类型、是否允许null、键信息、默认值及其他信息。
  • SELECT 从一个或多个表中检索信息
  1. 检索单个列
选中数据库sys;
select variable from sys_config;    检索表sys_config中名为variable的列

输出:

2. 检索多个列
在列名之间加上逗号,最后一个列名后没有逗号

select variable,value,set_time from sys_config;    检索表sys_config中名为variable,value,set_time的列

输出:

3. 检索所有列
可以将所有列名写出来,也可以*代替

select * from sys_config;   检索所有列


4. 检索不同的行

select country from websites;  从表websites中选择列名为country

输出:

可以看到输出结果有5行,但实际上country只有2个,若要不重复输出每个值,可以用关键字distinct:

select DISTINCT country from websites;

输出:

关键字distinct必须放在列名前面,且不是局部作用,而是作用于其后面的所有列

5.指定返回行
select返回所有匹配的行,用limit子句返回指定的行

select country from websites limit 2;   返回前两行

输出:

select country from websites limit 4; 返回前四行

输出:

select country from websites limit 2,2; 返回从第2+1行开始的两行

输出:

5. 使用完全限定的表名

select websites.country from websites limit 4;    选择表websites中的列名country
select websites.country from new_schema.websites limit 4;    选择数据库new_schema中的
                                  表为websites的列country

2.排序检索出的数据

使用select中的order by子句,根据需要排序检索出来的数据。
如果直接输出表的某个列,数据并不是按照纯粹的随机顺序,而是以它在底层表的顺序显示。
子句: 一个子句通常由一个关键字和所提供的数据组成,有些子句必需,有些子句可选。

  • from子句,如上一章所示
  • order by子句:取一个或多个列名,据此对输出排序。
  • 按单个列排序,如:
select country 
from websites
order by country;

输出:

  • 按多个列排序,如:
select * 
from websites
order by column_1,column_2;

如果column_1中的每个值都是唯一的,那就不会再按照column_2排序。

  • 关键字DESC:指定排序方向
    默认升序排序(从A到Z),还可以降序排序,需要指定DESC关键字。
    DESC关键字只作用于直接位于其前面的列。
    与DESC相反的关键字是ASC升序。
  • 按单个列排序
SELECT * 
FROM mydata.emp
order by empno desc;

输出:

workbench不太好用,结果得滚动才能显示全,截图截不全。

  • 按多个列排序
SELECT * 
FROM mydata.emp
order by deptno desc, empno desc;   分别按列deptno和empno排序,且都是降序

输出:

例:order by与limit组合,找到员工表中工资最高的一行数据。

SELECT * 
FROM mydata.emp
order by sal desc
limit 1;

3. 过滤数据

  • where子句:指定搜索条件。
    where子句在表名(from子句)之后给出。
    与order by同时使用时,order by位于where之后。
SELECT * 
FROM emp
where sal=1250;

输出:

只返回了sal=1250的所有行。

SELECT * 
FROM emp
where sal=1250
order by empno desc;

输出:

  • where子句操作符:
  1. 检查单个值
SELECT * 
FROM emp
where sal>=1250
order by sal desc;

输出:

  1. 不匹配检查
SELECT * 
FROM emp
where job<>'manager'         输出除了经理以外人的工资
order by sal desc;

输出:

where job<>'manager’处如果是数字可以不用单引号括起来。

  1. 范围值检查
    用between操作符检查某个范围的值,需要开始值和结束值。
    要用and关键字将开始值和结束值分开。
SELECT * 
FROM emp
where sal between 1100 and 3000
order by sal desc;

输出:

  1. 空值检查
    在一个列不包含值时,称其为包含空值null。
    null:无值,它与字段包含0、空字符串或空格不同。
    is null子句:是一个特殊的where子句,检查具有null值的列。
SELECT * 
FROM emp
where comm is null
order by sal desc;

输出:

返回comm中是null值的所有行。

4. 数据过滤

4.1 组合where子句

组合where子句建立功能更强的检索条件。
操作符:用来联结或改变where子句中的子句的关键字,也称为逻辑操作符。

  • AND操作符
SELECT * 
FROM emp
where job='manager' and sal <= 3000    #返回经理中工资小于等于3000的
order by sal desc;

输出:

  • OR操作符
SELECT * 
FROM emp
where job='clerk' or job='manager'
order by sal;

输出:

  • 计算次序:学会用括号
SELECT * 
FROM emp
where deptno=10 or deptno=20 and sal <=1300
order by sal;

输出:

这里将 deptno=20 and sal <=1300与deptno=10并列了,所以没在deptno里作用sal<=1300,修改:

SELECT * 
FROM emp
where (deptno=10 or deptno=20) and sal <=1300
order by sal;

输出:

4.2 IN操作符

in操作符是圆括号在where子句中的另一种用法,与or操作符相似。
如上小节的例子:

SELECT * 
FROM emp
where deptno in (10,20) and sal <=1300
order by sal;

输出:

4.3 NOT操作符

有且仅有一个功能,即否定其后跟的条件。
not操作符可对in、between、exists取反。

SELECT * 
FROM emp
where deptno not in (10,20) and sal <=1300
order by sal;

输出:

这里返回deptno中除了10和20的,也就剩了30,再筛选出sal小于等于1300的。

5. 用通配符进行过滤

  • LIKE操作符
    在已知要找的精确的数据时可以用之前的简单操作符,但如果要找的东西比较模糊,没那么精确,可以利用通配符匹配而不是直接相等匹配。
  • 百分号(%)通配符
    %表示任何字符出现任意次数。
    如,找出hiredate中‘1981’的所有行:
    (1)告诉MySQL接受1981后出现的任意字符。
SELECT hiredate
FROM mydata.emp
where hiredate like '1981%';

输出:

MySQL中虽然不区分大小写,但是检索时可以区分(后面学到),这时候’A%'和’a%'结果不一样。

SELECT * FROM mydata.dept
where dname like 'a%';

输出:

(2)告诉MySQL接受‘80’前后出现的任意字符。

SELECT hiredate
FROM mydata.emp
where hiredate like '%80%';

输出:

注:
(i)%可以匹配0个、1个、多个字符。但注意如果jet结尾的末尾处有空格,‘%jet’不会匹配它们;
(ii)%可以匹配任何东西,除了null。

  • 下划线(_)通配符
    下划线用途与%一样,但只匹配单个字符而不是多个。如:
SELECT *
FROM mydata.emp
where deptno like '2_';

输出:

  • not like:选择不包含与通配符匹配的串
select * 
from websites
where name not like '%oo%';

输出:

6. 用正则表达式进行搜索

正则表达式作用是匹配文本,将一个正则表达式与一个文本串进行比较。

  • where + regexp
    websites原表:
select *
from websites
where url regexp 'www.';

输出:

检索出url中包含’www.'的行。like不可以直接这样用,因为like需要与通配符搭配。

  • [A|B] :A或B
select *
from websites
where name regexp '[g|f]';

检索url中有g或f的串

  • [123] : 1或2或3
select * 
from products
where prod_name regexp '[123] ton';

检索prod_name中有1 ton或2 ton或3 ton的串,可以用字符-匹配范围,如[1-3]。

  • . 表示匹配任意字符,要检索它,用\ \ .
select *
from products
where prod_name regexp '\\.';


如果没有两个反斜杠,结果如下:

整个表都检索了。

  • 定位符:^文本的开始,&文本的结尾
select *
from products
where prod_name regexp '^jet';

检索出prod_name以‘jet’开头的:

[abc]表示或:

select *
from products
where prod_name regexp '^[jet]';

7. 创建计算字段

  • 拼接字段
    拼接: 将值联结到一起构成单个值。在MySQL的select语句中,可使用concat()函数来拼接两个列。
SELECT concat(ename, '(', job, ')')   #将表中两个列ename和job拼接成一列
FROM mydata.emp;

输出:

concat()联结了四个部分:列名ename、左圆括号、右圆括号、列名job。
标题直接是concat(ename, ‘(’, job, ‘)’),太难看了,可以重命名。

别名: 用as关键字赋予,跟在concat()后面。

SELECT concat(ename, '(', job, ')')
as ename_job       #用ename(job)不行
FROM mydata.emp;

输出:

RTrim()去掉右边的空格。

  • 执行算数计算
SELECT ename,sal,deptno,
sal * deptno as sal_deptno
FROM mydata.emp;

输出:

sal_deptno是新生成的一列,是sal和deptno的乘积。
算数操作符:+、-、*、/

8. 使用数据处理函数

  • 使用函数
  1. 文本处理函数
    upper()函数: 将文本转换为大写。
SELECT dname,upper(dname) as dname_upcase 
FROM mydata.dept;

输出:

常用的处理文本函数:


说明
left(code,n)函数:
SELECT dname,left(dname,5) FROM mydata.dept; 截取字段dname中从左至右5个字符
输出:

locate(substr,str)函数:
返回str中的第一次出现子串substr的位置,若没有substr则返回0
locate(substr,str,pos)函数:
返回str中的第一次出现子串substr的位置,起始位置为pos

SELECT dname,locate('e',dname) 
FROM mydata.dept;

输出:

SELECT dname,locate('e',dname,5) 
FROM mydata.dept;

输出:

right(code,n)函数:
返回串从右至左的n个字符SELECT dname,right(dname,3) FROM mydata.dept;
输出:

soundex()函数:
将任何文本串转换为描述其语音表示的字母数字模式,能够对文本发音进行比较而不是字母比较。
如:名字Y.Lee是输入错误,正确的是Y.Lie,读音相似。找出该行。

SELECT *
FROM mydata.emp
where soundex(ename)=soundex('Y.Lie');

输出:

Y.Lee和Y.Lie的soundex值匹配。

  1. 日期和时间处理函数
    日期格式必须是yyyymmdd。
    常用的日期和时间处理函数:
SELECT * 
FROM mydata.emp
where date(hiredate)='1980-12-17';

输出:

SELECT * 
FROM mydata.emp
where month(hiredate)='12';     #返回12月出生的人

输出:

SELECT * 
FROM mydata.emp
where month(hiredate) between '06' and '11';    #返回6月到11月之间出生的人

输出:

  1. 数值处理函数

常用数值处理函数:

8. 汇总数据

  • 聚集函数: 运行在行组上,计算和返回单个值的函数
  1. AVG()
    对表中行数计数并计算特定的列值之和,求得均值。可以对整列,可以对部分列。
SELECT avg(sal) as asl_avg    #计算并返回职位为clerk的平均工资
FROM mydata.emp
where job='clerk';

输出:

  1. COUNT()
    (i)count(*)对表的总行数计数,不管行中值是否为null值
SELECT count(*) as num_emp
FROM mydata.emp;

输出:

(ii)count(column)对特定列中有值而非null值的行计数

SELECT count(comm) as num_comm
FROM mydata.emp;

输出:

列comm中有有效值的只有三行

  1. MAX()
    返回指定列中的最大值。
SELECT max(sal) as sal_max       #返回sal中的最大值
FROM mydata.emp;

输出:

  1. MIN()
    返回指定列的最小值。
SELECT min(sal) as sal_min
FROM mydata.emp;

输出:

  1. SUM()
    返回指定列的总计。
SELECT sum(sal) as sal_sum1      #返回经理们的工资合计
FROM mydata.emp
where job='manager';

输出:

  • 聚集不同的值
  • 组合聚集函数:
SELECT sum(sal) as sal_sum1,
min(sal) as sal_min,
max(sal) as sal_max
FROM mydata.emp
where job='manager';

输出:

这些在sas、Python等中打印统计量就行一步到位,不用一个个写。

9. 分组数据

select count(*)
from emp
where job='manager';

输出:

如例,返回了职位为经理的个数,目前只是用where语句限定。如果要返回每个职位值的个数等等……

  • GROUP BY创建分组:
    group by必须出现在where子句之后,order by子句之前。
select job,count(job) as job_count
from emp
group by job;

输出:

  • HAVING子句过滤分组
    having子句支持所有where操作符,与where唯一的差别是where过滤行,having过滤组。
    where在分组前过滤,having在分组后过滤。
select job,count(*) as job_count
from emp
group by job
having count(*) >= 2;

输出:

  • 分组与排序
    不要混淆了order by和group by,分组了之后不一定排序了,往往还要排序。
select job,count(*) as job_count
from emp
group by job
having count(*) >= 2
order by job_count asc;

输出:

10. 使用子查询

在这之前,先创建和导入与教材中相同的表和数据:http://www.forta.com/books/0672327120/
下载压缩包,里面有两个sql文件,分别是创建表和插入数据的代码。过程如下(我用的是workbench 8.0 CE):

  1. 为了与其他数据区分,重新创建了一个example_learn的数据库:

    在空白处右键,选中creat schema,然后创建(这里我已经建好了)。

  2. 选中数据库example_learn,变黑了说明选中了
    因为文件里创建表和插入数据的sql语句没有指定放到哪个库里,所以方便我想放哪库就放哪库。接下来把创建表的sql语句导入并运行:

点击左上角第二个sql选项,选中电脑里刚刚下载的sql脚本文件,分别打开create.sql和populate.sql并运行代码,这样表就建好了,数据也插入了。

铛铛铛铛,6个表齐了。

接下来正式学子查询

  • 子查询:嵌套在其他查询中的查询
    例如:现在需要列出订购物品TNT2的客户信息,检索步骤如下:
    (i)先检索订购物品为TNT2的订单编号
SELECT * 
FROM orderitems
where prod_id = 'tnt2';


(ii)然后用检索出来的订单编号检索客户编号

select *
from orders
where order_num='20005' or order_num= '20007';


(iii)最后根据检索的客户编号检索出客户信息

select *
from customers
where cust_id = '10001' or cust_id = '10004';


这三条select查询可以用子查询来进行:

select *
from customers
where cust_id in (select cust_id
                  from orders
                  where order_num in (select order_num
                                      from orderitems
                                      where prod_id ='TNT2'));

输出:

就是把每一条select中where里的确切值用一个select语句表示。
实际中不能嵌套太多子查询。

  • 作为计算字段使用子查询
    例如,现在需要显示customers表中每个客户的订单总数,
    (i)表customers中有cust_id和cust_name

    (ii)表orders中有cust_id和order_num
select cust_name,cust_contact,(select count(order_num)
                               from orders
                               group by cust_id) as orders_num
from customers;

这里有两处错误:1.group by分组的变量一定要输出,也就是select里要有select cust_id
2.子查询里尽管将订单数计总并按id分组,但是没有东西与cust_name联结,这是两个表,不是一个表,正确代码:

select cust_name,cust_contact,(select count(order_num)
                               from orders
                               where orders.cust_id=customers.cust_id) as orders_num
from customers;

输出:

写的时候又犯了个错,直接where .cust_id=cust_name了,两个表连接要用表名.列名,而且id跟name怎么匹配。

11. 联结表

  • 联结(join):在一条select语句中关联表
    外键: 某个表中的一列,包含另一个表的主键
    主键: 每个表唯一的标识
    vend_id是vendors表的主键,是products的外键

  • 创建联结
    如,检索供应商名称、产品名称、产品价格,并分别按供应商和产品名排序。
select vend_name,prod_name,prod_price
from vendors, products
where vendors.vend_id=products.vend_id
order by vend_name,prod_name;

输出:

如果没有where子句,第一个表的每一行与第二个表的每一行配对,不论是否有逻辑。 于是有了笛卡尔积:由没有联结条件的表关系返回的结果。返回的行数是第一个表的行数乘以第二个表的行数。

select vend_name,prod_name,prod_price
from vendors, products
-- where vendors.vend_id=products.vend_id
order by vend_name,prod_name;


这显然不是我们要的结果,因为有些产品根本不是某些供应商的。

  • 内部联结
    两个表之间以inner join指定。联结条件用on而不是where。
select vend_name,prod_name,prod_price
from vendors inner join products
on vendors.vend_id=products.vend_id
order by vend_name,prod_name;

结果一样

  • 联结多个表
    如,联结表vendors,products,orderitems,检索prod_name,vend_name,prod_price,quantity。将表两两联结。
select prod_name,vend_name,prod_price,quantity
from vendors,products,orderitems
where products.vend_id=vendors.vend_id
and products.prod_id=orderitems.prod_id
and order_num='20005'
order by quantity;

输出:

用联结表的方法做上一章TNT2订单的顾客信息:

SELECT cust_name,cust_contact
from customers,orderitems,orders
where orders.order_num=orderitems.order_num 
and orders.cust_id=customers.cust_id and prod_id='TNT2';

输出:

12.创建高级联结


图表来自https://www.runoob.com/sql/sql-join.html
总结:

  • 内部联结(inner join): 将表之间共有的列的行返回。
select orders.cust_id,orders.order_num,orderitems.item_price
from orderitems inner join orders
on orderitems.order_num=orders.order_num
order by orders.cust_id;

输出:

  • 外部联结(outer join)
    left outer join: 即使右边没有匹配,也从左边的表返回所有行,
select customers.cust_id,orders.order_num
from customers left outer join orders
on customers.cust_id=orders.cust_id;


right outer join: 即使左表没有匹配,也从右表返回所有行

select customers.cust_id,orders.order_num
from orders right outer join customers
on customers.cust_id=orders.cust_id;

  • 自联结
    例,假如products表中id为dtntr的物品有问题,那么就想知道该供应商生产的其他物品是否有问题,就要找出该供应商生产的其他物品。
    法一:用子查询
select prod_id,prod_name
from products
where vend_id=(select vend_id
                from products
                where prod_id='dtntr');

输出:

法二:自联结。用表别名获得两个表

select p1.prod_id,p1.prod_name
from products as p1,products as p2
where p1.vend_id=p2.vend_id and p2.prod_id='dtntr';

输出:

联结比子查询快。

  • 使用带聚集函数的联结
    例如,检索所有客户名及每个客户的下单数
select c.cust_name,c.cust_id,count(o.order_num) as num_order
from customers as c inner join orders as o   #inner join=join
on c.cust_id=o.cust_id
group by c.cust_id;

输出:

做一点修改,将还没下单的也放进去:

select c.cust_name,c.cust_id,count(o.order_num) as num_order
from customers as c left join orders as o
on c.cust_id=o.cust_id
group by c.cust_id;

输出:

13. 组合查询

  • union: 给出多条select语句,将它们的结果组合成单个数据集。
    在各条语句之间放上关键字union。
    例如,检索出一个产品列表,使得产品价格小于等于5,且包括供应商1001和1002提供的。如果只用where,写两次:
select vend_id,prod_id,prod_price
from products
where prod_price <= '5';

select vend_id,prod_id,prod_price
from products
where vend_id='1001' or vend_id='1002';


第一条先找出价格小于等于5的,第二条找出1001和1002供应商,这是两个表。

用组合查询合成一个数据集:

select vend_id,prod_id,prod_price
from products
where prod_price <= '5'
union
select vend_id,prod_id,prod_price
from products
where vend_id='1001' or vend_id='1002'
order by vend_id;

输出:

用where合成一个表也可以:

select vend_id,prod_id,prod_price
from products
where prod_price <= '5' or vend_id in(1001,1002);

输出结果一样,怎么感觉比组合查询还简单些……
但是,union可以跨表:

select vend_id
from products
union all
select vend_id
from vendors;

将表products和vendors里的供应商id组合到一张表且不删去重复的行。where就不行。
不过union好像不可以跨数据库。

where+union也可以

  1. 包含或取消重复的行
    在使用union时重复的行被自动去除。使用union all,可以取消去除重复的行,如上例在第一种用where的方法下,两个表供9条,重复的行是1002 FU1 3.42,现在不去除重复的行:
select vend_id,prod_id,prod_price
from products
where prod_price <= '5' 
union all
select vend_id,prod_id,prod_price
from products
where vend_id in (1001,1002);

输出:

  1. 对组合查询结果排序
    在用union组合查询时,只能有一条order by语句,且必须放在最后一条select语句之后,
select vend_id,prod_id,prod_price
from products
where prod_price <= '5' 
union all
select vend_id,prod_id,prod_price
from products
where vend_id in (1001,1002)
order by vend_id,prod_id;

输出:

14. 全文本搜索

15. 插入数据

select(最常用,学习的重心)、insert、update、delete

  • insert插入数据(行): insert,values子句
  1. 插入完整的行
    insert用来插入行到数据库中。要求指定表名和被插入到新行的值。
    例如,向customers表中插入数据:
insert into customers 
values(null,
	   'Pep E. LaPew',
       '100 Main Street',
       'Los Angeles',
       'CA',
       '90046',
       'USA',
       null,
       null);

没有输出。但是检索customers表可以看见,增加了一行:

注意, 第一列cust_id插入的数据是null,这是因为它是主键,自动增量。
这种方式语法简单但不安全,因为无法保证下一次表的结构变动后插入的数据各个列还保持相应的次序,因此常用以下更安全的方式:

insert into customers(
       cust_id,
       cust_name,
       cust_address,
       cust_city,
       cust_state,
       cust_zip,
       cust_country,
       cust_contact,
       cust_email)
values(null,
	   'Pep E. LaPew',
       '100 Main Street',
       'Los Angeles',
       'CA',
       '90046',
       'USA',
       null,
       null);

依然没有输出,但可以刷新后看表:

cust_id由于是自动增量,插入数据时其实可以省略。

省略列: 一种情况为该列定义为允许null值(无值或空格);第二种情况是表定义给出默认值,如果不给值,表使用默认值。

  1. 插入多个行
    将不同组的数据值用逗号隔开:
insert into customers(
       cust_name,
       cust_address,
       cust_city,
       cust_state,
       cust_zip,
       cust_country)
values('Pep E. LaPew',
       '100 Main Street',
       'Los Angeles',
       'CA',
       '90046',
       'USA'),
       ('M.Martain',
       '42 Galaxy Way',
       'New York',
       'NY',
       '11213',
       'USA'
       );

依然没有输出,刷新后看表:

可以看到,这里的cust_id和末尾两个null值就没放进代码里了,方便。

  • insert into……select……: 将一个表信息复制到另一个表
    从一个表复制信息到另一个表,将一条select语句的结果插入到表中。
    新创建了一个customer_1表:

    将表customer_1中的数据复制到表customer中:
insert into customers
select *
from customers_1;


可以看到确实增加了id为10010和10011的两条。也可以只复制个别列,不用全行复制:

insert into customers (cust_name,cust_city)
select cust_name_1,cust_city_1
from customers_1;

运行后也是没有输出的,可以刷新后检索表:

可以看到尽管在customer_1中cust_id_1是10010和10011,但复制到customer后自动增加为10012和10013.且只复制了姓名和城市。

16. 更新和删除数据

  • 更新数据(行):update语句,set子句
    更新表的特定行或所有行。
    例如,客户10005现在有了电子邮件,那就需要更新数据:
update customers
set cust_email='elmer@fudd.com'
where cust_id=10005;

没有输出,刷新后检索:

更新成功,注意不要忘了where子句的使用,否则所有行的email都会被更新。
若要删去某个列值,可以更新为null值,比如10005的电子邮件删去:

update customers
set cust_email=null
where cust_id=10005;
  • 删除数据(行):delete语句,
    从表中删除特定行或所有行。
delete from customers
where cust_id=10006;

删去了客户10006,注意delete后面还有个from,from不要省略了。

delete from删除表的内容甚至所有行,但不删除表。

17. 创建和操纵表

  • 创建表:create table
  1. 表创建基础
    两种创建表的方式:使用交互式创建和管理表的工具、直接用MySQL语句
create table customers_1
(cust_id_1 int not null auto_increment,
cust_name_1 char(50) not null,
cust_address_1 char(50) null,
cust_city_1 char(50) null,
cust_state char(5) null,
cust_zip_1 char(10) null,
cust_country_1 char(50) null,
cust_contact_1 char(50) null,
cust_email_1 char(255) null,
primary key(cust_id_1)
)engine=InnoDB;

创建了新的客户表customers_1,表名不能跟已有的重复。
primary key(cust_id_1)指定主键为cust_id_1,列与列之间用逗号隔开。

  1. null值
    null,在插入数据可以不给出该列的值;not null不允许该列没有值的行。
    不要混淆null值和空格。对于null,’‘允许,因为没有值,而’ '不允许,因为空格是有效值。

  2. 主键
    主键不能允许null值;
    每行只有一个主键,但主键可以单列可以多列
    主键可多列是指可以是多列的组合,比如:primary key(order_num,order_item)
    订单号和订单物品之间一一对应,作为主键

  3. auto_increment 自动增量

  4. 指定默认值
    如果插入行时未给定值,MySQL允许使用的默认值。**默认值用create table 中的default关键字。**如:

create table customers
(
order_num int not null,
order_name char(50) not null,
quantity int not null default 1,
item_price decimal(8,2) not null default 'free'
primary key(order_num)
)engine=InnoDB;

这里列名什么的我瞎编的,主要看一下default的格式·。decimal(8,2)的最大值是9999999.99,有7个字节可用。

  1. 引擎类型
  • 更新表(列):alter table
    添加列用add子句,删除列用drop子句。
alter table vendors
add vend_phone char(50);

给供应商表vendors添加列vend_phone,表如下:

再删除列vend_phone:

alter table vendors
drop vend_phone;

  • 删除表(列):drop table

  • 重命名表:rename table customer_1 to customer --将表customer名重命名为customer_1

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值