MySql入门学习笔记

--使用技巧
Ctrl+c 可以退出mysql或者正在执行的qitachengxv
某行命令输入错误可以在后面加 \c 就不会执行
--格式化显示 \G
show table status like 'myisam'\G
--更改语句的结束符(定界符)
DELIMITER //
--查询前一个操作所影响的记录数
SELECT ROW_COUNT();

--基本语法
CREATE DATABASE king;
SHOW DATABASES;
SHOW SCHEMAS;
SHOW CREATE DATABASE king;
USE imooc;

CREATE DATABASE IF NOT EXISTS queen DEFAULT CHARACTER SET 'GBK';
SHOW DATABASES;
SHOW CREATE DATABASE queen;

ALTER DATABASE queen DEFAULT CHARACTER SET 'UTF8';

USE queen;

SELECT DATABASE();
SELECT SCHEMA();

DROP DATABASE IF EXISTS king;
DROP DATABASE IF EXISTS queen;

CREATE DATABASE IF NOT EXISTS imooc DEFAULT CHARACTER SET 'UTF8';

USE imooc;

CREATE TABLE IF NOT EXISTS imooc_user(
id INT,
username VARCHAR(20),
password CHAR(32),
email VARCHAR(50),
age TINYINT,
card CHAR(18),
tel CHAR(11),
salary FLOAT(8,2),
married TINYINT(1),
addr VARCHAR(100),
sex ENUM('男','女','保密')
)ENGINE=INNODB CHARSET=UTF8;

--显示详细信息
DESC imooc_user;

DESCRIBE imooc_user;

SHOW COLUMNS FROM imooc_user;

--插入INSERT
CREATE TABLE test_str(
    a CHAR(5),
    b VARCHAR(5)
);
INSERT test_str(a,b) VALUES('','');
INSERT test_str(a,b) VALUES('a','a');
INSERT test_str(a,b) VALUES('ab','ab');
INSERT test_str(a,b) VALUES('abc','abc');
INSERT test_str(a,b) VALUES('abcd','abcd');
INSERT test_str(a,b) VALUES('abcde','abcde');
INSERT test_str(a,b) VALUES('abcdef','abcdef');

INSERT test_str(a,b) VALUES(' 123 ',' 123 ');

SELECT * FROM test_str;
SELECT CONCAT('*',a,'*'),CONCAT('*',b,'*') FROM test_str;

CREATE TABLE test_enum(
    sex ENUM('男','女','保密')
);
INSERT test_enum(sex) VALUES('男');
INSERT test_enum(sex) VALUES(NULL);
INSERT test_enum(sex) VALUES(1);

CREATE TABLE test_set(
a SET('A','B','C','D','E','F')
);

INSERT test_set(a) VALUES('A');
INSERT test_set(a) VALUES('C');
INSERT test_set(a) VALUES('C,E');
INSERT test_set(a) VALUES('A');
INSERT test_set(a) VALUES('H');
INSERT test_set(a) VALUES('A');
INSERT test_set(a) VALUES('A');

--插入时间
CREATE TABLE test_time(
a TIME
);

INSERT test_time(a) VALUES('12:23:45');
INSERT test_time(a) VALUES('2 12:23:45');
INSERT test_time(a) VALUES('2 12');
INSERT test_time(a) VALUES('122345');
INSERT test_time(a) VALUES(now());

CREATE TABLE test_date(
a DATE
);

CREATE TABLE test_datetime(
a DATETIME
);

INSERT test_datetime(a) VALUES('2012-09-12 13:45:18');

CREATE TABLE test_timestamp(
    a TIMESTAMP
);

INSERT test_timestamp(a) VALUES('1978-10-23 12:12:12');
INSERT test_timestamp(a) VALUES(CURRENT_TIMESTAMP);
INSERT test_timestamp(a) VALUES(NULL);



--自动增长必须要与主键索引一起使用
CREATE TABLE test_auto_increment(
id INT UNSIGNED KEY AUTO_INCREMENT,
username VARCHAR(20)
);
INSERT test_auto_increment(username) VALUES('A');
INSERT test_auto_increment(username) VALUES('A');
INSERT test_auto_increment(username) VALUES('A');
INSERT test_auto_increment(id,username) VALUES(NULL,'A');
INSERT test_auto_increment(id,username) VALUES(DEFAULT,'A');
INSERT test_auto_increment(id,username) VALUES(15,'g');
INSERT test_auto_increment(username) VALUES('A');

