Jupyer itself isn’t really related to virtual environments, it’s just a well known interactive interpreter for Python (and others). Virtual environments are a way of controlling versions and package dependency for your Projects. Each one is like it’s own little bubble that is, ideally, not affected by any system changes and can run a different version of Python and perhaps more importantly the same for any site-packages a.k.a. all the useful third-party packages (numpy/pandas/matplotlib etc. etc.) you end up using daily.
Practically you’d be creating a virtual envionment and then installing the Jupyter packages (and any others e.g. matplotlib) within this environment. By isolating it you can manage your project dependencies in a much easier manner and have confidence that it won’t suddenly break because that new package you installed to deal with database requests on a different project hasn’t suddenly overwritten some of the packages Jupyter needs to run.
Apologies for replying with a link but I think it’ll be more helpful than what I can manage in a single reply-