注意:sql语句以;结尾。mysql中的关键字不区分大小写
网上有很多安装配置过程记录,这边就不记了,注意安装时,卸载其他版本的mysql数据库。
cmd窗口的版本查询命令 mysql -V
、mysql --version
mysql -h[数据库服务端IP] -P[数据库服务端口] -u[用户名] -p[密码]
mysql -u[用户名] -p[密码]
#退出
quit 或 exit
#修改账户密码,注意命令尾的分号一定要有,这是mysql的语法
alter user 'root'@'localhost' identified with mysql_native_password BY '新密码';
数据库服务端IP:默认为 127.0.0.1
数据库服务端口:默认为 3306
-u 后面是登录的用户名,mysql安装之后,自带一个root用户
-p 后面是登录用户密码,如果不填写,回车之后,会提示输入密码
我连了一下,报错了,ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)。在 cmd 命令行里启动服务,结果显示 拒绝访问。
去 服务 里找mysql ,启动类型设为自动,然后启动服务,右键刷新后,显示 mysql 服务正在启动。再连一下就连上了。
需求 | 推荐 |
---|---|
图形化管理 | MySQL Workbench、Navicat、DBeaver |
命令行操作 | mysql 原生客户端(就是windows中cmd里头连接服务那一套)、MyCLI |
Python 开发 | PyMySQL、SQLAlchemy |
Java 开发 | JDBC(mysql-connector-java) |
Web 管理 | phpMyAdmin、Adminer |
import pymysql
conn = pymysql.connect(
host="localhost",
user="root",
password="123456",
database="test_db"
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
conn.close()
import java.sql.*;
public class MySQLDemo {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test_db";
String user = "root";
String password = "123456";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
System.out.println(rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123456',
database: 'test_db'
});
connection.query('SELECT * FROM users', (err, results) => {
console.log(results);
});
通用语法:
- SQL语句以分号 ; 结尾
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 可用 /* */、–、# 的方式写注释
关键词建议用大写。
#创建数据库
CREATE DATABASE [数据库名];
CREATE DATABASE IF NOT EXISTS [数据库名];
CREATE DATABASE [数据库名] CHARACTER SET [编码方式];
CREATE DATABASE [数据库名] CHARSET='[编码方式]';
CREATE DATABASE [数据库名] SET [编码方式] COLLATE [排序规则];
#查看当前服务器中所有数据库
SHOW DATABASES;
#查看创建的数据库的定义信息
SHOW CREATE DATABASE [数据库名];
#修改某数据库的编码方式
ALTER DATABASE [数据库名] CHARACTER SET [编码方式];
#删除数据库—— 实际工作中不要删除数据库!!!
DROP DATABASE [数据库名];
#查看当前数据库
SELECT DATABASE();
#使用指定的数据库或切换数据库
USE [数据库名];
#建表
CREATE TABLE 表名(
列名1 数据类型 [约束],
列名2 数据类型 [约束],
列名n 数据类型 [约束]
);
表名、列名是自定义,多列之间用逗号间隔,最后一列的逗号不能写,[约束] 按需求添加,类型必须写。若列名与关键字相同,则需在列两边加 ‘ ’
数据类型选取原则:满足需求的前提下,选择取值范围小的,够用就行。
常见约束:
#查看当前数据库已有的表
SHOW TABLES;
#查看指定表的字段信息
DESC [表名];
#查看表格创建细节
SHOW CREATE TABLE [表名];
#修改指定表名
RENAME TABLE [旧表名] TO [新表名];
ALTER TABLE [旧表名] RENAME [新表名];
#修改表的字符集
ALTER TABLE [旧表名] CHARACTER SET [编码方式];
#删除指定数据表
DROP TABLE [表名];
#增加列
ALTER TABLE [表名] ADD [新列名] [新数据类型(长度)] [约束];
#修改列字段
ALTER TABLE [表名] MODIFY [列名] [新数据类型];
ALTER TABLE [表名] CHANGE [旧列名] [新列名] [新数据类型(长度)] [约束];
#删除列,一次只能删除一列
ALTER TABLE [表名] DROP [列名];
在mysql中,字符串类型和日期类型都要用单引号括起来。
insert into 表名(列名) values(数据值);
#如:
#insert into student(stuname,stuage,stusex,birthday) values('张三1',18,'a','2000- 1-1');
#同时添加多行,列名与列值的类型、个数、顺序要一一对应,插入空值用null,插入的日期和字符一样,都使用引号括起来。
insert into 表名(列名1,列名2,...) values(第一行数据),(第二行数据),(...),(...);
#一次添加多条记录
insert into 表 values(值1,值2,....),(值1,值2,....),...;
#修改
UPDATE 表名 SET 列名1=列值1,列名2=列值2 ... WHERE 列名=值;
#改所有行
UPDATE 表名 SET 列名1=列值1,列名2=列值2 ... ;
#删除
DELETE from 表名 [WHERE 列名=值]
#获取当前系统时间
select now();
#指定IP
create user 用户名@指定ip identified by 密码;
#任意IP均可登陆
create user 用户名@‘%’ identified by 密码;
#删除 drop user 用户名@IP;
drop user test123@localhost;
#给指定用户,授予指定指定数据库指定权限
#grant 权限1,权限2,........,权限n on 数据库名.* to 用户名@IP;
grant select,insert,update,delete,create on chaoshi.* to 'test456'@'127.0.0.1';
#给指定用户授予所有数据库所有权限
#grant all on . to 用户名@IP
grant all on *.* to 'test456'@'127.0.0.1';
#show grants for 用户名@IP;
show grants for 'root'@'%';
#revoke 权限1,权限2,........,权限n on 数据库名.* from 用户名@IP;
REVOKE SELECT ON *.* FROM 'root'@'%' ;
查询返回的结果集是一张虚拟表。
SELECT 要查询的列名称 FROM 表名称
WHERE 限定条件 /行条件/
GROUP BY grouping_columns /对结果分组/
HAVING condition /分组后的行条件/
ORDER BY sorting_columns /对结果分组/
LIMIT offset_start, row_count /结果限定/
案例:
#1> 创建学生表并添加数据
#创建表 stu
CREATE TABLE stu (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);
#添加数据
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
#2>创建雇员表并添加数据
#创建雇员表
CREATE TABLE emp2(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm decimal(7,2),
deptno INT
);
#添加数据
INSERT INTO emp2 values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp2 values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp2 values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp2 values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp2 values(7654,'MARTIN','SALESMAN',7698,'1981-09- 28',1250,1400,30);
INSERT INTO emp2 values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp2 values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp2 values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp2 values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp2 values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp2 values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
#3> 创建部门表并添加数据
#创建部门表
CREATE TABLE dept(
deptno INT,
dname varchar(14),
loc varchar(13)
);
#添加数据
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
#查所有列
SELECT * FROM 表名;
#查询指定列
SELECT 列1,列2,.. FROM 表名;
在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:=、!=、<>、<、<=、>、>=; BETWEEN…AND; IN(set); IS NULL; AND;OR; NOT;
举例:
#查询学生表stu中,性别为女,并且年龄50以内的记录
SELECT * FROM stu WHERE gender='female' AND age<50;
#查询学生表stu中,学号为S_1001,或者姓名为liSi的记录
SELECT * FROM stu WHERE sid ='S_1001' OR sname='liSi';
#查询学生表stu中,学号为S_1001,S_1002,S_1003的记录
SELECT * FROM stu WHERE sid IN ('S_1001','S_1002','S_1003');
#查询学生表stu中,学号不是S_1001,S_1002,S_1003的记录
SELECT * FROM tab_student WHERE sid NOT IN('S1001','S1002','S_1003');
#查询年龄为null的记录
SELECT * FROM stu WHERE age IS NULL;
#查询年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age>=20 AND age<=40;
#列名 between 开始值 and 结束值;//注意:1.开始值<结束值 2.包含临界值的
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
#查询性别非男的学生记录
SELECT * FROM stu WHERE gender!='male';
SELECT * FROM stu WHERE gender<>'male';
SELECT * FROM stu WHERE NOT gender='male';
#查询姓名不为null的学生记录
SELECT * FROM stu WHERE NOT sname IS NULL;
SELECT * FROM stu WHERE sname IS NOT NULL;
列名 like ‘表达式’ //表达式必须是字符串
通配符:
_: 任意一个字符
%:任意0~n个字符,‘张%’
#查询姓名由3个字构成的学生记录
SELECT * FROM stu WHERE sname LIKE '___';
#查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '____i';
#查询姓名以“z”开头的学生记录
SELECT * FROM stu WHERE sname LIKE 'z%';
#查询姓名中第2个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '_i%';
#查询姓名中包含“a”字母的学生记录
SELECT * FROM stu WHERE sname LIKE '%a%';
两行或两行以上记录中系列的上的数据都相同。
如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用 DISTINCT。
#SELECT DISTINCT 字段名 FROM 表名;
SELECT DISTINCT sal FROM emp;
# SELECT *,列名1+列名2 FROM 表名;
SELECT *,sal+comm FROM emp;
# 若 comm列(列2)中有NULL,任何东西 + NULL 结果均为 NULL,把 NULL转成数值0的函数 IFNULL()
# SELECT *,列名1+IFNULL(列名2,0) FROM 表名;
SELECT *,sal+IFNULL(comm,0) FROM emp;
如(2)中查询出现 sal+IFNULL(comm,0)列,给他一个别名 total :
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
# 也可省略 AS 关键字:
SELECT *,sal+IFNULL(comm,0) total FROM emp;
order by 列名 asc/desc;
//asc 升序 desc 降序 默认不写的话是升序
例如:
#查询所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY age ASC;
SELECT * FROM stu ORDER BY age;
#查询所有学生记录,按年龄降序排序
SELECT * FROM stu ORDER BY age DESC;
案例如下
#查询emp表中记录数
SELECT COUNT(*) AS cnt FROM emp;
#查询emp表中有佣金的人数:count()函数是comm列,则只统计comm列非NULL的行数。
SELECT COUNT(comm) cnt FROM emp;
#查询emp表中月薪大于2500的人数:
SELECT COUNT(*) FROM emp WHERE sal > 2500;
#统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(COMM,0) > 2500;
#查询有佣金的人数,以及有领导的人数:
SELECT COUNT(comm), COUNT(mgr) FROM emp;
#SUM 和 AVG
#需要纵向求和时使用sum()函数
#查询所有雇员月薪和
SELECT SUM(sal) FROM emp;
#查询所有雇员月薪和,以及所有雇员佣金和
SELECT SUM(SAL),SUM(IFNULL(comm,0)) FROM emp;
#查询所有雇员月薪+佣金和
SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
#统计所有员工平均工资
SELECT AVG(sal) FROM emp;
#MAX 和 MIN
#查询最高工资和最低工资
SELECT MAX(sal),MIN(sal) FROM emp;
GROUP BY 子句
如果查询语句中有分组操作,则select后面能添加的只能是聚合函数和被分组的列名。
#查询每个部门的部门编号和每个部门的工资和
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno;
#查询每个部门的部门编号和每个部门的人数
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
#查询每个部门的部门编号以及每个部门工资大于1500的人数
SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;
HAVING 子句
#查询工资总和大于9000的部门编号以及工资和
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal)>9000;
#多列分组
#统计出stu表中每个班级的男女生各多少人
SELECT gradename,gender,COUNT(*) FROM stu GROUP BY gradename,gender;
限定查询结果的起始行,以及总行数。起始行从0开始,即第一行开始!
limit 开始下标,显示条数;//开始下标从0开始
limit 显示条数;//表示默认从0开始获取数据
#查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0,5;
#查询10行记录,起始行从3开始
SELECT * FROM emp LIMIT 3,10;
若一页的记录为10条,要查看第3页记录:
第一页记录起始行为0,一共查询10行; limit 0,10
第二页记录起始行为10,一共查询10行;limit 10,10
第三页记录起始行为20,一共查询10行; limit 20,10
pageIndex 页码值 , pageSize 每页显示条数
limit (pageIndex-1)*pageSize, pageSize;
查询语句的书写顺序
select – from- where- groupby- having- order by-limit
查询语句的执行顺序
from - where -group by -having - select - order by-limit