CREATE TABLE test_dufault(
id INT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED DEFAULT 18,
email VARCHAR(50) NOT NULL DEFAULT '215453112@QQ.COM'
);

INSERT test_dufault(username) VALUES(null);
INSERT test_dufault(username) VALUES('dfsv');
INSERT test_dufault(username,age) VALUES('dfsv',null);
INSERT test_dufault(username,age,email) VALUES('dfsv',null,null);

CREATE TABLE test_unique(
id INT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE KEY,
email VARCHAR(50) UNIQUE,
card CHAR(18) UNIQUE
);

INSERT test_unique(username,email,card)VALUES('A','DFD@QQ.COM','1');
INSERT test_unique(username,email,card)VALUES('B','DHFD@QQ.COM','12');
INSERT test_unique(username,email,card)VALUES('C',null,null);
INSERT test_unique(username,email,card)VALUES('D',null,null);

--增删查改
CREATE TABLE IF NOT EXISTS `imooc_user`(
`id` INT UNSIGNED AUTO_INCREMENT KEY COMMENT '用户编号',
`username` VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',
`password` CHAR(32) NOT NULL COMMENT '密码',
`email` VARCHAR(50) NOT NULL COMMENT '邮箱',
`age` TINYINT UNSIGNED NOT NULL DEFAULT '保密' COMMENT '年龄',
`sex` ENUM('男','女','保密') NOT NULL DEFAULT '保密' COMMENT '性别',
`tel` CHAR(11) NOT NULL UNIQUE COMMENT '电话',
`addr` VARCHAR(50) NOT NULL DEFAULT '北京' COMMENT '地址',
`card` CHAR(18) NOT NULL UNIQUE COMMENT '身份证号',
`married` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0代表未结婚,1代表已结婚',
`salary` FLOAT(8,2) NOT NULL DEFAULT 0 COMMENT '薪水'
)ENGINE=INNODB DEFAULT CHARSET=UTF8;

CREATE TABLE test_bool(
id int,
married BOOL
);

CREATE TABLE IF NOT EXISTS user1(
    id INT UNSIGNED AUTO_INCREMENT KEY
);
ALTER TABLE user1
ADD username VARCHAR(20);
ALTER TABLE user1
ADD password CHAR(32) NOT NULL;
ALTER TABLE user1
ADD email VARCHAR(50) NOT NULL UNIQUE AFTER username;

ALTER TABLE user1
ADD test TINYINT(1) NOT NULL DEFAULT 0 FIRST;
ALTER TABLE user1
DROP test;

ALTER TABLE user1
ADD age TINYINT UNSIGNED NOT NULL DEFAULT 18,
ADD addr VARCHAR(100) NOT NULL DEFAULT '北京',
DROP email;

ALTER TABLE user1
ALTER password SET DEFAULT '123456',
ALTER age DROP DEFAULT;

--CHANGE可以改名字,MODIFY只能改类型(属性)
ALTER TABLE user1
MODIFY username VARCHAR(30) NOT NULL,
CHANGE addr address VARCHAR(30) NOT NULL;

--自动增长与主键索引是绑在一起的,不能单独删除主键

ALTER TABLE user1
MODIFY id INT UNSIGNED KEYALTER TABLE user1
DROP PRIMARY KEY;   

ALTER TABLE user1
ADD PRIMARY KEY(id);

ALTER TABLE user1
ADD UNIQUE KEY(username);

ALTER TABLE user1
DROP INDEX username;

--主键包含一个唯一性索引,其他的列也可以成为唯一性索引
ALTER TABLE user1
ADD email VARCHAR(30) NOT NULL;

--将email设置为唯一性索引(UNIQUE==UNIQUE KEY),键名为uni_email
ALTER TABLE user1
ADD UNIQUE INDEX uni_email(email);
--删除时要删除键名而不是列名
ALTER TABLE user1 DROP INDEX uni_email;

ALTER TABLE user1 RENAME uss;
RENAME TABLE uss TO user1;


--设置引擎,设置定长
CREATE TABLE myisam(
    a VARCHAR(30),--一般是不定长的
    ID INT
)ENGINE=MyISAM ROW_FORMAT=FIXED;
--格式化显示 \G
show table status like 'myisam'\G


