Fork me on GitHub

数据库

登陆

进入MySQL的bin目录下

1
mysql -hlocalhost -uroot -p

数据库

数据库是一个二维表,每行是一个实体,列叫字段

decimal小数更精确

Varchar:变长字符串

date:YYYY-MM-DD

time:HH:MM:SS

datetime:YYYY-MM-DD HH:MM:SS

整型 int

不是很精确的 double

时间 datetime

字符串 varchar

表的约束:主键,非空,自增

主键唯一(内容不能重复),不能为空,一个表只能有一个主键

数据库不区分大小写

增删改查语句

–(空格) :注释

1
2
3
4
5
6
INSERT INTO 表名 VALUS(不指定列名按照表的顺序写);
-- 推荐下面的(指定列名)
INSERT INTO stu(stuid,stuname,age,tel,address) VALUES(1001,'lisi',12,'1233','buxiang')
,(1010.......);
-- 自增
INSERT INTO stu (stuname,age,tel,address) VALUES('lisi',13,'779','buxiang');

指定列名,可以省略自增的列名,可以实行添加多条,逗号隔开

1
2
SELECT * FROM stu;
UPDATE stu SET stuname='liwu',address='shandong'WHERE stuid=1001;

可以更新主键(一般不要更新),要保证更新后不会出现重复

*代表所有列

1
DELETE FROM stu WHERE stuid=1001;

where后面一般是主键

单表查询

1
SELECT 列名 FROM 表名;
  1. 列名之间用 ,

  2. *代表所有列

  3. DISTINCT:对查询结果去重

    1
    SELECT DISTINCT cid FROM student;
  4. 可以进行+ - * /

  5. 给列起别名,(as和 )之后只能用换后的名字:

    1
    SELECT socre as 加分前的成绩, socre+5 加分后的成绩 FROM score;
  6. select五种子句

    | 子句 | 描述 |
    | ——– | ——– |
    | WHERE | 条件查询 |
    | group by | 分组 |
    | having | 筛选 |
    | order by | 排序 |
    | limit | 截取 |

    where

    =,>,<,<=,>=,

    between…and… 包含边界,日期加‘ ’

    in(集合),满足集合中一个值即可

    not 取反 ,

    like 模糊查询 ‘%字符%’,_代表一个字符,%代表多个字符

    is NULL

    聚合函数

    AVG()平均值

    1
    SELECT AVG(socre) 平均成绩 FROM score WHERE subid=1;

    COUNT() 数据的数量

    1
    SELECT COUNT(*) FROM score WHERE subid=1;

    SUM()求和

    1
    SELECT SUM(socre) FROM score;

    MAX()MIN()

    1
    SELECT MAX(socre) from score;

分组group by

每 各 要分组

带聚合函数 一般都要分组

SELECT...FROM....WHERE...GRUP BY 列名

1
2
3
4
SELECT AVG(socre) FROM score GROUP BY subid;

-- sqlserver
SELECT AVG(socre),subid FROM score GROUP BY subid;

having

where 针对表中真正存在的列

having 针对查询结果,但是在group by之后执行

1
2
3
4
5
6
7
8
-- where (✕)
SELECT stuid,socre+5 加分后的成绩 FROM score WHERE 加分后的成绩<60;
-- having(√)
SELECT stuid,socre+5 加分后的成绩 FROM score HAVING 加分后的成绩<60;


-- sqlserver
-- having必须和group by一起用

order by

asc升序,默认

desc降序

在select语句结尾

1
SELECT * FROM student ORDER BY 字段1,字段2, ... ASC;

根据字段一进行排,排完基础上根据字段2进行排……

limit

limit 数据的坐标,显示的条数;

数据的坐标从0开始

常用在分页

多表查询

等值连接

两个表有相同字段

eg:查询李四所在班级,显示班级编号,姓名,班级名

  1. 把两个表连成一个大表

    1
    SELECT * FROM student,classinfo;
  2. 确定连接条件(用表名加以区分)

    1
    student.cid=classinfo.cid
  3. 确定其他筛选条件

    1
    AND name="李四";

内连接

查询李四所考科目的平均成绩,显示姓名,平均成绩

  1. 把两个表连成一个大表

    1
    SELECT * FROM student INNER JOIN score
  2. 连接条件

    1
    ON student.stuid=score.stuid

    可以多次重复上述两步以实现多张表相连

  3. 筛选条件

    1
    WHERE `name`='李四';

左外连接

以左表为主,去右表找匹配数据,如果找不到就用null填充,也就是说,左表的数据必须被查询

1
2
SELECT student.stuid,`name`,sex,subid,socre FROM student LEFT JOIN score
ON student.stuid=score.stuid;

右外连接

与左外连接相反

1
2
SELECT student.stuid,`name`,sex,subid,socre FROM score LEFT JOIN student
ON student.stuid=score.stuid;

左外和右外例子效果相同

尽量使用左外连接替代右外连接(大型数据库DB2只支持左外连接,不支持右外连接)

0%