MySql 常用语法

 

   1 #开启关闭服务
   2 #管理员启动cmd,,net start/stop mysql,,
   3 #登录数据库,,mysql 【-h localhost -P 端口号】 -u 用户名  -p,,
   4 #退出数据库,,exit,, / #ctrl+c
   5 #查看版本号,,mysql -V,,
   6 ##常见语句
   7 #查看当前所有数据库
   8 SHOW DATABASES;
   9 #打开指定的库,,use 库名;
  10 #查看某库所有的表,,show tables; // show tables from 库名;
  11  /*创建表,, create table(
  12     字段名称 字段类型,
  13     字段名称 字段类型
  14     );*/
  15 #查看表结构,,desc 表名;
  16 #修改字符集 set names gbk;
  17 #查看表内容,,select * from 表名;
  18 #插入内容,,insert into 表名 (id , name) values (1,‘yangbo’);
  19 #更新修改内容,,update  表名 set name='yb' where id=1;
  20 #删除内容,,delete from 表名  where id=1;

 执行顺序:

 

 

单行函数 做处理使用
如 CONCAT(str1,str2,...) LENGTH(str) IFNULL(expr1,expr2)
分组函数 做统计使用,又成为统计函数/聚合函数

-- 字符函数
1.LENGTH(str)
2.CONCAT(str1,str2,...)
3.UPPER(str)/LOWER(str)
4.SUBSTR(str FROM pos FOR len) 索引从1 开始
5. INSTR(str,substr) 返回substr在str的起始索引
6.TRIM([remstr FROM] str)/LTRIM(str)/RTRIM(str) SELECT TRIM('a' FROM 'aaaaaaLOVEaaaaaa') as out_put;
7.LPAD(str,len,padstr)/RPAD(str,len,padstr) 用指定字符实现左/右填充至指定长度字符串 SELECT LPAD('LOVE',10,'*') AS out_put;
8.REPLACE 替换 SELECT REPLACE('张无忌爱上了周芷若','周芷若','赵敏') AS out_put;

 

---数学函数
1.ROUND(X) 四舍五入
2.CEIL(X) 向上取整
3.FLOOR(X) 向下取整
4.TRUNCATE(X,D) 截断 SELECT TRUNCATE(1.678888,1);
5.MOD(N,M) 取模 SELECT MOD(10,3)

 

--日期函数
1.NOW() 返回当前系统日期,不包含时间 SELECT YEAR(NOW()) out_put;
2.CURDATE() 返回当前系统日期,不包含时间
3.CURTIME() 返回当前时间,不包含日期
4.STR_TO_DATE(str,format) 合法的字符串转换为日期 SELECT STR_TO_DATE('1991-07-06','%Y-%m-%d');
5.DATE_FORMAT(date,format) 将日期输出为指定格式 SELECT DATE_FORMAT(NOW(),'%Y年/%m月/%d日') out_put;

 

--流程控制函数
1.IF 函数 if...else效果 SELECT last_name,commission_pct,IF(commission_pct IS NULL,'No bonus',commission_pct) AS bonus_status
FROM employees;
2.CASE 函数 switch..case效果
使用一:
SELECT salary,department_id,
CASE department_id
WHEN 30 THEN
salary* 1.1
WHEN 40 THEN
salary * 1.2
WHEN 50 THEN
salary *1.3
ELSE
salary
END AS new_salary
FROM employees;
使用二:类似于多重if

CASE
WHEN 条件1 THEN 要显示的值或语句1
WHEN 条件2 THEN 要显示的值或语句2
...
ELSE 要显示的值或语句n
END

SELECT last_name, salary,
CASE
WHEN salary>20000 THEN
'A'
WHEN salary>15000 THEN
'B'
WHEN salary>10000 THEN
'C'
ELSE
'D'
END AS salary_class
FROM employees;

 

SELECT salary,department_id,
CASE department_id
    WHEN 30 THEN
        salary* 1.1
        WHEN 40 THEN
        salary * 1.2
        WHEN 50 THEN
        salary *1.3
    ELSE
        salary
