themost
1、创建/删除数据库
CREATE/DROP DATABASE DATABASENAME;

2、创建数据表
CREATE TABLE table_name(
    col_name1, col_type [not null],#不允许为空则not null ,不写则默认可以为空,[]代表可写可不写
    col_name2, col_type [not null],
    col_name3, col_type [not null]
)
例:
create table  t2(
r1 int not null,
r2 varchar(5) not null);

3、切换数据表目录
use tablename;

4、约束
约束:希望插入数据时做一个检查,比如性别只有男女,其他值无法加入
约束即是数据的检察官,当 出现不符合标准的数据时 ,就不会插入数据库
主键约束:保证实体完整性,主键不能重复,不能为空
如:PRIMARY KEY
CREATE TABLE USERS(
USER_QQ VARCHAR(20) NOT NULL PRIMARY KEY,
USER_NAME  VARCHAR(50) NOT NULL,
USER_SEX CHAR(2) NOT NULL,
)

外键约束:一个表上的数据来源于另一个表
保证引用完整性
如:表示创建SCORE表,表中的USER_QQ来源于USER表中的USER_QQ列,如果没有则插入失败
CREATE TABLE SCORES(
    USER_QQ VARCHAR(20) NOT NULL
    REFERENCES USERS(USER_QQ),
    GNO INT NOT NULL,
    SCORE INT NOT NULL
)

检查约束:保证域完整性,即列上的某个值符合某种格式或者某种范围
如:要求游戏编号大于0
CREATEE TABLE GAMES(
    GNO INT NOT NULL CHECK(GNO>0),
    GNAME VARCHAR(50) NOT NULL,
    GTYPE VARCHAR(20) NOT NULL
)

默认约束:保证域完整性,比如玩家性别默认为男
CREATE TABLE USERS(
    USER_SEX VARCHAR(2) NOT NULL DEFAULT \'\'
)

自增列:保证实体完整
CREATE TABLE GAMES(
    GNO INT NOT NULL AUTO_INCREMENT,
)

5、查看表的基本结构
DESCRIBE/DESC  TABLE_NAME

Field:字段名
Type:字段类型
NULL:是否可以为空
Key:是否编制索引
Default:默认值
Extra:附加信息,如自增列

查看表的详细结构,可以查到创建的所有语句
SHOW CREATE_TABLE TABLE_NAME 加\G可以格式化结果


6、修改数据表

修改表名
ALTER TABLE OLD_NAME RENAME TO NEW_NAME

修改字段名
ALTER TABLE TABLE_NAME
CHANGE OLD_NAME NEW_NAME NEW_TYPE
如:
ALTER TABLE GAMES
CHANGE GNO GAME_ID VARCHAR(20)

修改字段数据类型
ALTER TABLE TABLE_NAME
MODIFY COL_NAME NEW_TYPE
如:
ALTER TABLE GAMES
MODIFY GNO VARCHAR(20)

添加字段
ALTER TABLE TABLE_NAME
ADD NEW_COL_NAME NEW_TYPE

删除字段
ALTER TABLE TABLE_NAME
DROP COL_NAME

增补主键约束
ALTER TABLE TABLE_NAME
ADD CONSTRAINT COL_NAME
PRIMARY KEY (COL_NAME)
如:注意约束名,主键 约束pk,外键则为fk
ALTER TABLE USERS
ADD CONSTRINT PK_USERS_USERQQ
PRIMARY KEY(USERQQ)

添加外键约束
ALTER TABLE F_TABLE
ADD CONSTRAINT CON_NAME
FOREIGN KEY(F_COL)REFERENCES M_TABLE(M_COL)
如:
ALTER TABLE SCORES
ADD CONSTRAINT FK_SCORES_GAMES
FOREIGN KEY(GNO) REFERENCES GAMES(GNO)

添加检查约束
ALTER TABLE TABLE_NAME
ADD CONSTRAINT CON_NAME
CHECK(EXP)
如:
ALTER TABLE GAMES
ADD CONSTRAINT CK_GAMES_GNO
CHECK(GN0>0)

添加默认值
ALTER TABLE TABLE_NAME
ALTER COL_NAME SET DEFAULT VALUE
如:
ALTER TABLE USERS
ALTER USER_SEX SET DEFAULT \'\'

添加 自增列
ALTER TABLE TABLE_NAME
MODIFY COLUMN  COL_NAME ... AUTO_INCREMENT
如:
ALTERR TABLE \'GAMES\'
MODIFY COLUMN \'GNO\' INT NOT NULL AUTO_INCREMENT
PRIMARY KEY

7、插入数据

