SQL语言关键字不区分大小写!!!但是,针对不同的数据库,对于表名和列名,有的数据库区分大小写,有的数据库不区分大小写。同一个数据库,有的在Linux上区分大小写,有的在Windows上不区分大小写。此处:SQL关键字总是大写,以示突出,表名和列名均使用小写。
1,主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL
。
可以使用多个列作为联合主键,但联合主键并不常用。
2,SELECT
可以用作计算,但它并不是SQL的强项。但是,不带FROM
子句的SELECT
语句有一个有用的用途,就是用来判断当前到数据库的连接是否有效。许多检测工具会执行一条SELECT 1;
来测试数据库连接
SELECT * FROM <表名> //SELECT是关键字,表示将要执行一个查询,*表示“所有列”,FROM表示将要从哪个表查询 SELECT 100+100 //200 SELECT 1 //1
3,条件查询
SELECT * FROM <表名> WHERE <条件表达式> --条件表达式可以用<条件1> AND <条件2>表达满足条件1并且满足条件2 SELECT * FROM students WHERE score >= 80 AND sex= 'M'; --sex列存储的是字符串,需要用单引号括起来 --第二种条件是<条件1> OR <条件2>,表示满足条件1或者满足条件2 --第三种条件是NOT <条件>,表示“不符合该条件”的记录 SELECT * FROM students WHERE NOT sex= 'M'; --等价于sex<>'M' --多条件查询要用小括号(),如果不加括号,条件运算按照NOT、AND、OR的优先级进行 SELECT * FROM students WHERE (score < 80 OR score > 90) AND gender = 'M'; --使用LIKE判断相似 name LIKE 'ab%' name LIKE '%bc%' %表示任意字符,例如'ab%'将匹配'ab','abc','abcd' WHERE score BETWEEN 60 AND 90 --between60~90之间
4,如果我们只希望返回指定列数据,而不是所有列的数据,我们可以用SELECT 列1, 列2, 列3 FROM ...
,让结果集仅包含指定列。这种操作称为投影查
SELECT id, name, sex FROM students; --只返回索引,姓名,性别 --使用SELECT 列1, 列2, 列3 FROM ...时,还可以给结果集的列进行重命名每一列起个别名,SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM ...。 SELECT id, name user, sex FROM students;
5,默认按照主键排序
SELECT id, name, score FROM students ORDER BY score; --按score从低到高 SELECT id, name, score FROM students ORDER BY score DESC; --加上DESC表示“倒序”: SELECT id, name, gender, score FROM students ORDER BY score DESC, gender; --如果score列有相同的数据,要进一步排序,可以继续添加列名。例如,使用ORDER BY score DESC, gender表示先按score列倒序,如果有相同分数的,再按gender列排序 SELECT id, name, gender, score FROM students WHERE class_id = 1 ORDER BY score DESC; --字符串排序要注意,数据库可以指定排序的编码,所以并不一定总是按unicode排序,要看建表的设定
6,使用LIMIT <M> OFFSET <N>
可以对结果集进行分页,每次查询返回结果集的一部分;随着N
越来越大,查询效率也会越来越低。
SELECT id, name, gender, score FROM students ORDER BY score DESC LIMIT 3 OFFSET 0; --对结果集从0号记录开始,最多取3条。注意SQL记录集的索引从0开始 SELECT id, name, gender, score FROM students ORDER BY score DESC LIMIT 3 OFFSET 6; --简写成LIMIT 3, 6 -- 查询第3页的时候,OFFSET应该设定为6: --LIMIT总是设定为pageSize; --OFFSET计算公式为pageSize * (pageIndex - 1)是可选的默认0
7,聚合查询,如果聚合查询的WHERE
条件没有匹配到任何行,COUNT()
会返回0,而SUM()
、AVG()
、MAX()
和MIN()
会返回NULL
SELECT COUNT(*) FROM students; --查询students表一共有多少条记录 SELECT COUNT(*) num FROM students; ---- 使用聚合查询并设置结果集的列名为num SELECT COUNT(*) boys FROM students WHERE sex= 'M'; --统计男生个数 SELECT AVG(score) boyAverage FROM students WHERE gender = 'M'; --男生成绩平均值
SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;
--分组统计每个class_id 组中人多个数
SELECT class_id, sex, COUNT(*) num FROM students GROUP BY class_id, sex;
-- 按class_id, gender分组
SUM | 计算某一列的合计值,该列必须为数值类型 |
AVG | 计算某一列的平均值,该列必须为数值类型 |
MAX | 计算某一列的最大值 |
MIN | 计算某一列的最小值 |
8,多表查询 SELECT * FROM <表1> <表2>。查询的结果也是一个二维表,它是表1和表2的“乘积”
SELECT students.id sid, students.name, students.gender, students.score, classes.id cid, classes.name cname FROM students, classes; --对于多表查询,出现相同列名称,利用投影查询的“设置列的别名” 方法二: SELECT s.id sid, s.name, s.gender, s.score, c.id cid, c.name cname FROM students s, classes c;
9,连接查询
SELECT s.id, s.name, s.class_id, c.name class_name, --改名 s.gender, s.score FROM students s --确定主表 INNER JOIN classes c --连接的表,使用INNER JOIN <表2> ON s.class_id = c.id --使用ON <条件...>,这里的条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接 WHERE s.score>80 ORDER BY s.score; 分号表示语句结束 --内连接查询表一并把表二的相关数据对应查出 --外连接OUTER JOIN,如果表1和表二class_id > c.id个数,LEFT 表示从左查,则表2没有的字段会出现NULL;如果RIGHT从右查 则不会出现NULL;FULL 会出现NULL SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score FROM students s RIGHT OUTER JOIN classes c ON s.class_id = c.id;
10,插入数据 INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);
INSERT INTO students (class_id, name, gender, score) VALUES (2, '大牛', 'M', 80); INSERT INTO students (class_id, name, gender, score) VALUES (1, '大宝', 'M', 87), (2, '二宝', 'M', 81); --如果一个字段有默认值,那么在INSERT语句中也可以不出现,比如主键。 --字段顺序不必和数据库表的字段顺序一致,但值的顺序必须和字段顺序一致 --可以一次插入多条 -- 查询并观察结果: SELECT * FROM students; --更新数据UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...; UPDATE students SET name='大牛', score=66 WHERE id=1; UPDATE students SET score=score+10 WHERE score<80; -- 查询并观察结果: SELECT * FROM students WHERE id=1; --删除语句 DELETE FROM <表名> WHERE ...; DELETE FROM students WHERE id=1; -- 查询并观察结果: SELECT * FROM students;
-- 除了id=1,id =2其他都删除
DELETE FROM `students` WHERE id NOT IN(1, 2)
11,
SHOW DATABASES; --列出所有数据库 CREATE DATABASE test; --创建数据库 DROP DATABASE test; --删除数据库 USE test --对一个数据库进行操作时,要首先将其切换为当前数据库 SHOW TABLES --列出当前数据库的所有表 DESC students --查看一个表的结构 SHOW CREATE TABLE students --查看创建表的SQL语句 DROP TABLE students --删除表 EXIT仅仅断开了客户端和服务器的连接,MySQL服务器仍然继续运行。 --插入或替换 REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99); --若id=1的记录不存在,REPLACE语句将插入新记录,否则,当前id=1的记录将被删除,然后再插入新记录。 --插入或更新 INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99) ON DUPLICATE KEY UPDATE name='小明', gender='F', score=99; --插入或忽略 INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99); -- 对class_id=1的记录进行快照,并存储为新表students_of_class1: CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;
参考:https://www.liaoxuefeng.com/wiki/1177760294764384/1246617682185952