--单表查询
CREATE DATABASE IF NOT EXISTS king DEFAULT CHARACTER SET 'UTF8';
USE king;
CREATE TABLE IF NOT EXISTS user(
    id INT UNSIGNED AUTO_INCREMENT KEY COMMENT '编号',
    username VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',
    age TINYINT UNSIGNED DEFAULT 18 COMMENT '年龄',
    email VARCHAR(50) NOT NULL DEFAULT 'imooc@qq.com' COMMENT '邮箱'
)ENGINE=INNODB CHARSET=UTF8;

INSERT user VALUES(1,'KING',24,'46546846546@QQ.COM');
INSERT user VALUES(NULL,'KkING',24,'46546846546@QQ.COM');
INSERT user VALUES(DEFAULT,'KINkG',24,'46546846546@QQ.COM');

INSERT user VALUES(NULL,'BF',DEFAULT,DEFAULT),
(NULL,'BDF',DEFAULT,DEFAULT),
(NULL,'BDDF',DEFAULT,DEFAULT);

--使用INSERT和SELECT插入表
CREATE TABLE IF NOT EXISTS test(
    a VARCHAR(20)
);
INSERT test VALUES('AA'),('BB'),('CC');
INSERT user(username) SELECT * FROM test;
INSERT user(username) SELECT a FROM test;

UPDATE user SET age=29 WHERE id=1;
UPDATE user SET age=49,email='DFGDS' WHERE id=4;
UPDATE user SET age=age+10;
UPDATE user SET age=age-20,email=DEFAULT WHERE id<=5;

DELETE FROM user WHERE username='KING';
DELETE FROM user;

--重置自增
ALTER TABLE user AUTO_INCREMENT=1;


SELECT id,username FROM user;
SELECT * FROM imooc.imooc_user;

--别名
SELECT id AS '编号',username AS '用户名' FROM user;
SELECT id,username FROM user AS UUU;
SELECT user.id,user.username FROM user;
SELECT UUU.id,UUU.username FROM user AS UUU;

--添加字段
ALTER TABLE user
ADD USERDESC VARCHAR(20);

UPDATE user SET USERDESC='GGGGG' WHERE id<=3;

--检测NULL值
SELECT * FROM user WHERE USERDESC=NULL;--无效
SELECT * FROM user WHERE USERDESC<=>NULL;
SELECT * FROM user WHERE USERDESC IS NOT NULL;


SELECT * FROM user WHERE id BETWEEN 1 AND 3;
SELECT * FROM user WHERE id NOT BETWEEN 1 AND 3;
SELECT * FROM user WHERE id IN (1,2,3);
SELECT * FROM user WHERE username IN('BF','BDF');
SELECT * FROM user WHERE id BETWEEN 2 AND 4 AND SEX='男';
SELECT * FROM user WHERE id BETWEEN 1 AND 3 OR SEX IS NULL;

--模糊查询
SELECT * FROM user WHERE username LIKE 'KING';
SELECT * FROM user WHERE username LIKE '%KING%';
SELECT * FROM user WHERE username LIKE '%KING';
SELECT * FROM user WHERE username LIKE 'KING%';
SELECT * FROM user WHERE username LIKE 'K____';
SELECT * FROM user WHERE username LIKE '_K%';


--GROUP

SELECT * FROM user GROUP BY SEX;
--分组
SELECT GROUP_CONCAT(username) FROM user
GROUP BY SEX;
--CONCAT 合并多个、联结
SELECT GROUP_CONCAT(username),age,email,GROUP_CONCAT(USERDESC) FROM user
GROUP BY SEX;


SELECT COUNT(age) FROM user;
SELECT COUNT(*) FROM user;

SELECT SEX,GROUP_CONCAT(username) AS userDetail,COUNT(*) AS totalUsers FROM user
GROUP BY SEX;

--函数使用
SELECT SEX,GROUP_CONCAT(username) AS userDetail,
COUNT(*) AS totalUsers,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user
GROUP BY SEX;
--ROLLUP 归纳、总计
SELECT SEX,GROUP_CONCAT(username) AS userDetail,
COUNT(*) AS totalUsers,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user
GROUP BY SEX
WITH ROLLUP;

--加筛选条件
SELECT SEX,GROUP_CONCAT(username) AS userDetail,
COUNT(*) AS totalUsers,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user
WHERE age<24 --加筛选条件
GROUP BY SEX;

