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关键字来设置默认值
  • 应用默认值
    要使用默认值的位置直接使用default
    insert 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 开始查询的值,每页的数据量;

注意事项:

  1. limit后开始查询的值不能写运算,必须直接写结果
  2. 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;