SQL基础


咬定青山不放松,立根原在破岩中!
ECRZ 记录美好事物。

SQL基础

1.SQL语句分类

  • DDL 数据定义语言 CREATE DROP ALTER
  • DML 数据操控语言 UPDATE DELETE ADD
  • DQL 数据查询语言 SELECT
  • DCL 数据控制语言 GRANT REVOKE

2.示例

DDL
CREATE TABLE/DATABASE/PROCEDURE/TRIGGER NAME
DROP TABLE/DATABASE/PROCEDURE/TRIGGER NAME
ALTER TABLE/DATABASE/PROCEDURE/TRIGGER NAME ADD/MODIFY COLUMN

DML
INSERT INTO USERS(UID,UNAME,USEX,BIRTHDAY) VALUES (1,'LUCK','男','2002-02-01');
INSERT INTO TABLENAME --插到哪里去

UPDATE USERS SET UNAME = 'MOON',USEX = '女',BIRTHDAY = '1998-06-05' WHERE UID = 2;
UPDATE TABLENAME SET  --更新哪张表的哪个字段

DELETE FROM USERS WHERE UID = 2;
DELETE FROM TABLENAME --从哪张表删除,哪个记录


DQL
SELECT * FROM USERS;
SELECT X FROM X --查询哪个字段,从哪张表

3. 创建数据库和表格

-- 创建数据库,并指定编码为UTF-8
CREATE DATABASE DB CHARACTER SET 'UTF8';

-- 创建表
CREATE TABLE IF NOT EXISTS USERS(
	UID INT NOT NULL AUTO_INCREMENT,
	UNAME VARCHAR(20) NOT NULL,
	USEX VARCHAR(1) NOT NULL,
	BIRTHDAY DATE NOT NULL DEFAULT "1997-08-13",
	PRIMARY KEY(UID),
	CHECK(UID>0)
)ENGINE = INNODB DEFAULT CHARSET=UTF8;


CREATE TABLE IF NOT EXISTS USERS_2(
	UID INT NOT NULL AUTO_INCREMENT,
	UNAME VARCHAR(20) NOT NULL,
	USEX VARCHAR(1) NOT NULL,
	BIRTHDAY DATE NOT NULL DEFAULT "1997-08-13",
	UD INT NOT NULL,
	PRIMARY KEY(UID),
	CHECK(UID>0)
)ENGINE = INNODB DEFAULT CHARSET=UTF8;

4.CRUD表

-- 增加
INSERT INTO USERS(UID,UNAME,USEX,BIRTHDAY) VALUES (1,'LUCK','男','2002-02-01');
INSERT INTO USERS VALUES (2,'LUCK','男','2002-02-01');

-- 删除
DELETE FROM USERS WHERE UID = 2;
DELETE FROM USERS;

-- 修改
UPDATE USERS SET UNAME = 'MOON',USEX = '女',BIRTHDAY = '1998-06-05' WHERE UID = 2;
UPDATE USERS SET USEX = '女';

-- 查询
SELECT * FROM USERS;
SELECT * FROM USERS WHERE USEX = '女';
SELECT UID,UNAME FROM USERS WHERE UNAME LIKE '%L%';
SELECT UID,UNAME FROM USERS WHERE UNAME LIKE '_U%';
DESC USERS;

5.修改表结构

-- 修改表结构
ALTER TABLE USERS ADD COLUMN BZ VARCHAR(20);
ALTER TABLE USERS MODIFY COLUMN BZ INT;
ALTER TABLE USERS MODIFY BZ VARCHAR(20);

-- 不能把主键再设置为外键了
ALTER TABLE USERS_2 ADD CONSTRAINT TK FOREIGN KEY (UD) REFERENCES USERS(UID);
-- 删除外键
ALTER TABLE USERS_2 DROP CONSTRAINT TK;

-- 查看表结构
DESC RUNOOB_TBL;
DESC USERS;

-- 删除表
DROP TABLE USERS_2;

6.存储

定义:SQL语句集的封装,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行

-- 声明变量
SET @NUM1 = 10;
SET @NUM2 = 20;
-- 创建存储
CREATE PROCEDURE FC(IN NUM1 INT,IN NUM2 INT,OUT RES VARCHAR(20))
BEGIN
	IF NUM1 > NUM2 THEN 
		SELECT "NUM1 IS BIGGEST!" INTO RES;
	ELSE
		SELECT "NUM2 IS BIGGEST!" INTO RES;
	END IF;
END

-- 删除存储
DROP PROCEDURE FC;

-- 调用存储
CALL FC(@NUM1,@NUM2,@RES);

-- 查询值
SELECT @RES;

-- 查看数据库创建的存储
-- 查看指定存储过程
SHOW CREATE PROCEDURE db_kaima.OUT_ALL_INFO;