END AS new_salary
FROM employees;
SELECT last_name, salary,
CASE 
    WHEN salary>20000 THEN 
        'A'
    WHEN salary>15000 THEN 
        'B'
    WHEN salary>10000 THEN
        'C'
    ELSE
        'D'
END AS salary_class
FROM employees;

--自连接

SELECT e.last_name,e.employee_id,m.employee_id,m.last_name FROM employees e, employees m WHERE
e.manager_id = m.employee_id;

 

 

sql99语法
语法:
SELECT 查询列表
FROM 表1 别名【连接类型】
JOIN 表2 别名 ON 连接条件
【WHERE 筛选条件】
【GROUP BY 分组】
【HAVING 筛选类型】
【ORDER BY 排序列表】

分类:
内连接:INNER
语法:
SELECT 查询表名
FROM 表1 别名
INNER JOIN 表2 别名
ON 连接条件;
分类:等值连接,非等值连接,自连接

 

等值连接:

SELECT last_name,department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;
SELECT last_name,job_title FROM employees e INNER JOIN jobs j ON e.job_id = j.job_id 
WHERE last_name LIKE '%e%';

SELECT city, COUNT(*) FROM locations l INNER JOIN departments d ON l.location_id = d.location_id
GROUP BY city HAVING COUNT(*) > 3;

SELECT department_name,COUNT(*) FROM departments d INNER JOIN employees e ON d.department_id = e.department_id
GROUP BY department_name HAVING COUNT(*) >= 3 ORDER BY COUNT(*) DESC;

SELECT e.last_name,d.department_name,j.job_title FROM employees e INNER JOIN departments d 
ON e.department_id = d.department_id INNER JOIN jobs j ON e.job_id = j.job_id ORDER BY department_name DESC;

非等值连接:

SELECT e.last_name,e.salary,j.grade_level FROM employees e INNER JOIN job_grades j ON 
salary BETWEEN lowest_sal AND heighest_sal;
SELECT j.grade_level,COUNT(*) FROM employees e INNER JOIN job_grades j 
ON e.salary BETWEEN j.lowest_sal AND j.heighest_sal GROUP BY j.grade_level
ORDER BY j.grade_level DESC;

自连接

SELECT e.last_name,m.last_name FROM employees e INNER JOIN employees m ON e.manager_id = m.employee_id
WHERE e.last_name LIKE '%a%';


外连接:
左外:LEFT [OUTER]
右外:RIGHT[OUTER]
全外:FULL [OUTER]
交叉连接:CROSS :相当于笛卡尔乘积

 

外连接:
应用场景:用于查询一个表里有,另一个表里没有的记录
特点:外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,则显示匹配的值
如果没有和它匹配的,则显示null,外连接查询结果=内连接结果+主表中有而从表中没有的记录。

左外连接,LEFT JOIN 左边的是主表
右外连接:RIGHT JOIN 右边的是主表

左外和右外交换两个表的顺序,可以实现同样的效果。

--左连接:
SELECT e.last_name,e.department_id, d.* FROM departments d LEFT JOIN employees e ON e.department_id = d.department_id
WHERE last_name IS NULL;
--右连接:
SELECT d.*,e.department_id FROM employees e RIGHT JOIN departments d ON  e.department_id = d.department_id
WHERE last_name IS NULL;

 

交叉连接:CROSS :相当于笛卡尔乘积

SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

 

 

 

--子查询
含义:出现在其他语句中的select语句,称为子查询或内查询
外部的查询称为主查询或者外查询。

分类:
按子查询出现的位置:
SELECT 后面:标量子查询
FROM 后面: 表子查询 特点:将子查询充当一张表,要求子查询中的表必须取别名
⭐️WHERE或HAVING 后面 :标量子查询,列子查询, 行子查询
EXISTS 后面(相关子查询): 表子查询
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询 (一般为多行多列)

