SQL 语句
文章目录
- SQL 语句
- 常用的管理命令
- 数据库命令
- SQL命令
- 创建数据表
- 插入数据
- 查询所有列的数据
- 删除数据
- 修改数据
- 解决MySQL中文乱码
- 一、列类型
- 数字型
- 日期时间型
- 字符串型
- 二、列约束
- 1.主键约束
- 2.非空约束
- 3.唯一约束
- 自增列
- 4.默认值约束
- 5.检查约束
- 6.外键约束
- 三、简单查询
- 1.查询特定的列
- 2.查询所有的列
- 3.给列起别名 as
- 4.显示不同的记录
- 5.查询时执行计算
- 6.查询结果排序 asc / desc
- 7.条件查询 where
- 8.MySQL中可以用到的运算符
- 9.模糊条件查询
- 10.分页查询
- 四、复杂查询
- 1.聚合查询/分组查询
- 1.聚合函数:count() 统计数量
- 2.聚合函数:max() 最大值
- 3.聚合函数:min()最小值
- 4.聚合函数:avg() 平均数
- 5.聚合函数:sum() 求和
- 分组查询
- 2.子查询
- 3.多表查询
- 内连接
- 外连接
- 自连接
前端程序员需要了解简单的SQL 语句就可以,推荐前端程序员来观看
常用的管理命令
在服务器端
- quit; 退出服务器的连接
- show databases; 显示所有的数据库
- use 数据库名称; 进入指定的数据库
- show tables; 显示当前数据库中所有的数据表
- desc 数据表名称; 描述一个数据表结构
数据库命令
- (1)如果数据库存在就删除
drop database if exists 数据库名称;
- (2)创建新的数据库
create database 数据库名称;
- (3)进入数据库
use 数据库名称;
*(4)查看文件夹下所有的数据表show tables
- (4)创建数据表
SQL命令
创建数据表
create table 数据表名称(
列名称 列类型,
…
);
插入数据
insert into 数据表名称 values(一组值,…);
数据表中有多少个列,就提供多少个值。
查询所有列的数据
select * from 数据表名称;
删除数据
delete from 数据表名称 where 条件;
修改数据
update 数据表名称 set 列名称=值, … where 条件;
解决MySQL中文乱码
- 确保脚本文件的编码为UTF-8
- 设置客户端连接服务器端的编码为UTF-8
set names utf8;
- 设置服务器创建数据库,存储字符的编码为UTF-8
create database xz charset=utf8;
一、列类型
在创建数据表的时候,指定的列所能存储的数据类型
create table news(
nid 列类型
);
数字型
- tinyint 微整型,占1个字节,范围-128~127
- smallint 小整型,占2个字节,范围-32768~32767
- int 整型,占4个字节,范围-2147483648~2147483647
- bigint 大整型,占8个字节,范围
- decimal(M,D) 定点小数,小数点不会发生变化,M代表总的有效位数,D代表小数点后的有效位数。
- boolean 布尔型,只有两个值,分别是true和false,通常用于存储只有两个值的数据,例如:是否在线、性别、是否已婚… true和false是关键字,不能加引号
注意:MySQL中没有真正的布尔型,会转为tinyint,true转为1,false转为0
日期时间型
- date 日期型 格式’2022-10-20’
- time 时间型 格式’12:19:30’
- datetime 日期时间型 格式’2022-10-20 14:29:30’
字符串型
- varchar(M) 变长字符串
- char(M) 定长字符串
- text(M) 大型变成字符串
二、列约束
create table laptop(
lid int 列约束
);
1.主键约束
primary key :声明了主键约束的列,不能插入重复的值,一个表中只能有一个主键约束,通常加在编号列,会加快数据的查询速度。
2.非空约束
not null:声明了非空约束的列,不允许插入null
3.唯一约束
unique:声明了唯一约束的列,禁止插入重复的值,允许插入null,甚至多个null
主键约束 = 唯一约束 + 非空约束
自增列
auto_increment:自动增长,声明了自增列,在插入值的时候,只需要赋值为null,就会获取最大值然后加1插入。
注意:自增列必须添加在整数形式的主键列上
4.默认值约束
在插入数据时候,不提供值的位置会使用默认值
- 设置默认值
使用default关键字来设置默认值 - 应用默认值
要使用默认值的位置直接使用defaultinsert into 数据表名称 values(1, default,...);
给特定的列提供值,未出现的列会自动使用默认值insert into 数据表名称(列1, 列2) values(值1, 值2);
5.检查约束
check:用户可以根据指定约束条件进行验证
create table student(
score tinyint check(score>=0 && score<=100)
);
MySQL不支持检查约束,后期由JS来完成验证
6.外键约束
声明了外键约束,插入的值必须在另一个表的组件列中出现过;目的是为了让两个表关联起来。
外键列的类型和对应的另一个表主键列的类型要保持一致。
外键约束允许插入null。foreign key(外键列) references 另一个表(主键列)
三、简单查询
1.查询特定的列
-- 示例:查询出所有员工的编号和姓名
select eid,ename from emp;
2.查询所有的列
select * from emp;
select eid,ename,sex,birthday,salary,deptid from emp;
3.给列起别名 as
通过as关键字来设置别名,as关键字可以省略
as 或者 空格隔开 再写别名
-- 示例:查询出所有员工的编号和姓名,使用别名
select eid as biaohao,ename as xingming from emp;
4.显示不同的记录
-- 示例:查询出所有员工的性别有哪些(相同性别只显示一个)
select distinct sex from emp;
5.查询时执行计算
-- 示例:计算出2+3+4*8*2.45
select 2+3+4*8*2.45;
6.查询结果排序 asc / desc
如果按照字符串排序,按照首个字符的编码来排列的。
不加排序规则,默认是按照升序排列
asc -> ascendant 升序的
desc -> describe 描述
desc -> descendant 降序的
-- 示例:查询出所有的部门,结果按照编号升序排列
select * from dept order by did asc;
-- 示例:查询出所有的部门,结果按照编号降序排列
select * from dept order by did desc;
7.条件查询 where
-- 示例:查询出编号为5的员工
select * from emp where eid=5;
-- 练习:查询出工资高于8000的员工
select * from emp where salary>8000;
8.MySQL中可以用到的运算符
- 比较运算符:> < >= <= = !=
-
is null
/is not null
找某一列的值为null,或者不为null - && 并且 and
- || 或者 or
- between (小值)and (大值)
- in() 满足等于其中一个值
- not in 满足不等于其中任意一个值
9.模糊条件查询
-- 示例:查询出姓名含有字母e的员工
select * from emp where ename like '%e%';
-- 练习:查询出姓名中以e结尾的员工
select * from emp where ename like '%e';
-- 练习:查询出姓名中倒数第二个为e的员工
select * from emp where ename like '%e_';
- % 匹配的符号,匹配任意个字符 >= 0
- _ 匹配任意一个字符 =1
注意事项:以上两个匹配的符号必须结合link关键字使用
10.分页查询
查询的结果中有太多数据,一次显示不完全可以做成分页显示。
需要已知条件:当前的页码、每页的数据量
每页开始查询的值 = (当前的页码 - 1) * 每页的数据量
语法:
select * from emp limit 开始查询的值,每页的数据量;
注意事项:
- limit后开始查询的值不能写运算,必须直接写结果
- limit后开始查询的值和每一页的数据量必须是数字,不能加引号
四、复杂查询
1.聚合查询/分组查询
语法:select 聚合函数(字段列表) from 表名;
1.聚合函数:count() 统计数量
-- 示例:查询出所有员工的数量
select count(*) from emp;
2.聚合函数:max() 最大值
-- 练习:查询出20号部门的最高工资
select max(salary) from emp where deptid = 20;
3.聚合函数:min()最小值
-- 练习:查询出年龄最大的男员工的生日
select min(birthday) from emp where sex = 1;
4.聚合函数:avg() 平均数
-- 练习:查询出年龄最大的男员工的生日
select min(birthday) from emp where sex = 1;
5.聚合函数:sum() 求和
-- 练习:查询出所有女员工的工资总和
select sum(salary) from emp where sex = 0;
分组查询
语法:select 字段列表 from 表名 [where条件] group by 分组字段名;
-- 示例:查询男女员工的数量、工资总和
select count(*),sum(salary),sex from emp group by sex;
2.子查询
是多个SQL命令的组合,把一个查询结果作为另一个条件使用。
-- 示例:查询出高于平均工资的员工有哪些
-- 步骤1:查询出平均工资值 11582.352941
select avg(salary) from emp;
-- 步骤2:查询高于平均值的员工
select * from emp where salary>11582.352941;
-- 综合:
select * from emp where salary>(select avg(salary) from emp);
3.多表查询
查询的列分别在多个表中
内连接
语法:select 字段列表 from 表1 [inner] join 表2 on 连接条件;
-- 查询每一个员工的姓名及关联的部门的名称
select emp.name, dept.name from emp inner join dept on emp.dept_id = dept.id;
外连接
语法:左外连接 select 字段列表 from 表1 left [outer] join 表2 on 条件;
右外连接 select 字段列表 from 表1 right [outer] join 表2 on 条件;
自连接
语法select 字段列表 from 表a 别名a join 表a 别名b on 条件;
-- 查询员工及其所属领导的名字
-- 自连接可以看成两张一样的表进行连接查询
select a.name, b.name from emp a join emp b on a.managerid=b.id;