SELECT SEX,GROUP_CONCAT(username) AS userDetail,
COUNT(*) AS totalUsers,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user
GROUP BY SEX
HAVING max_age<24;--HAVING 条件只能从成表上面的字段中选

---ORDER BY
SELECT * FROM user
ORDER BY id DESC;--DESC降序 ASC升序

SELECT * FROM user
ORDER BY id;--升序

SELECT * FROM user
ORDER BY age DESC,username ASC;

SELECT * FROM user
WHERE id>3
ORDER BY id DESC;

SELECT * FROM user
WHERE id>3
ORDER BY RAND();

SELECT * FROM user
LIMIT 5;

SELECT * FROM user
LIMIT 0,5;

SELECT * FROM user
LIMIT 3,2;

UPDATE user SET age=age-10 
ORDER BY id DESC 
LIMIT 4;

DELETE FROM user 
ORDER BY id DESC
LIMIT 3;


--需要注意的是,使用有 WITH ROLLUP 子句的 GROUP BY 语句时,
--不能再使用 ORDER BY 语句对结果集进行排序,如果对返回的结果顺序不满意,
--需要应用程序获得结果后在程序中进行排序。
SELECT SEX,GROUP_CONCAT(username) AS userDetail,
COUNT(*) AS totalUsers,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user
WHERE id>=2
GROUP BY SEX
HAVING max_age<=24
ORDER BY SEX
LIMIT 0,5;


--多表查询
CREATE DATABASE IF NOT EXISTS test2 DEFAULT CHARACTER SET 'UTF8';
USE test2;
CREATE TABLE emp(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20) NOT NULL UNIQUE COMMENT '编号',
    age TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '年龄',
    sex ENUM('男','女','保密'),
    addr VARCHAR(20) NOT NULL DEFAULT '北京',
    depId TINYINT UNSIGNED NOT NULL COMMENT '部门对应的编号'
)ENGINE=INNODB CHARSET=UTF8;

INSERT emp(username,age,depId) VALUES('king',24,1),
('queen',25,2),
('imooc',26,1),
('lily',27,1),
('rose',28,3),
('john',29,3);

CREATE TABLE dep(
    id TINYINT UNSIGNED AUTO_INCREMENT KEY,
    depName VARCHAR(50) NOT NULL UNIQUE,
    depDesc VARCHAR(100) NOT NULL DEFAULT ''
)ENGINE=INNODB CHARSET=UTF8;

INSERT dep(depName,depDesc) VALUES('PHP教学部','研发PHP课件'),
('JAVA教学部','研发JAVA课件'),
('WEB前端教学部','研发WEB前端课件'),
('IOS教学部','研发IOS课件'); 

--全连接
SELECT emp.id,emp.username,emp.age,dep.depName FROM emp,dep;

--内连接
SELECT e.id,e.username,e.age,d.depName
FROM emp AS e
INNER JOIN dep AS d
ON e.depId=d.id;--emp表中的depId和dep表中的id是指相同的事物

--左外连接
SELECT e.id,e.username,e.age,e.addr,
d.id,d.depName,d.depDesc
FROM dep AS d --左表 全部显示
LEFT OUTER JOIN emp AS e
ON d.id=e.depId;

SELECT e.id,e.username,e.age,e.addr,d.id,d.depName,d.depDesc
FROM emp AS e --左表 全部显示
LEFT OUTER JOIN dep AS d
ON d.id=e.depId;

--右外连接
SELECT e.id,e.username,e.age,e.addr,d.id,d.depName,d.depDesc
FROM emp AS e --右表 全部显示
RIGHT OUTER JOIN dep AS d
ON d.id=e.depId
WHERE e.id<=100
ORDER BY e.id DESC
LIMIT 0,10;


--外键
--在定义表时创建外键
CREATE TABLE news_cate(
    id TINYINT UNSIGNED AUTO_INCREMENT KEY,
    cateName VARCHAR(50) NOT NULL UNIQUE,
    cateDesc VARCHAR(100) NOT NULL DEFAULT ''
)ENGINE=INNODB;--只有INNODB存储引擎支持外键