️WHERE或HAVING :
标量子查询 (单行子查询)
列子查询 (多行子查询)
行子查询 (多列多行)
特点:
1.子查询放在小括号内
2.子查询一般放在条件的右侧
3.标量子查询,一般搭配着单行操作符(> < >= <= = <> )使用

列子查询,一般搭配着多行操作符(IN,ANY/SOME,ALL)使用

子查询的执行优先于主查询

 

 ----分页查询:

应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法:
SELECT 查询列表
FROM 表
【JOIN type】JOIN 表2
ON 连接条件
WHERE 筛选条件
GROUP BY 分组字段
HAVING 分组后的筛选
ORDER BY 排序的手段
LIMIT OFFSET size;

OFFSET 要显示条目的起始索引(起始索引从0开始)
size要显示的条目个数;

特点:
1.limit语句放在查询语句的最后
2.limit (page-1)*size (要显示的页数是page,每页的条目数是size)

SELECT * FROM employees LIMIT 0,5: --OFFSET 为0时可以省略不写
SELECT * FROM employees LIMIT 10,15;
SELECT * FROM employees WHERE commission_pct IS NOT NULL ORDER BY salary DESC
LIMIT 0,10;
SELECT SUBSTR(email,1,INSTR(email,'@')-1) username FROM student;

 

SELECT sex,COUNT(*) FROM student GROUP BY sex;

 

--联合查询
union 联合,合并:将多条查询语句的结果合并成一个结果
语法:
查询语句1
union
查询语句2
union
....

应用场景:要查询的结果来源于多个表,且多个表没有直接的连接关系,但查询的信息一致时。

特点:
1.要求多条查询语句的查询列数一致
2.要求多条查询语句的查询每一列的类型和顺序最好一致
3.union关键字默认去重,如果使用union all可以包含重复项。

--不使用联合查询
SELECT * FROM employees WHERE department_id > 90 OR  email LIKE '%a%';

--使用联合查询
SELECT * FROM employees WHERE department_id > 90
UNION
SELECT * FROM employees WHERE email LIKE '%a%';

--DML语言
数据操作语言:
插入:insert
语法:方式一:inset into 表名(列名,...)values(值1,...)
支持插入多行
方式二:insert into 表名 set 列名=值,列名=值,...
修改:update
删除:delete
*/

 插入:insert
语法:

方式一:inset into 表名(列名,...)values(值1,...)

特点:

1.列的顺序可以调换
2.字段个数和字段值必须一一对应
3.可以省略列名,默认为所有字段,且按照表中顺序排列

支持插入多行

insert into beauty values(14,'刘雨欣','','1991-8-9','1898383848',null,3),
(15,'刘雨欣2','','1991-8-9','1898383848',null,3),
(16,'刘雨欣3','','1991-8-9','1898383848',null,3);


方式二:insert into 表名 set 列名=值,列名=值,...

--方式一支持子查询,方式二不支持
INSERT INTO beauty(id,`name`,phone)
SELECT 23,'宋茜','1862737373'

 

--修改语句
1.修改单表的记录
语法:
update 表名
set 列=新值,列=新值...
WHERE 筛选条件

UPDATE beauty SET phone ='138883474'
WHERE `name` LIKE '刘%';


UPDATE boys SET boyName ='张飞',userCP=1000
WHERE id = 2;

2.修改多表的记录
语法:
(1)sql92语法:

update 表1 别名,表2 别名
set 列=值
where 连接条件
and 筛选条件


(2) sql99语法:

update 表1 别名,
inner/left/right join表2 别名
on 连接条件
set 列=值...
where 筛选条件

UPDATE boys bo INNER JOIN beauty b ON bo.id = b.boyfriend_id
SET b.phone ='144'
WHERE bo.boyName='张无忌';
UPDATE beauty b left JOIN boys bo ON b.boyfriend_id = bo.id
SET boyfriend_id = 2
WHERE boyfriend_id IS NULL;

 

 

 

 

https://www.cnblogs.com/super-yb/p/12699452.html

 

posted @ 2021-10-28 22:08  donkey8  阅读(556)  评论(0)    收藏  举报