SQL基础

这篇博客介绍了SQL的基础知识,包括命令如Mysqld安装、查询操作如普通查询、条件查询、别名、投影、排序、分页、多表查询、聚合查询、分组聚合和连接查询。还讲解了CRUD操作、主键、外键和索引的概念及其在数据库中的应用。

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

1. 命令

  1. Mysqld install
  2. Mysqld initialize
  3. Net start mysql
  4. Alter user ‘root’@’loacalhost’ identified by ‘root’
  5. Mysql -u root -p
  6. Show databases
  7. Use test
  8. Show tables
  9. Exit
  10. Mysql -h 192.168.43.161 -u root -p
  11. 127.0.0.1:3306
    在这里插入图片描述
    在这里插入图片描述

2. 查询

  1. 普通查询:(select * from students)
  2. 条件查询:(where…)
  3. 别名:(name namealias)
  4. 投影查询:(id,name,score)
  5. 排序:(order by)、desc(降序)、asc(升序)、默认为按主键升序、order by score desc,gender(当score一样时,按照gender升序排)
  6. 分页:(limit 3 offset 0)、对查询结果分页每页显示最多3条、从0开始显示3条(第一页limit 3 offset 0)、从3开始显示3条(第二页limit 3 offset 3)
    在这里插入图片描述
Select id,name namealias,score 
from students 
where score>80 and gender=M’ 
order by score desc
  1. 多表查询:select * <表名1> <别名1>, <表名2> <别名2>;结果集的列数是students表和classes表的列数之和,行数是students表和classes表的行数之积。上述查询的结果集有两列id和两列name,可以利用投影查询的“设置列的别名”来给两个表各自的id和name列起别名表名.列名,还允许给表设置一个别名
Select 
students.id sid,students.name name,students.score,classes.id cid,classes.name cname 
From students,classes
Select 
S.id sid,s.name name,s.score,c.id cid,c.name cname
From students s,classes c
Where s.score>80 and c.id=1
  1. 聚合查询:对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。
    COUNT()表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT()。
    通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果。
    COUNT(*)和COUNT(id)实际上是一样的效果。
    如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL.
Select count(*) from students
Select count(*) num from students
Select avg(score) average from students where gender =M

在这里插入图片描述
在这里插入图片描述

  1. 分组聚合:对于聚合查询,SQL还提供了“分组聚合”的功能。
    执行这个查询,COUNT()的结果不再是一个,而是3个,这是因为,GROUP BY子句指定了按class_id分组,因此,执行该SELECT语句时,会把class_id相同的列先分组,再分别计算,因此,得到了3行结果。
    只有class_id都相同,name是不同的,SQL引擎不能把多个name的值放入一行记录中。因此,聚合查询的列中,只能放入分组的列。
Select class_id,count(*) num,gender from students group by class_id,gender
  1. 连接查询:连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。
    选出students表的所有学生信息,且结果集同时包含所在班级的名称,上面的结果集只有class_id列,缺少对应班级的name列。
Select s.id,s.name,s.score,s.gender,s.class_id,c.class_name from students s inner join classes c on s.class_id=c.id
Inner join、left outer join、right outer join、full outer join

在这里插入图片描述

  1. CRUD(create retrieve update delete)增删改查
    注意到我们并没有列出id字段,也没有列出id字段对应的值,这是因为id字段是一个自增主键,它的值可以由数据库自己推算出来。此外,如果一个字段有默认值,那么在INSERT语句中也可以不出现
    Update/delete,一次删除/更新表中的一条或多条记录
Insert into students (class_id,name,score,gender) values (1,’aa’,80,M),(2,’bb’,90,F)
Update students set name=’cc’,score=89 where id=1
Update students set score=score+10 where score<80
Delete from students where id=1
  1. 主键、外键、索引
    主键唯一标识记录,bigint not null auto_increment
    外键表示两个表的关系:一对多、一对一、多对多。
    FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键)。
Foreign key (class_id) refrences classes (id)

通过对数据库表创建索引,可以提高查询速度(列的值如果越互不相同,那么索引效率越高,主键索引的效率是最高)。通过创建唯一索引(例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。),可以保证某一列的值具有唯一性。

  1. sql文件
-- 如果test数据库不存在,就创建test数据库:
CREATE DATABASE IF NOT EXISTS test;

-- 切换到test数据库
USE test;

-- 删除classes表和students表(如果存在):
DROP TABLE IF EXISTS classes;
DROP TABLE IF EXISTS students;

-- 创建classes表:
CREATE TABLE classes (
    id BIGINT NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 创建students表:
CREATE TABLE students (
    id BIGINT NOT NULL AUTO_INCREMENT,
    class_id BIGINT NOT NULL,
    name VARCHAR(100) NOT NULL,
    gender VARCHAR(1) NOT NULL,
    score INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 插入classes记录:
INSERT INTO classes(id, name) VALUES (1, '一班');
INSERT INTO classes(id, name) VALUES (2, '二班');
INSERT INTO classes(id, name) VALUES (3, '三班');
INSERT INTO classes(id, name) VALUES (4, '四班');

-- 插入students记录:
INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'M', 90);
INSERT INTO students (id, class_id, name, gender, score) VALUES (2, 1, '小红', 'F', 95);
INSERT INTO students (id, class_id, name, gender, score) VALUES (3, 1, '小军', 'M', 88);
INSERT INTO students (id, class_id, name, gender, score) VALUES (4, 1, '小米', 'F', 73);
INSERT INTO students (id, class_id, name, gender, score) VALUES (5, 2, '小白', 'F', 81);
INSERT INTO students (id, class_id, name, gender, score) VALUES (6, 2, '小兵', 'M', 55);
INSERT INTO students (id, class_id, name, gender, score) VALUES (7, 2, '小林', 'M', 85);
INSERT INTO students (id, class_id, name, gender, score) VALUES (8, 3, '小新', 'F', 91);
INSERT INTO students (id, class_id, name, gender, score) VALUES (9, 3, '小王', 'M', 89);
INSERT INTO students (id, class_id, name, gender, score) VALUES (10, 3, '小丽', 'F', 85);

-- OK:
SELECT 'ok' as 'result:';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值