CREATE TABLE news(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    title VARCHAR(100) NOT NULL UNIQUE,
    content VARCHAR(1000) NOT NULL,
    cateId TINYINT UNSIGNED NOT NULL,
    CONSTRAINT cateId_fk_newsCate FOREIGN KEY(cateId) REFERENCES news_cate(id)
)ENGINE=INNODB;--在定义表时定义外键 cateId_fk_newsCate是外键名称
--子表的外键字段和主表的主键字段类型要相似;如果是数值型要求一致,并且无符号也要一致
--如果是字符型要求类型一致,长度可以不同
--如果外键字段没有创建索引,MySQL会自动帮我们创建索引
--子表的外键关联必须是父表的主键

INSERT news_cate(cateName) VALUES('国内新闻'),
('国际新闻'),
('娱乐新闻'),
('体育新闻');

--合法记录 外键字段cateId对应的主表字段news_cate.id的范围是1-4
INSERT news(title,content,cateId)VALUES('a1','aaaa1',1),
('a2','aaaa2',1),
('a3','aaaa3',4),
('a4','aaaa4',2),
('a5','aaaa5',3);
--非法记录 外键字段cateId对应的主表字段news_cate.id的范围是1-4
INSERT news(title,content,cateId)VALUES('a1','aaaa1',1),
('a2','aaaa2',2),
('a3','aaaa3',3),
('a4','aaaa4',4),
('a5','aaaa5',5);

--外键约束 父表中的某一条记录在子表有对应时 不可删除更改
-- 非法操作
DELETE FROM news_cate WHERE id=1;
UPDATE news_cate SET id=10 WHERE id=1;
DROP TABLE news_cate;

--合法操作 父表中的某一条记录在子表没有对应
INSERT news_cate(cateName) VALUES('教育新闻');
UPDATE news_cate SET id=10 WHERE id=9;
UPDATE news_cate set cateName='education' WHERE id=10;
DELETE FROM news_cate WHERE id=10;

--合法的删除操作 先删子表再删父表
DROP TABLE news;
DROP TABLE news_cate;

SELECT n.id,n.title,n.content,c.cateName
FROM news AS n
JOIN news_cate AS c
ON n.cateId=c.id;

INSERT news(title,content,cateId) VALUES('a6','aaaa6',45);

--删除外键
ALTER TABLE news
DROP FOREIGN KEY cateId_fk_newsCate;
--添加外键
ALTER TABLE news
ADD FOREIGN KEY(cateId) REFERENCES news_cate(id);
--删除外键
ALTER TABLE news
DROP FOREIGN KEY news_ibfk_1;
--添加外键 当子表与父表有与建立外键的条件不匹配时 无法建立外键
ALTER TABLE news
ADD CONSTRAINT cateId_fk_newsCate FOREIGN KEY(cateId) REFERENCES news_cate(id);

--级联 父表和子表同时删除 
--先有外键才能建立级联,然后删除外键就能同时对主从表进行操作
ALTER TABLE news
ADD FOREIGN KEY (cateId) REFERENCES news_cate(id)
ON DELETE CASCADE ON UPDATE CASCADE;

UPDATE news SET id=10 WHERE id=1;--只能改主表
DELETE FROM news_cate WHERE id=10;


--子查询
--IN
SELECT * FROM emp WHERE depId IN(1,2);

SELECT * FROM emp
WHERE depId NOT IN(SELECT id FROM dep);

--SELECT嵌套
CREATE TABLE stu(
    id TINYINT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20) NOT NULL UNIQUE,
    score TINYINT UNSIGNED NOT NULL
);

INSERT stu(username,score) VALUES('king',95),
('queen',75),
('zhangsan',69),
('lisi',78),
('wangwu',87),
('zhaoliu',88),
('tianqi',98),
('ceshi',99),
('tiancai',100);

CREATE TABLE level(
    id TINYINT UNSIGNED AUTO_INCREMENT KEY,
    score TINYINT UNSIGNED COMMENT '分数'
);

--截断
TRUNCATE TABLE level;
INSERT level(score) VALUES(90),(80),(70);

SELECT score FROM level WHERE id=1;

SELECT id,username,score FROM stu
WHERE score>=(SELECT score FROM level WHERE id=1);

SELECT id,username,score FROM stu
WHERE score<=(SELECT score FROM level WHERE id=3);