为所有列插入值,列值同数,列值同序
INSERT [INTO] TABLE_NAME VALUES(V1,V2,V3...)
如:
INSERT INTO USERS
VALUES
(\'2011-01-22\',\'周天\',\'\',\'1985-09-08\',\'13800110022\')

INSERT INTO USERS
VALUES
(\'2011-01-22\',\'周天\',DEFAULT,\'1985-09-08\',\'13800110022\')

为特定列插入值,指定顺序,列值对应
INSERT [INTO] TABLE_NAME(COL1, COL2...)
VALUES(V1,V2...)
如:
INSERT INTO USERS
(USER_QQ, USER_NAME, USER_MOBILE)
VALUES(\'1545\',\'DDAFG\',\'1585435535654\')

一次性插入多条记录
INSERT [INTO] TABLE_NAME[(COL1,COL2...COLN)]
VALURS(V11,V12...V1N),(V21,V22...V2N),(V31,V32...V3N)...
如:
INSERT INTO USERS
(USER_QQ, USER_NAME, USER_BIRTHDAY, USER_MOBILE) 
VALUES
(\'1545\',\'DDAFG\',\'1938-04-25\',\'1585435535654\')
(\'1545\',\'DDAFG\',\'1983-04-25\',\'1585435535654\')

修改数据
修改全部数据
UPDATE TABLE_NAME
SET{COL_NAME = EXPRESSION}[,...N]
如:
UPDATE USERS
SET USER_SEX = \'\'

UPDATE SCORES
SET SCORE = SCORE + 100

8、修改特定数据
UPDATE TABLE_NAME
SET{COL_NAME = EXPRESSION}[,...N]
WHERE CONDITION_EXPRESSION
如:
UPDATE USERS
SET USER_SEX = \'\'
WHERE USER_QQ = \'12315\'

9、删除数据

使用DELETE命令删除数据
DELETE [FROM] TABLE_NAME
[WHERE CONDITION_EXPRESSION]
如:
DELETE FROM USERS WHERE USER_SEX = \'\'

使用TRUNCATE TABLE删除表中的全部数据
TRUNCATE TABLE TABLE_NAME

TRUNCATE TABLE SCORES


10、查询

SELECT COL1,COL2,..COLN
FROM TABLE1,TABLE2...TABLEN
[WHERE CONDITION] #查询条件
[GROUP BY GROUP_BY_LIST] #把查询的结果进行分组
[HAVING CONDITIONS] # 是统计结果作为查询条件
[ORDER BY ORDER_LIST[ASC|DESC]] #统计结果进行排序

查询表的全部行和列
SELECT * FROM TABLE

查询表的部分列
SELECT USER_QQ, USER_NAME FROM USERS

别名的使用
SELECT USER-QQ AS \'玩家QQ\',USER_NAME AS \'玩家姓名\' FROM USERS
SELECT USER-QQ \'玩家QQ\',USER_NAME \'玩家姓名\' FROM USERS #去掉as

DISTINCT查询结果消除重复行
SELECT DISTINCT USER_QQ FROM SCORES

LIMIT指定结果集中数据的显示范围
SELECT * FROM USERS LIMIT 2,3 #查询第几条-共显示几条数据



查询
普通条件查询
如:查询qq号为12301的玩家信息
SELECT * FROM USERS WHERE USER_QQ = \'12301\'
如:查询分数也大于2500分的数据
SELECT * FROM SCORES WHERE SCORE > 2500

如查询游戏编号为1且分数大于4000的分数信息
SELECT * FROM SCORES WHERE GNO= 1 AND SCORE> 4000

模糊查询 between and
如:查询分数在2500到3000的分数, 包括边界
SELECT * FROM SCORES WHERE SCORE >= 2500 AND SCORE <= 3000
SELECT * FROM SCORES WHERE SCORE BETWEEN 2500 AND 3000
不在2500与3700之间的
SELECT * FROM SCORE WHERE SCORE NOT BETWEEN 2500 AND 3700


通配符:
\'_\' 一个字符
% 任意长度
[] 指定范围内
[^]不在括号中
如查询所有姓王的玩家,注意要用like
SELECT * FROM USERS WHERE USER_NAME LIKE \'王%\'

查询空值,主要要用 IS NULL , IS NOT NULL
SELECT * FROM USERS WHERE USER_BIRTHDAY IS NULL


对查询结果排序
对单列指定列进行排序,即单列排序,排序依据、排序方式
如:查询分数表中编号为1的所有分数信息,并按照分数升序进行排序
SELECT * FROM SCORES WHERE GNO=1 ORDER BY SCORE ASC/DESC

对多列排序:排序依据,排序方式、优先级,注意条件之间的,
如:查询分数表所有信息,并按照游戏编号的升序和分数的降序进行排序
SELECT * FROM SCORES ORDER BY GNO ASC, SCORE DESC
当ORDER BY 后面出现两个条件时,前面的优先级最高

常用的聚合函数
sum()
avg()
min()
max()
count()

etc:查询玩家表中一共有多少名玩家信息
SELECT COUNT(NAME) FROM NAMES
SELECT COUNT(*) FROM NAME  除非行上所有的列都为空

etc:查询qq号是12301的玩家游戏的总分数
SELECT SUM(SCORE) FORM SCORE WHERE USER_QQ = \'12301\'

etc:查询QQ号是12302的玩家的平均分数
SELECT AVG(SCORE) FROM SCORES WHERE USER_QQ = \'12302\'

etc:查询qq号是12302的玩家的总分、平均分、和最高分
SELECT SUM(SCORE) AS \'总分\', AVG(SCORE) AS \'平均分\', MAX(SCORE) AS \'最高分\' FROM SCORES WHERE USER_QQ = \'12302\'


结果集内分组, GROUP BY
etc:查询每个玩家的总分数、平均分数、最高分数

SELECT USERS, SUM(SCORE) AS \'总分数\', AVG(SCORE) AS \'\', MAX(SCORE) AS \'\' FROM SCORES GROUP BY USERS

筛选分组结果
在使用GROUP BY 字句时,可用HAVING子句为分组统计进一步设置统计条件,
HAVING子句是以聚合函数的统计结果为筛选条件。HAVING写在GROUP By之后

查询平均分数大于4000的玩家QQ号 总分数、平均分数
SELECT USER_QQ, SUM(SCORE) AS \'总分数\', AVG(SCORE) AS \'平均分数\' FROM SCORES GROUP BY USER_QQ HAVING AVG(SCORE) > 4000

统计结果也可以作为排序依据
查询所有用户的平均分数和总分数并按平均分数倒序排列
SELECT USER_QQ, AVG(SCORE) AS \'平均分数\', SUM(SCORE) AS \'总分数\' FROM SCORES GROUP BY USER_QQ ORDER BY AVG(SCORE) DESC

SELECT FROM WHERE GBOUP BY 聚合函数 HAVING ORDER BY

多表连接查询
分别从三张表中查询分数信息、显示玩家昵称、游戏名称和分数

SELECT USER_NAME AS \'昵称\', GNAME AS \'游戏名称\', SCORE AS \'分数\' FROM USERS, GAMES, SCORES
WHERE USERS.USER_QQ = SCORE.USER_QQ AND GAMES.GNO = SCORES.GNO
FROM 后面直接出现多个表名,这种方式即属于内联接,是隐式内联接

显示内联接格式: 速度更快
SELECT COL_LIST FROM TABLE1 [INNER] JOIN TABLE2 ON TABLE1.COL=TABLE2.COL

SELECT USER_NAME AS \'\', GNAME AS \'\', SCORE AS \'\' FROM SCORES INNER JOIN GAMES ON GAMES.GNO=SCORES.GNO
INNER JOIN USERS ON SCORES.USER_QQ = USERS.USER_QQ

SELECT USER_NAME \'昵称\', SUM(SCORE) AS \'\', AVG(SCORE) AS \'\' FROM USERS U INNER JOIN SCORES S
ON S.USERS_QQ = U.USERS_QQ GROUP BY U.USERS_QQ, USER_NAME


外连接:做链接的两个表地位不同,有一张表是基础表,基础表数据必须出现,没有null不齐
左外连接时左表是基础表,右外连接时右表是基础表,先出现的表为左
SELECT COL_LIST FORM TABLE1 LEFT/RIGHT [OUTER] JOIN TABLE2 ON TABLE1.COL=TABLE2.COL

比如要求查询所有玩家关于5号游戏的分数信息,基础表是玩家表,有的玩家没有玩游戏也要出现
SELECT USER_NAME AS \'\', GNO AS \'\', SCORES AS \'\' FROM USERS U LEFT JOIN SCORES S ON U.USER_QQ=S.USERS_QQ AND S.GNO = 5

子查询IN, 子查询一般都不写成select * from 
SELECT * FROM 1111 WHERE NUM IN (SELECT NUM FROM 2222 WHERE NAME = \'\')

EXISTS关键字,如果后面的成立,则执行外围的语句
SELECT * FROM SCORES WHERE EXISTS
(SELECT * FROM USERS WHERE USERS_NAME = \'SUNWUKONG\')

联合查询UNION [ALL]将多个结果纵向链接为一体,有ALL关键字可以显示全部数据(即使重复的数据也显示出来)
SELECT USER_NAME FROM USERS
UNION [ALL]
SELECT GAME FROM GAMES

SELECT + 字符串 表示列名
查询qq号是12301的玩家所有分数并计算总分、平均分,显示到同一结果集中
SELECT USER_QQ, GNO, SCORE FROM SCORES WHERE USER_QQ = \'12301\'
UNION ALL
SELECT \'总分\' \' \', SUM(SCORE) FROM SCORES WHERE USER_QQ = \'12301\'
UNION ALL
SELECT \'平均分\',\' \', AVG(SCORE) FROM SCORES WHERE USER_QQ = \'12301\'

 

分类:

技术点:

相关文章:

  • 2021-12-26
  • 2021-12-26
  • 2021-06-25
  • 2021-11-01
猜你喜欢
  • 2021-11-12
  • 2021-12-20
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-01
  • 2021-11-03
相关资源
相似解决方案