MySQL基础学习
1.练习服务器地址
云服务器地址:39.106.41.11 student/gloryroad 端口:3306
数据库装在的机器:是数据库服务器
你想连接数据库服务器:
a.需要一个客户端软件 (类似于C/S结构),图形界面的连接方式
客户端:sqlyog 或者 安卓mysql有个自动的命令行客户端
b.命令行的连接方式: mysql -h172.20.43.87 -ustudent –pgloryroad
本机数据库:
(本机:127.0.0.1或localhost)
mysql root 密码:QingQing0919
端口:3306
2. 一台数据库上可以装多个数据库的实例吗?
可以的,只是比较麻烦,装个多个不同的实例需要通过不同的端口去使用,只装一个的话默认端口就是3306.
3. 数据库操作
启动数据库
service gloryroad START
关闭数据库
service gloryroad STOP
重启数据库
service gloryroad restart
USE qing; 使用数据库
CREATE TABLE demo(id INT(11)); 创建表
CREATE TABLE NAME(id INT(11));
SHOW TABLES; 查看表
DROP TABLE demo; 删除表
SHOW TABLES;
CREATE USER 'stu'@'%' IDENTIFIED BY "Qing" 创建了一个数据库用户
#stu是用户名,%是哪个ip段可以使用,Qing是该用户的密码
CREATE USER 'gloryroad'@'localhost'IDENTIFIED BY "Qing2" 创建了一个本地使用的数据库用户
FLUSH PRIVILEGES; 刷新,把权限刷新一下(一般创建了用户之后用)
CREATE DATABASE wenqing; 创建数据库
SHOW DATABASES wenqing; 查看数据库
DROP DATABASE; 删除数据库
相关操作命令:
GRANT
SELECT
INSERT
UPDATE
DELETE
CREATE
DROP
SELECT DATABASE(); 查询当前在使用哪些库
SELECT USER(); 查询当前登录的哪个用户
SELECT * FROM qing; 查询表
DESC id; 降序查看id
4. 创建表:
CREATE TABLE book(
id INT NOT NULL AUTO_INCREMENT, #非空,字段自增
book_name VARCHAR(100) NOT NULL, #char不可变 varchar可变,存储实际长度,省空间但费时
boook_author VARCHAR (40) NOT NULL,
price INT(10) DEFAULT 0,#默认为0
publish_date DATE,
PRIMARY KEY(id) #使用id作为主键
)ENGINE=INNODB DEFAULT CHARSET=utf8; #innodb只有它支持事务 表的编码是utf-8
SHOW TABLES
自己练习创建一个表:
CREATE TABLE people(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
sex VARCHAR(4) NOT NULL,
weight DECIMAL (5,2) DEFAULT 45, decimal是小数,5,2表示 3位整数2位小数
high INT(5) DEFAULT 160,
birth DATE,
PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
SHOW TABLES;
- DROP TABLE book;删除表
- 插入数据
USE people;
INSERT INTO people(NAME,sex,weight,high,birth)
VALUES("林治彭","男",75,173,"1983-10-19"),
("齐文清","女",43,153,"1992-10-04");
SELECT * FROM people; 查看表数据
5. 查表中对应字段
USE people;
SELECT id,NAME FROM people;
6. 使用别名查询表中字段
USE people;
SELECT id 序号,NAME 姓名 FROM people;
不影响原有数据库内容
7.精确查询
USE people;
SELECT id 序号,NAME 姓名 FROM people WHERE NAME = "齐文清";
8. or 或 查询
USE people;
SELECT id 序号,NAME 姓名 FROM people WHERE NAME = "齐文清" OR id = 1;
9.and 与 查询 !非
USE people;
SELECT id 序号,NAME 姓名 FROM people WHERE NAME ="林治彭" AND id != 1;
10. 升序、降序
USE people;
SELECT id 序号,NAME 姓名 FROM people WHERE NAME ="林治彭" ORDER BY id ;(升序)
USE people;
SELECT id 序号,NAME 姓名 FROM people WHERE NAME ="林治彭" ORDER BY id DESC;(降序)
11. 查看限定条数
USE people;
SELECT id 序号,NAME 姓名 FROM people WHERE NAME ="林治彭" ORDER BY id LIMIT 2;
12. 查看指定条后面的一条
USE people;
SELECT id 序号,NAME 姓名 FROM people WHERE NAME ="林治彭" ORDER BY id LIMIT 2,1;
相当于查看的第三条(2,1表示查看第二条后面的一条)
13. 模糊查询,用%
USE people;
SELECT id 序号,NAME 姓名 FROM people WHERE NAME LIKE "%林%";
但是模糊查询比较耗费性能
14. 统计查询处的结果条数,count函数
USE people;
SELECT COUNT(*) 总数 FROM people WHERE NAME LIKE "%林%";
在一些大的数据量时用这个是非常耗费性能的,最后不要这么做,如果需要就在前端处理,前端可以做分布式,尽量不要用数据库做这个事情。
15. 增删改查大练习
创建表
CREATE TABLE author(
id INT NOT NULL AUTO_INCREMENT,
author_name VARCHAR(100) NOT NULL,
salary INT(10) DEFAULT 0,
PRIMARY KEY(id)
)ENGINE = INNODB DEFAULT CHARSET=utf8;
SHOW TABLES
16. 插入数据
USE people;
INSERT INTO people(NAME,sex,weight,high,birth)
VALUES ("李老师","女",50,160,"1984-10-11"),
("吴老师","男",70,165,"1977-10-29");
SELECT * FROM people;
17. 子查询:两个表是关联的,通过一个语句可以查出两个表中的内容
SELECT * FROM people WHERE NAME IN(SELECT author_name FROM author);
DESC NAME;
18. 内连接
SELECT a.* FROM author a INNER JOIN people b
ON a.`author_name` = b.`name`;
a和b是利用了表别名,inner join实现内连接,使得两个表关联在一起。
SELECT DISTINCT a.* FROM author a INNER JOIN people b
ON a.`author_name` = b.`name`;
dictinct是去重
内连接是把两个表相同的全部做扫码,这样耗费性能。
19. 左链接
SELECT a.*,b.`name` FROM author a LEFT JOIN people b
ON a.`author_name` = b.`name`;
左连接的好处是把所有数据都显示出来,以左表为准,左表中数据存在即出现在结果里
20. 右连接
SELECT b.*,a.author_name FROM people b RIGHT JOIN author a
ON b.`name`= a.`author_name`;
21. 全连接
不存在
22. 分组
SELECT COUNT(*) SUM,author_name FROM author GROUP BY author_name
HAVING SUM >=1;
把超过1个相同名字的老师筛选出来,group by分组
sum统计个数,having条件
23. 练习:把工资大于300000的筛选出来
SELECT author_name,salary FROM author
HAVING salary>=300000;
24. 更新数据 update
SELECT * FROM author;
UPDATE author SET author_name = "齐老师"
WHERE author_name = "林老师";
SELECT * FROM author ;
25. 删除表
drop:删除的干干净净,把表结构也删除了
trunct:把表中所有数据全删光,不删除表结构
delete:直接删除表中数据,需要有where条件时可以用这个
DELETE FROM author WHERE author_name = "吴老师";
SELECT * FROM author;
不加条件那就全部删除了
drop author
26. union和union all ,把两个表中的字段合成一个字段
SELECT author_name FROM author UNION SELECT NAME FROM people;
SELECT author_name FROM author UNION ALL SELECT NAME FROM people;
27. 事物
SET autocommit =0;
BEGIN;
DELETE FROM author;
SELECT * FROM author;
ROLLBACK; #回滚事物
BEGIN; 开始一个事物
DELETE FROM author;
SELECT * FROM author;
COMMIT;# 执行后全部生效,提交
commit和rollback之间的就是事物