--EXISTS返回值 
--EXISTS返回值为真则执行前面的SELECT语句
--EXISTS返回值为假则不执行前面的SELECT语句
SELECT * FROM emp WHERE EXISTS (SELECT depName FROM dep WHERE id=10);
SELECT * FROM emp WHERE EXISTS (SELECT depName FROM dep WHERE id=1);

--ANY SOME ALL关键字查询
SELECT * FROM stu
WHERE score>=ANY(SELECT score FROM level);

SELECT * FROM stu
WHERE score>=SOME(SELECT score FROM level);

SELECT * FROM stu
WHERE score>=ALL(SELECT score FROM level);

SELECT * FROM stu
WHERE score<ALL(SELECT score FROM level);

SELECT * FROM stu
WHERE score=ANY(SELECT score FROM level);

SELECT * FROM stu
WHERE score!=ALL(SELECT score FROM level);

--联合查询 
CREATE TABLE user1(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20)
)SELECT id,username FROM emp;

INSERT user1(username) SELECT username FROM stu;

CREATE TABLE user2(
    id INT UNSIGNED AUTO_INCREMENT KEY,
    username VARCHAR(20)
)SELECT id,username FROM emp;

INSERT user2 SET username=(SELECT username FROM stu WHERE id=9);

--去重 只是对显示结果进行去重,并不对原来的表中记录进行去重
SELECT DISTINCT(username) FROM user2;

--合并
--UNION有去重功能(去掉两个表互相重复的,不对单个表进行去重操作) 
--UNION ALL是简单地合并
INSERT user1(username) SELECT username FROM user2;

SELECT * FROM user1
UNION
SELECT * FROM user2;

SELECT * FROM user1
UNION ALL
SELECT * FROM user2;

--无限级分类设计及实现 自身连接
CREATE TABLE cate(
    id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
    cateName VARCHAR(100) NOT NULL UNIQUE,
    pId SMALLINT UNSIGNED NOT NULL DEFAULT 0    
);

INSERT cate(cateName,pId) VALUES
('服装',0),
('数码',0),
('箱包',0),
('男装',1),
('女装',1),
('内衣',1),
('电视',2),
('冰箱',2),
('洗衣机',2),
('爱马仕',3),
('LV',3),
('GUCCI',3),
('夹克',4),
('衬衫',4),
('裤子',4),
('液晶电视',7),
('等离子电视',7),
('背投电视',7);--与pId相同的id代表父类记录

--自身连接
SELECT s.id,s.cateName AS scateName,p.cateName AS pcateName
FROM cate AS s
RIGHT JOIN cate AS p
ON s.pId=p.id;

SELECT p.id,p.cateName AS pcateName,s.cateName AS scateName
FROM cate AS s
RIGHT JOIN cate AS p
ON s.pId=p.id;

SELECT p.id,p.cateName AS pcateName,COUNT(s.cateName) AS count
FROM cate AS s
RIGHT JOIN cate AS p
ON s.pId=p.id
GROUP BY p.cateName
ORDER BY id ASC;


--正则表达式查询

--开头
SELECT * FROM user1 WHERE username REGEXP '^k';
--结尾
SELECT * FROM user1 WHERE username REGEXP 'n$';

SELECT * FROM user1 WHERE username REGEXP '^q...n$';

--包含
--包含单字
SELECT * FROM user1 WHERE username REGEXP '[aeiou]';
--包含字段
SELECT * FROM user1 WHERE username REGEXP 'ki|im|qu';

--单字重复
INSERT user1(username)VALUES('imoooc');
INSERT user1(username)VALUES('imoc');
INSERT user1(username)VALUES('imc');
--重复任意次
SELECT * FROM user1 WHERE username REGEXP 'imo*c';
--至少重复一次
SELECT * FROM user1 WHERE username REGEXP 'imo+c';
--重复两次
SELECT * FROM user1 WHERE username REGEXP 'imo{2}c';
--重复1-3次
SELECT * FROM user1 WHERE username REGEXP 'imo{1,3}c';

--数据函数
--向上取整
SELECT CEIL(1.2);
--向下取整
SELECT FLOOR(1.9);
--四舍五入
SELECT ROUND(3.5689,2);
--小数截断
SELECT TRUNCATE(3.456789,3);
--取余
SELECT MOD(8,3);
--取绝对值
SELECT  ABS(-12);
--幂运算
SELECT POWER(2,3);
--圆周率
SELECT PI();
--随机数
SELECT RAND();
--判断正负
SELECT SIGN(-9);
SELECT SIGN(0);
SELECT SIGN(8);
--指数函数 以e为底数
SELECT EXP(2);

