SQL基础控制
使用CMD命令控制操作MySQL数据库
- 登录mysql
语法: mysql -h 数据库地址 -u 用户名 -p登录密码
mysql -h 127.0.0.1 -u root -p123456
- 显示所有数据库
show databases;
- 使用数据库
语法: use 数据库名
use mysql
- 显示当前数据库的所有表
show tables;
常见错误
mysql服务未启动
ERROR 2005 (HY000): Unknown MySQL server host 'locathost' (2)
到 服务 应用 搜索mysql 启动服务
sql语法错误-代码1064
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selest cust_name from customers' at line 1
解决办法
- 找到关键字 near
- 根据near后面的提示 找到语句对应的位置
- 错误会出现在位置的前面或后面
- 根据sql语法去排除错误
数据库找不到表-代码1146
1146 - Table 'yourselfsql.customerss' doesn't exist
解决办法
表名错了!!!
表找不到列-代码1054
1054 - Unknown column 'cust_names' in 'field list'
解决办法
不知道列啊!!!
使用Navicat创建数据库
数据库概念
保存有组织的数据的容器(通常是一个文件或一组文件)
数据库软件应称为数据库管理系统(或DBMS):数据库是通过DBMS创建和操纵的。
SQL分类
DDL:数据定义语言(操作数据库、表)
数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。
关键字:create、drop、alter
CRUD(Create, Read, Update, Delete),即增删改查。
DML:数据操作语言(增删改表中的数据)
数据操纵语言(Data Manipulation Language, DML)是用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句。
关键字:insert、delect、update
DQL:数据查询语言(查询表中的数据)
关键字:select、where
DCL:数据库控制语言(授权)
数据控制语言 (Data Control Language, DCL) 是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。
核心指令: grant、revoke
TCL:事务控制语言
事务控制语言 (Transaction Control Language, TCL) 用于管理数据库中的事务。这些用于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。
TCL 的核心指令是 COMMIT、ROLLBACK。
表的概念
是一种结构化的文件,可用来存储某种特定类型的数据。
表在我们程序中跟类相似,相互挂钩(实体类)
表的字段是我们类中的属性(一一对应)
表的每一行是我们类的对象
表名(table)
- 在同一个数据库下表名唯一
- 表名、字段名必须使用小写字母或数字,禁止出现数字开头禁止两个下划线中间只出现数字。
- 表名不使用复数名词
- 主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名
- 小数类型为 decimal,禁止使用 float 和 double
- 表必备三字段:id,create_time(创建时间),update_time(修改时间)
说明:
其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。create_time,update_time 的类型均为datetime 类型,如果要记录时区信息,那么类型设置为 timestamp。
列(column)
表中的一个字段。所有表都是由一个或多个列组成的。
数据类型
每个表列都有相应的数据类型,它限制(或允许)该列中存储的数据。
mysql数据类型
mysql数据类型 | ||
---|---|---|
范围(有符号) | 范围(无符号) | |
int | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) |
BIGINT(大整数) | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) |
DECIMAL (6,2)--小数值 | DECIMAL(M,D) --M(决定整数位的位数),D(决定小数位的位数) | |
DATE (时间类型) | YYYY-MM-DD 年-月-日 | |
DATETIME (时间类型) | YYYY-MM-DD HH:MM:SS 年-月-日 时:分:秒 | |
TIMESTAMP ( 时间戳) | 1970-01-01 00:00:00到现在一个毫秒数 2147483647000 | |
CHAR (10)--字符串 | 固定长度的字符串 | |
VARCHAR(10)--字符串 | 可变长度字符串 |
行(row)
- 表中的一个记录。
- 一行表示一个实体。
主键(primary key)
一列(或几列),其值能够唯一标识表中每一行。
主键不能重复
满足以下条件:
- 主键不能重复
- 每一行都必须具有一个主键值(主键列不允许空值 NULL);
- 主键列中的值不允许修改或更新;
- 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)。
SQL概念
SQL(发音为字母 S-Q-L 或 sequel)是 Structured Query Language(结构化查询语言)的缩写。SQL 是一种专门用来与数据库沟通的语言。
SELECT查询
从一个或多个表中检索信息
语法:
select 字段1[,字段2,字段3.....] from 表名
[where 条件]
[group by 分组字段]
[having 分组条件]
[order by 字段 排序规则]
[limit 起始位置,显示行数]
MySQL中分号(;)的作用:作为一句完整的SQL语句的结束。
SQL语句和大小写:SQL不区分大小写,但表名,列名以及值可能不同
表名,列名取名采用小写的字母或数字
通配符():查询所有列的信息 select from 表名;
DISTINCT 关键字: 保留不同的值(去重)
SELECT vend_id FROM Products;
SELECT DISTINCT vend_id FROM Products;
位置:使用 DISTINCT 关键字,它必须直接放在列名的前面。
LIMIT限制结果(控制显示行数)
在mysql使用的是LIMIT
语法:
LIMIT 第几行,显示几条--LIMIT 5,10
第几行从0行开始算起
limit的分页应用
显示第一页一页显示5条 LIMIT 0,5;
SELECT * FROM orderitems LIMIT 0,5;
显示第二页一页显示5条 LIMIT 5,5;
SELECT * FROM orderitems LIMIT 5,5;
显示第三页一页显示5条 LIMIT 10,5;
SELECT * FROM orderitems LIMIT 10,5;
显示第n页一页显示5条 LIMIT (n-1)*5,5;
SELECT FROM orderitems LIMIT (n-1)5,5;
分页计算公式
分页显示limit数值计算公式
LIMIT (第几页-1)*显示条数,显示条数;
注释
-- 这是注释 注意:--后面有个空格
# 这也是注释
/**/ 这是多行注释以/*开头 */结尾
ORDER BY(排序)
概念:ORDER BY 子句取一个或多个列的名字,对此输出进行排序
ORDER BY 通过非选择列进行排序(可以使用不是查询列的其它列来进行排序)示例代码如下。
SELECT prod_name from products
ORDER BY prod_desc
多列排序
用","号区分多列
●按照字段先后顺序进行排序
示例代码
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price,prod_id;
指定排序方向
ORDER BY 默认使用ASC升序排序(从小到大)
DESC 降序排序(从大到小)
多列排序每列需要降序,每列都加需要加关键字.
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;
WHERE 子句(条件检索)
指定搜索条件提取表数据的子集
where子句的操作符
使用示例:列出所有价格小于 10 美元的产品
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;
何时使用引号
如果将值与字符串类型的列进行比较,就需要限定引号。
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';
如果是列与列进行比较,不需要引号。
BETWEEN范围值检查
BETWEEN必须指定最低值和最高值,匹配范围中所有的值,包括指定的最低值和最高值.
示例:检索价格在 5 美元和 10 美元之间的所有产品
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
#与 WHERE prod_price >=5 and prod_price <=10 是一样的
空值检查
NULL 无值(no value),它与字段包含 0、空字符串或仅仅包含空格不同。
- 使用 IS NULL 去判断是否有空值
- 使用 IS NOT NULL 去排除空值
示例代码 检索cust_email 列包含的 NULL 值
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;
检索数据为null或空字符的值
SELECT vend_id,vend_state
FROM vendors
WHERE vend_state IS NULL or vend_state='';
把某个值修改成null值
UPDATE vendors SET vend_state = null WHERE vend_id = 'FNG01'
AND操作符 (和)
AND作用:同时满足多个条件
检索由供应商 DLL01 制造且价格小于等于 4美元的所有产品 的名称和价格。
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
OR操作符 (或)
or作用:满足其中一个条件
SELECT vend_id,prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
IN 操作符 (区间)
in作用:指定条件范围,范围中的每个条件都可以进行匹配。
SELECT vend_id,prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRS01')
NOT 操作符 (取反)
not作用: WHERE 子句中用来否定其后条件的关键字
检索除vend_id为DLL01之外的结果
示例代码:
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
排除 DLL01 和 BRS01
SELECT vend_id,prod_name, prod_price
FROM Products
WHERE vend_id not IN ('DLL01','BRS01')
排除 3块到10块
SELECT vend_id,prod_name, prod_price
FROM Products
WHERE prod_price not BETWEEN 3 and 10
EXISTS 关键字
EXISTS 概念:判断是否有存在的值
在建表时使用:判断改表是否存在,若存在返回true,不存在返回false
建表:
# 若存在该表则删除表,再创建新表
DROP TABLE IF EXISTS `products`
CREATE TABLE `products`(
# 省略其字段...
);
在查询where后使用:判断子查询是否有值,若有值返回true,没值返回false
查询:
# 判断子查询有没有值 没有值直接返回空
select * from products where exists(select id from products where id = 9);
not exists:当子查询和主查询有关联条件时,相当于从主查询中去掉子查询的数据 与not in结果一致
select * from test c where not exists
(select 1 from test t where t.id= '1' and t.id = c.id)
Like 模糊查询
通配符 _ %
_ 匹配一个字符
- 匹配某年某班
_年_班
- 匹配姓李的三个字人名
李__
- 匹配姓丁的二个字人名
丁_
匹配两个字符:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear';
% 匹配任意多个字符
匹配Fish开头的字符串:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
- 匹配2022年7月份生日的人
2022-7-% 2022-07-__
- 匹配138开头的电话号码
138%
- 模糊查询某个字段是否包含text值
%text%
- not like 不像啥嘛
- %不会匹配null值