主键(primary key) 唯一标识表中每行的这个列(或这组列)称为主键
表中的任何列都可以作为主键,只要它满足以下条件:
任意两行都不具有相同的主键值; 每个行都必须具有一个主键值(主键列不允许为NULL) 外键(foreign key) 外键为某个表(子表)中的一列,它是另一个表(父表)的主键值,建立起两个表之间的关系。
MySQL基本使用
第3章 使用MySQL
create database crashcourse default character set utf8mb4 collate utf8mb4_general_ci; # 创建指定的数据库(指定字符集和排序规则) use crashcourse; # 指定使用的数据库 show databases; # 了解数据库,返回数据库列表 show tables; # 返回数据库内表的列表 show columns from customers; # 查看customers表中的所有列设置 describe customers; # 同上,查看customers表中的所有列设置 show full columns from customers; # 可查看所有字段的排序规则
show status; # 用于显示广泛的服务器状态信息 show create database crashcourse; #查看创建数据库crashcourse的mysql代码语句(包括字符集和排序规则等信息) show create table productnotes; #查看创建表productnotes表的mysql代码语句 show grants; #显示授予用户(所有用户或特定用户)的安全权限
show errors; # 显示服务器错误内容
show warnings; #显示服务器警告内容
alter table products default charset utf8mb4 collate utf8mb4_general_ci; # 修改表的默认字符集和排序规则 ubuntu20.04修改数据库默认字符集和排序规则 配置文件位于/etc/mysql/mysql.conf.d/mysqld.cnf
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 修改内容如下:
[mysql] default-character-set=utf8mb4 [mysqld] default-storage-engine=InnoDB character-set-server=utf8mb4 character-set-filesystem=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4 重启mysql服务
systemctl restart mysql.service distinct关键字 对查询的结果去重,注意不能部分使用DISTINCT,DISTINCT关键字应用于所有列而不仅是前置它的列
select distinct vend_id from products; # 使用distinct关键字去重,distinc只能放在列名的前面 select distinct vend_id,prod_price from products; # distinct不仅对前置它的列vend_id起作用,同时也作用于prod_price,两列值有重复,才去重 limt关键字 限制返回结果的数量和查询的范围,行数下标从0开始
select prod_name from products limit 5; #从第0行开始,返回前5行 select prod_name from products limit 5,5; #从第5行开始,检索5行 order by排序 默认为ASC升序,降序可以使用DESC
按多列排序时,按列名的顺序进行,当第一列相同时,按第二列的顺序排序,依次类推
order by和limit结合可以找出最高和最低的几个数据
按单列排序
select prod_name from products order by prod_name; # 以字母顺序排序prod_name列 select prod_name from products order by prod_id; # 使用非检索的列排序数据也是合法的,如使用prod_id顺序排列prod_name
按多列排序
select prod_id, prod_price,prod_name from products order by prod_price, prod_name; #先按价格,再按产品名排序
降序排列 desc,desc只作用于直接位于其前面的列名
select prod_id, prod_price,prod_name from products order by prod_price desc; # 按价格降序排列 select prod_id, prod_price,prod_name from products order by prod_price desc, prod_name; #先按价格降序排列,再按产品名升序排列 select prod_id, prod_price,prod_name from products order by prod_price desc, prod_name desc; #先按价格降序排列,再按产品名降序排列
使用order by 和limit组合,找出一列中最高或最低的值
顺序:order by子句必须在from子句之后,limit子句必须在order by之后
select prod_price from products order by prod_price desc limit 1; # 最高值 select prod_price from products order by prod_price limit 1; # 最低值 where语句 表1.where语句操作符 运算符 说明 = 等于 <> 不等于 != 不等于 < 小于 <= 小于等于
大于 = 大于等于 between a and b 在[a,b]内 and 逻辑与 or 逻辑或 not 逻辑非 in 在集合中 使用where语句对查询数据进行过滤
select prod_name,prod_price from products where prod_price = 2.50; # 价格等于2.50的产品名、产品价格 select prod_name,prod_price from products where prod_name = "fuses"; # 默认不区分大小写 select prod_name,prod_price from products where prod_price < 10; # 价格小于10的产品名、产品价格 select prod_name,prod_price from products where prod_price <=10; # 价格小于等于10的产品名、产品价格
不匹配检查
select vend_id,prod_name from products where vend_id <> 1003; # 检索不是由1003供应商制造的所有产品 select vend_id,prod_name from products where vend_id != 1003; # 同上,检索不是由1003供应商制造的所有产品
范围值检索,between A and B,包括A和B
select prod_name,prod_price from products where prod_price between 5 and 10; # 价格 大于等于5,小于等于10 的产品名、产品价格
空值检查
select prod_name from products where prod_price is null; # 返回prod_price为空值null的prod_name,无对应数据 select cust_id from customers where cust_email is null; # 检索cust_email为空值时的cust_id select cust_id from customers where cust_email is not null; # 检索cust_email不为空值时的cust_id
错误写法
select prod_name from products where prod_price != null; # 使用!=来过滤不为null的数据
and 或 or 操作符连接多个where子句
AND 用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行
select vend_id,prod_price,prod_name from products where vend_id = 1003 and prod_price <= 10; #检索由供应商1003制造且价格小于等于10美元的产品信息
OR操作符,指示MySQL检索匹配任一条件的行
select vend_id,prod_name,prod_price from products where vend_id = 1002 or vend_id = 1003; # 检索由任一个指定供应商制造的所有产品的产品信息
and 和 or结合,and优先计算
优先计算and,查找vend_id为1003且价格>=10的产品,或者vend_id为1002的产品,不管价格如何
select prod_name,prod_price from products where vend_id = 1002 or vend_id = 1003 and prod_price >= 10;
使用圆括号明确运算顺序:查找vend_id为1002或1003,且价格>=10的产品
select prod_name,prod_price from products where (vend_id = 1002 or vend_id = 1003) and prod_price >= 10;
IN操作符
IN操作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号
select prod_name,prod_price from products where vend_id in (1002,1003) order by prod_name;
NOT操作符
列出1002和1003之外的供应商生产的产品
select prod_name,prod_price from products where vend_id not in (1002,1003) order by prod_name;
Mysql支持not对in,between,exsits子句取反
列出价格小于3或大于10的产品
select prod_name,prod_price from products where prod_price not between 3 and 10; like模糊查询 通配符(wildcard): 用来匹配值的一部分的特殊字符
搜索模式(search pattern): 由字面值、通配符或两者组合构成的搜索条件
注意 不使用通配符时相当于相等查询 select prod_id,prod_name from products where prod_name like "JetPack 1000";
select prod_id,prod_name from products where prod_name = "JetPack 1000"; mysql的搜索模式匹配默认不区分大小写
常用通配符:
%:匹配任意字符出现任意次数(包括0) _: 匹配单个任意字符
找到所有产品名以jet开头的产品
select prod_id,prod_name from products where prod_name like "jet%";
通配符可以在搜索模式任意位置使用
比如下方出现在头尾两处 ,匹配任意位置包含文本anvil的值
select prod_id,prod_name from products where prod_name like "%anvil%";
比如下方出现在搜索模式的中间,匹配所有以s开头e结尾的值
select prod_name from products where prod_name like "s%e";
下划线_通配符 :只能匹配一个任意字符,不能多不能少
select prod_id,prod_name from products where prod_name like "_ ton anvil";
技巧:不要过度使用通配符,把通配符至于搜索模式的开始处,搜索起来是最慢的!
正则匹配 MySQL中正则表达式特殊字符转义使用,一般的正则表达式中只使用一个
表2.特殊字符转义 元字符 说明 \ 字符 n 换行 f 换页 r 回车 t 制表 v 纵向制表 表3.字符类 类 说明 [:alnum:] 任意字母和数字(同[a-zA-Z0-9]) [:alpha:] 任意字母(同[a-zA-Z]) [:blank:] 空格和制表(同[t]) [:cntrl:] ASCII控制字符(ASCII0到31和127) [:digit:] 任意数字(同[0-9]) [:print:] 任意可打印字符 [:graph:] 与[:print:]相同,但不包括空格 [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符 [:space:] 包括空格在内的任意空白字符(同[fnrtv]) [:lower:] 任意小写字母(同[a-z]) [:upper:] 任意大写字母(同[A-Z]) [:xdigit:] 任意十六进制数字(同[a-fA-FO-9]) -- 基本字符匹配
查找产品名中含有'1000'的所有行
select prod_name from products where prod_name regexp "1000";
.在正则表达式中,匹配任意一个字符
select prod_name from products where prod_name regexp ".000";
like 通配符
select prod_name from products where prod_name like "00" order by prod_name; # 返回结果'JetPack 1000' select prod_name from products where prod_name like "