--字符串函数
--返回字符串长度
SELECT CHAR_LENGTH('ASD');
SELECT LENGTH('SGFDG');
--合并字符串
SELECT CONCAT('a','d','f');
SELECT CONCAT('a','d','f',NULL);
--指定分隔符合并
SELECT CONCAT_WS('-','a','d','f');
SELECT CONCAT_WS('-','a','d','f',NULL);
SELECT CONCAT_WS(NULL,'a','d','f');
--大小写转换
SELECT UPPER('gjhgj'),UCASE('dfgd'),LOWER('FDGF'),LCASE('DFDB');
--字符串反转
SELECT REVERSE('ASD');
--截取前后字符串
SELECT LEFT('DFGHJ',2),RIGHT('DFGHJ',2);
--填充字符串
SELECT LPAD('abc',10,'?');
SELECT RPAD('abc',10,'!');
--首尾去空格
SELECT CONCAT('*',TRIM('  ABC  '),'*'),
CONCAT('*',LTRIM('  ABC  '),'*'),
CONCAT('*',RTRIM('  ABC  '),'*');
--重复 指定次数
SELECT REPEAT('HJK',3);
--替换字符串
SELECT REPLACE('hello world','world','hahah');
--截取字符串
SELECT SUBSTRING('ABCDEFG',1,3);
--比较字符串
SELECT STRCMP('A','C');


--日期时间常用函数
--返回当前时间
SELECT CURDATE(),CURRENT_DATE();
SELECT CURTIME(),CURRENT_TIME();
SELECT NOW(),CURRENT_TIMESTAMP(),SYSDATE();
--返回其他时间
SELECT MONTH('2018-06-18');
SELECT MONTH(CURDATE()),MONTHNAME(CURDATE());
SELECT DAYNAME(NOW());
SELECT DAYOFWEEK(NOW());
SELECT WEEK(NOW());
SELECT YEAR(NOW()),MONTH(NOW()),DAY(NOW()),HOUR(NOW()),MINUTE(NOW()),SECOND(NOW());
--计算日期差
SELECT DATEDIFF('2018-06-18','2018-06-20');


--其他常用函数
--查询版本号 连接ID 用户 当前用户 系统用户 SESSION 用户等
SELECT VERSION(),CONNECTION_ID();
SELECT USER(),CURRENT_USER(),SYSTEM_USER(),SESSION_user();
--得到上一步AUTO_INCREMENT的值
SELECT LAST_INSERT_ID();
--MD5加密 密码加密
SELECT MD5('king');
SELECT PASSWORD('root');

--自定义函数
DROP FUNCTION f1;
--无参数函数
CREATE FUNCTION f1() RETURNS VARCHAR(30)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H时%i分%s秒');
SELECT f1();
--有参数函数
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
SELECT f2(7,8);
--复合结构函数
CREATE TABLE test(
    id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT KEY,
    username VARCHAR(20)
);

--更改语句的结束符(定界符)
DELIMITER //

CREATE FUNCTION adduser(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT test(username) VALUES(username);
RETURN LAST_INSERT_ID();
END
//

SELECT adduser('ROSE')//

DELIMITER ;
SELECT adduser('ROSE');

--存储过程
--不带参数的存储过程
CREATE PROCEDURE sp1() SELECT VERSION();
CALL sp1;

--带有IN类型参数的存储过程
DELIMITER //
CREATE PROCEDURE removeUserById(IN pid INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id=pid;--若写id=id 则所有的记录全删除了 
END//
DELIMITER ;
CALL removeUserById(3);--调用存储过程
DROP PROCEDURE removeUserById;

--带有IN、OUT类型参数的存储过程
DELIMITER //
CREATE PROCEDURE removeUserAndReturnUsername(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id=p_id;
SELECT COUNT(id) FROM users INTO userNums;--SELECT COUNT 语句的结果存进userNums
END
//
DELIMITER ;

SELECT COUNT(id) FROM users;
--OUT类型的参数userNums的值由@nums在存储过程外接收,4传进IN类型的参数p_id中
CALL removeUserAndReturnUsername(4,@nums);
SELECT @nums; --显示输出结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值