0)表注释
# 注释
SELECT *
FROM mytable; -- 注释
/* 注释1
注释2 */
1)创建表
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT'姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT'123456' COMMENT'密码' ,
`sex` VARCHAR(2) NOT NULL DEFAULT '男'COMMENT'性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address`VARCHAR (100)DEFAULT NULL COMMENT '家庭住址',
`email`VARCHAR(50)DEFAULT NULL COMMENT '邮箱',
-- 添加主键操作
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET = utf8;
# 查看数据库的定义
SHOW CREATE DATABASE school;
# 查看数据表的定义
SHOW CREATE TABLE student;
# 显示表结构
DESC student;
2) 修改表
ALTER TABLE db_name.tableName
ADD col_name CHAR(20);
ALTER TABLE db_name.tableName
DROP COLUMN col_name;
DROP TABLE db_name.tableName;
3)插入数据
desc db_test.student

INSERT INTO db_name.tableName(col1, col2)
VALUES(val1, val2);
INSERT INTO db_test.student(name, remark)
VALUES("alex", "test one person");
-- 插入表,指定插入字段,不固定值
INSERT into db_name.tableName(col1, col2)
-- 检索内容
SELECT col1, col2 FROM mytable2;
1)静态插入数据:要求插入数据时指定与建表时相同的分区字段,如:
insert overwrite tablename (year='2017', month='03') select a, b from tablename2;
2)动静混合分区插入:要求指定部分分区字段的值,如:
insert overwrite tablename (year='2017', month) select a, b from tablename2;
3)动态分区插入:只指定分区字段,不用指定值,如:
insert overwrite tablename (year, month) select a, b from tablename2;
4)动态分区插入:使用每日调度参数
insert overwrite table du_data_analysis.soc_push_data_details partition (pt='${bizdate}')
CREATE TABLE newtable AS
SELECT * FROM mytable;
CREATE TABLE newtable AS
SELECT * FROM db_test.student;
4)更新数据
UPDATE db_test.student
SET name = "andy"
WHERE id = 1;
5)删除数据
DELETE FROM db_test.student
WHERE id = 1;
注意:
TRUNCATE TABLE 可以清空表,也就是删除所有行。
使用更新和删除操作时一定要用 WHERE 子句,不然会把整张表的数据都破坏。可以先用 SELECT 语句进行测试,防止错误删除。
mysql> CREATE USER 'test1'@'localhost' identified by 'Test@001';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT USER FROM mysql.user; 查询所有用户
mysql> SHOW GRANTS For test1@'localhost'; 查询具体 test1 用户


a. 授权用户所有权限
mysql> GRANT ALL ON *.* TO 'test1'@'192.127.12.16' IDENTIFIED BY 'Test@001';
Query OK, 0 rows affected, 1 warning (0.01 sec)
b. 具体指定用户可用的语句,限制test1只能用SELECT语句
mysql> GRANT SELECT ON *.* TO 'test1'@'localhost' identified BY 'Test@001';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges; 刷新权限
Query OK, 0 rows affected (0.00 sec)
c. 查询是否授权成功
mysql> SELECT * FROM USER WHERE HOST='192.168.12.16'\G;
mysql> DROP USER 'test1'@'localhost';
Query OK, 0 rows affected (0.01 sec)
类似的,SQL支持case条件语句,两种格式如下:
1)指定 case_value 匹配
case_value是一个表达式,这个值与when_value相比较,如果相等,则进入相应的statement_list,statement_list就是一个语句列表,可以包含多条语句。如果在when_value中没有和case_value相等的值,则进入ELSE里面的statement_list语句列表。
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END
2)指定 条件 匹配 【推荐用这种】
每一个WHEN后面的search_condition表达式都会被判断,直到一个表达式的结果为真,然后执行相应的THEN后面的语句序列。如果没有匹配的,则执行ELSE后面的语句列表。
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END
SELECT
name,
remark,
CASE
WHEN NAME LIKE "李%" THEN "老李家的"
WHEN NAME LIKE "孙%" THEN "老孙家的"
WHEN NAME LIKE "林%" THEN "老林家的"
WHEN NAME LIKE "郭%" THEN "老郭家的"
ELSE "其他姓氏的"
END AS "firstName"
FROM
db_test.student

SELECT
name,
age,
CASE
when age > 65 THEN "退休"
when age > 25 THEN "上班"
when age > 3 THEN "上学"
ELSE "小宝宝"
END AS "work"
FROM db_test.student

3)以上两种,都需 else,假如不写 else兜底,则可以用:
每一个WHEN后面的search_condition表达式都会被判断,直到一个表达式的结果为真,然后执行相应的THEN后面的语句序列。如果没有匹配的,则执行ELSE后面的语句列表。
DELIMITER |
CREATE PROCEDURE p()
BEGIN
DECLARE v INT DEFAULT 1;
CASE v
WHEN 2 THEN SELECT v;
WHEN 3 THEN SELECT 0;
ELSE
BEGIN
END;
END ;
END;
-- 过滤姓李的,年龄在 18岁 到 35岁 之间
SELECT
name,
age
FROM db_test.student
WHERE
name LIKE "李%"
AND age >= 18
AND age <= 35
-- 过滤姓李的或姓王的
SELECT
name,
age
FROM db_test.student
WHERE
name LIKE "李%" OR name LIKE "王%"
-- 过滤 非 王姓的
SELECT
name,
age
FROM db_test.student
WHERE
name NOT LIKE "王%"
() 圆括号具有比AND,OR 更高的操作计算顺序。
需求:过滤出 李姓或王姓的,且年龄 大于 100岁
错误示范:

正确做法:
SELECT
name,
age
FROM db_test.student
WHERE
(name LIKE "李%" OR name LIKE "王%" )
AND age > 100

注意: 使用AND 和OR操作WHERE句子,都应该用圆括号明确分组操作。
IN操作符,用来指定范围,范围中的每一条,都进行匹配。IN取值规律,由逗号分割,全部放置括号中。
-- 过滤出 年龄分别为18, 30, 35, 60, 80, 100, 120的记录
SELECT
name,
age
FROM db_test.student
WHERE age in (18, 30, 35, 60, 80, 100, 120)

使用IN的优点:
通配符是SQL的WHERE子句中的特殊含义字符,子句中使用通配符必须使用LIKE操作符。
SELECT
name,
age,
address
FROM db_test.student
WHERE name like "An%"

SELECT
name,
age,
address
FROM db_test.student
WHERE name like "A%z"

SELECT
name,
age,
address
FROM db_test.student
WHERE name like "%Willi%"

下划线与%不同的是匹配单个字符,而不是多个字符。即:一个下划线代表匹配一个字符
-- 匹配姓名: 卢X明
SELECT
name,
age,
address
FROM db_test.student
WHERE name like "卢_明"

-- 匹配姓名: XX明
SELECT
name,
age,
address
FROM db_test.student
WHERE name like "__明"

总结: 一个 _ 匹配 一个字符串。
-- 匹配 以 an 开头的 name,不区分大小写
SELECT
name,
age,
address
FROM db_test.student
WHERE binary (name like 'an%')