-- 显示该数据库存储
SHOW PROCEDURE STATUS WHERE DB = 'db_kaima';

7.触发器

定义:触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。不建议使用!

-- 触发器
CREATE TRIGGER TGR 
AFTER INSERT
ON USERS 
FOR EACH ROW
BEGIN
	INSERT INTO TIME VALUES(NOW());
END

-- 插入测试
INSERT INTO USERS VALUES (3,'LUCK','男','2002-02-01','AAA');
INSERT INTO USERS VALUES (4,'MOON','女','1498-06-05','');

-- 测试表格
SELECT * FROM USERS;
SELECT * FROM TIME;
-- 查看触发器
SHOW TRIGGERS FROM db_kaima;
SHOW TRIGGERS;

-- 删除触发器
DROP TRIGGER TGR;

-- 查看USERS表结构
DESC USERS;

8.关键字

1. 建表测试
CREATE TABLE TB1(
	AUTHOR VARCHAR(20),
	COUNT INT(10)
);

INSERT INTO TB1 VALUES('A',1);
INSERT INTO TB1 VALUES('B',1);
INSERT INTO TB1 VALUES('C',1);
INSERT INTO TB1 VALUES('D',1);
INSERT INTO TB1 VALUES('E',1);

CREATE TABLE TB2(
	ID INT,
	AUTHOR VARCHAR(20),
	COUNT INT(10)
);
INSERT INTO TB2 VALUES(1,'A',1);
INSERT INTO TB2 VALUES(2,'B',1);
INSERT INTO TB2 VALUES(3,'C',1);


CREATE TABLE TB3(
	UNAME VARCHAR(15) NOT NULL,
	USEX VARCHAR(2),
	UPHONENUMBER VARCHAR(11),
	ULOGIN INT
);

INSERT INTO TB3 VALUES('张三','男','11111111111',1);
INSERT INTO TB3 VALUES('李四','男','11111111111',2);
INSERT INTO TB3 VALUES('王五','男','11111111111',1);
INSERT INTO TB3 VALUES('老六','男','11111111111',5);
INSERT INTO TB3 VALUES('老七','男',NULL,6);

-- 查表
SELECT * FROM TB3;
-- 删除表
DROP TABLE TB3;
2. Join连接(左连接,右连接,内连接)
SELECT TB2.ID,TB2.AUTHOR,TB1.COUNT
FROM TB1 LEFT JOIN TB2 ON TB1.AUTHOR=TB2.AUTHOR;

SELECT TB2.ID,TB2.AUTHOR,TB1.COUNT
FROM TB1 RIGHT JOIN TB2 ON TB1.AUTHOR=TB2.AUTHOR;

SELECT TB2.ID,TB2.AUTHOR,TB1.COUNT
FROM TB1 INNER JOIN TB2 ON TB1.AUTHOR=TB2.AUTHOR;
3. Having(分组条件插足)
-- HAVING 测试
SELECT COALESCE(UNAME,'总数'),SUM(ULOGIN) AS COUNT FROM TB3 GROUP BY UNAME WITH ROLLUP HAVING SUM(ULOGIN>=2);
-- SELECT COALESCE(UNAME,'总数','测试'),SUM(ULOGIN) AS COUNT FROM TB3 GROUP BY UNAME WITH ROLLUP WHERE SUM(ULOGIN>=2); 不能用there要用having

4. WITH ROLLUP(分组的统计数据的基础上再进行相同的统计)
-- WITH ROLLUP测试
SELECT COALESCE(UNAME,'总数'),SUM(ULOGIN) AS COUNT FROM TB3 GROUP BY UNAME HAVING SUM(ULOGIN>=2);
-- 有了WITH ROLLUP会在分组执行完SUM(ULOGIN),再执行一次SUM(ULOGIN)
SELECT COALESCE(UNAME,'总数'),SUM(ULOGIN) AS COUNT FROM TB3 GROUP BY UNAME WITH ROLLUP HAVING SUM(ULOGIN>=2);
5. Group by 分组
SELECT UNAME ,COUNT(UNAME) AS COUNT FROM TB3 GROUP BY UNAME;
SELECT UNAME,SUM(ULOGIN) AS COUNT FROM TB3 GROUP BY UNAME WITH ROLLUP;
SELECT COALESCE(UNAME,'总数'),SUM(ULOGIN) AS COUNT FROM TB3 GROUP BY UNAME WITH ROLLUP;
6. COALESCE
-- COALESCE(UNAME,'COALESCE') UNAME中为null的自动填补为COALESCE
SELECT UNAME,USEX,COALESCE(UPHONENUMBER,"COALESCE") FROM TB3;
SELECT COALESCE(UNAME,'总数','测试'),SUM(ULOGIN) AS COUNT FROM TB3 GROUP BY UNAME WITH ROLLUP;
SELECT '总人数',COUNT(UNAME) AS COUNT FROM TB3;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值