SQL入门

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

posted @ 2019-06-26 09:31  qinhuansky  阅读(417)  评论(0编辑  收藏  举报